web-dev-qa-db-ja.com

Excel VBA範囲内の最後の行を検索

最後の行を見つけるのに少し苦労しています。

私がやろうとしているのは、列「A」の最後の行を見つけ、それを使用して範囲内の最後の行を見つけることです。

データの例:

Example of data

 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がこれらのセルにデータがあると考えない理由がわかりませんか?

うまくいけば、私はそれを説明しているので、従うことができます、そうでない場合は尋ねてください。

必要に応じて、必要に応じて完全なコードをアップロードできます。お知らせください。

任意の助けをいただければ幸いです。

5
atame

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
9
Shai Rado

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

1
Niclas
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
1
ArindamD
LR_wbSelect = ThisWorkbook.Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row
1
Punith GP

このコードが役立つことを願っています!

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
1
Rockstar
    '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)
0

これを行おうとすることの問題は、セルに数式が含まれている場合、数式が空白を返していても、Excelはそれが設定されていると判断することです。

0
atame

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
0
user6432984

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

これが役立つと思うなら、彼の答えに賛成してください。

0
cssyphus