最後の行を見つけるのに少し苦労しています。
私がやろうとしているのは、列「A」の最後の行を見つけ、それを使用して範囲内の最後の行を見つけることです。
データの例:
1) LR_wbSelect = wbshtSelect.cells(Rows.count, "A").End(xlUp).Row - 22
2) LR_wbSelectNew = wbshtSelect.cells(LR_wbSelect, "A").End(xlUp).Row
行29からのデータは常に同じ長さになるため、列Aの最後の行を使用しています。行29の列Bで使用される行の行数はさまざまです。
だから私はLR_wbSelect
を列「A」で使用して、最後の開始行を取得し、LR_wbSelectNew
内でそれを検索の開始点として使用しようとしています。
これは、列「A」に設定すると、LR_wbSelectNew
が「17」の行を返しますが、LR_wbSelectNew
の列を「B」に変更すると、正しい最後の行を返しません。 「18」。
列を「C、D、E、F」に変更できますが、コードは正常に機能しますが、使用できる列は「B」のみです。これは、常にその中にデータがあり、その行の残りが空白のセル。
シートでテストを行った後、LR_wbSelect
列の最後のポイントから[CRTL&Up]を押すと、「B」列のデータが無視され、見つかった行に移動します。データ。 Excelがこれらのセルにデータがあると考えない理由がわかりませんか?
うまくいけば、私はそれを説明しているので、従うことができます、そうでない場合は尋ねてください。
必要に応じて、必要に応じて完全なコードをアップロードできます。お知らせください。
任意の助けをいただければ幸いです。
LastRow(B列)を検索すると、複数の結果とメソッドがあります。
Cells(.Rows.Count, "B").End(xlUp).Row
を使用すると、列Bのデータを持つ最後の行が取得されます(スペースのある行は無視され、最後まで下がります)。
使用する場合:
With wbshtSelect.Range("B10").CurrentRegion
LR_wbSelectNew = .Rows(.Rows.Count).Row
End With
CurrentRegion
の列Bにデータがある最後の行を検索します。これは、データのない最初の行まで(セルが空の行で停止します)、セルB10から始まります。
完全なコード:
Sub GetLastRow()
Dim wbshtSelect As Worksheet
Dim LR_wbSelectNew As Long
' modify "Sheet2" to your sheet's name
Set wbshtSelect = Sheets("Sheet2")
' find last row with data in Column B
With wbshtSelect
LR_wbSelectNew = .Cells(.Rows.Count, "B").End(xlUp).Row
End With
' for debug only
Debug.Print LR_wbSelectNew ' >>result 31
' find last row with data in Column B at current regioun starting at cell B10
With wbshtSelect.Range("B10").CurrentRegion
LR_wbSelectNew = .Rows(.Rows.Count).Row
End With
' for debug only
Debug.Print LR_wbSelectNew ' >> result 18
End Sub
Edit1:コードは、値を持つセルの最後の行を検索します(内部の数式を含む空白のセルは無視します)。
Sub GetLastRow()
Dim wbshtSelect As Worksheet
Dim LR_wbSelectNew As Long
' modify "Sheet2" to your sheet's name
Set wbshtSelect = Sheets("Sheet2")
' find last row with data in Column B at current regioun starting at cell B10
With wbshtSelect.Range("B10").CurrentRegion
LR_wbSelectNew = .Rows(.Rows.Count).Row
End With
Dim Rng As Range
Set Rng = wbshtSelect.Range("B10:B" & LR_wbSelectNew)
' find last row inside the range, ignore values inside formulas
LR_wbSelectNew = Rng.Find(What:="*", _
After:=Range("B10"), _
LookAt:=xlPart, _
LookIn:=xlValues, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
' for debug
Debug.Print LR_wbSelectNew ' << result 18 (with formulas in the range)
End Sub
WbshtSelectがワークシートとして定義されており、特定のワークシートを定義するためにsetを使用している場合、これを使用できます。
Dim LastRow As Long
wbshtSelect.UsedRange ' Refresh UsedRange
LastRow = wbshtSelect.UsedRange.Rows(wbshtSelect.UsedRange.Rows.Count).Row
それ以外の場合は、こちらをご覧ください http://www.ozgrid.com/VBA/ExcelRanges.htm
LR_wbSelectNew = wbshtSelect.cells(LR_wbSelect, "B").End(xlUp).Row
行カウンタとして「LR_wbSelect」を使用しているのはなぜですか?列「B」の最後の行を知りたい場合は、Rows.countを使用する必要があります
Rows.count->最大行数を返します(Excel 2007以降では1048576)End(xlUp)->ポインタを最後に使用した行に移動します
したがって、cells(Rows.count、 "A")。End(xlUp).Row->これにより、列 'A'の場合、ポインタが最後の行に移動します(A1048576セルが選択済み)
したがって、Rows.countを使用して、列「B」の最後の行も選択します。 LR_wbSelectに関連する特定の要件がある場合は、それを明記してください。
または、シートで使用されている最後の行を知りたい場合は、以下を使用できます。
mySheet.Cells.SpecialCells(xlCellTypeLastCell).Row
LR_wbSelect = ThisWorkbook.Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row
このコードが役立つことを願っています!
Sub LastRowInOneColumn()
'Find the last used row in a Column: column A in this example
Dim LastRow As Long
With ActiveSheet
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
End With
MsgBox LastRow
End Sub
'This is sure method to find or catch last row in any column even 'if some cell are blank in-between. (Excel-2007)`
'This works even if sheet is not active
'mycol is the column you want to get last row number
for n=1048575 to 1 step -1
myval=cells(n,mycol)
if myval<>"" then
mylastrow=n 'this is last row in the column
exit for
end if
next
ret=msgbox("Last row in column-" & mycol & "is=" & mylastrow)
これを行おうとすることの問題は、セルに数式が含まれている場合、数式が空白を返していても、Excelはそれが設定されていると判断することです。
Range().End
は、コードブロックの最後に移動します。開始セルが空の場合、最初に使用されたセルまたは最後のセルが表示されます。セルが空ではない場合、最後に使用したセルに移動します。このため、列Bのセルが最後の行としてLR_wbSelectNew
を使用するかどうかを判断するかどうかをテストする必要があります。
With wbshtSelect
LR_wbSelect = .Cells(Rows.Count, "A").End(xlUp).Row - 22
If .Cells(LR_wbSelect, "B") <> "" Then
LR_wbSelectNew = LR_wbSelect
Else
LR_wbSelectNew = .Cells(LR_wbSelect, "B").End(xlUp).Row
End If
End With
このコードは、A1から列a-22の最後の行までおよび10列まで拡張するターゲット範囲を定義します。
Dim Target As Range
With wbshtSelect
Set Target = .Range("A1", .Cells(Rows.Count, "A").End(xlUp).Offset(-22)).Resize(, 10)
End With
Shai Radoの最初の解決策は素晴らしいものですですが、一部の人にとってはもう少し手の込んだものが必要かもしれません:
Dim rngCurr, lastRow
rngCurr = wbshtSelect.Range("B10").CurrentRegion
lastRow = rngCurr.Rows(rngCurr.Rows.Count).Row
ワークシート全体で最後に使用された行を知りたい場合:
Dim rngCurr, lastRow
rngCurr = Range("A1").CurrentRegion
lastRow = rngCurr.Rows(rngCurr.Rows.Count).Row
これが役立つと思うなら、彼の答えに賛成してください。