wake-up-neo.com

Excel VBA Letzte Zeile im Bereich suchen

ich habe ein wenig Mühe, die letzte Reihe zu finden.

Was ich versuche zu tun ist, die letzte Zeile in der Spalte "A" zu finden, und dann die letzte Zeile innerhalb eines Bereichs zu finden.

Beispiel für Daten:

 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

Ich verwende die letzte Zeile in Spalte "A", da die Daten von Zeile 29 abwärts immer die gleiche Länge haben. Die in Spalte "B" von Zeile 29 verwendeten Zeilen können eine unterschiedliche Anzahl von Zeilen sein.

Also versuche ich, LR_wbSelect in der Spalte "A" zu verwenden, um meine letzte Zeile zu erhalten, und dann innerhalb von LR_wbSelectNew, um sie als Ausgangspunkt zu verwenden.

Dies funktioniert, wenn die Spalte, die ich auf "A" gesetzt habe, LR_wbSelectNew die Zeile "17" anzeigt, aber wenn ich die Spalte in LR_wbSelectNew in "B" ändere, wird nicht die korrekte letzte Zeile von "18" angezeigt.

Ich kann die Spalte in "C, D, E, F" ändern und der Code funktioniert einwandfrei, aber die einzige Spalte, die ich verwenden kann, ist "B", da sie immer Daten enthält, in denen der Rest der Zeile enthalten könnte eine leere Zelle.

Nach einigen Tests auf dem Arbeitsblatt werden durch Drücken von CRTL & Up am letzten Zeichenpunkt von LR_wbSelect Spalte "B" die Daten in den Zeilen ignoriert und in die Zeile verschoben, in der Daten gefunden werden. Ich kann keinen Grund finden, warum Excel nicht glaubt, dass sich in diesen Zellen Daten befinden?

Hoffentlich habe ich das erklärt, damit ihr folgen könnt, wenn nicht, bitte fragen.

Bei Bedarf kann ich den vollständigen Code hochladen, wenn er benötigt wird, lass es mich wissen.

Jede Hilfe wäre dankbar.

3
atame

Bei der Suche nach LastRow (in Spalte B) gibt es mehrere Ergebnisse und Methoden.

Bei Verwendung von Cells(.Rows.Count, "B").End(xlUp).Row erhalten Sie die letzte Zeile mit Daten in Spalte B (Zeilen mit Leerzeichen werden ignoriert und gehen ganz nach unten).

Beim Benutzen:

 With wbshtSelect.Range("B10").CurrentRegion
     LR_wbSelectNew = .Rows(.Rows.Count).Row
 End With

Sie suchen nach der letzten Zeile mit Daten in Spalte B der CurrentRegion, die mit Zelle B10 beginnt, bis zur ersten Zeile ohne Daten (sie endet in der ersten Zeile mit leerer Zeile).

Vollständiger Code:

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 : Code sucht nach der letzten Zeile nach Zellen mit Werten (leere Zellen mit Formeln werden ignoriert).

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

Ich bin hier hergekommen, um nach einer Möglichkeit zu suchen, die letzte Reihe in einem nicht zusammenhängenden Bereich zu finden. Bei den meisten Antworten wird jeweils nur eine Spalte geprüft. Daher habe ich verschiedene Funktionen erstellt, um dieses Problem zu lösen. Ich gebe jedoch zu, dass Shai Rados Antwort im Wesentlichen dieselbe ist wie meine .Find()-Implementierung.

Implementierung 1 - Verwendet Range().End(xlUp) in jeder Spalte

Function LastRowInRange_xlUp(ByVal rng As Range) As Long

    Dim lastRowCurrent As Long
    Dim lastRowBest As Long

    'loop through columns in range
    Dim i As Long
    For i = rng.Column To rng.Column + rng.Columns.count - 1
        If rng.Rows.count < Rows.count Then
            lastRowCurrent = Cells(rng.row + rng.Rows.count, i).End(xlUp).row
        Else
            lastRowCurrent = Cells(rng.Rows.count, i).End(xlUp).row
        End If

        If lastRowCurrent > lastRowBest Then
            lastRowBest = lastRowCurrent
        End If
    Next i

    If lastRowBest < rng.row Then
        LastRowInRange_xlUp = rng.row
    Else
        LastRowInRange_xlUp = lastRowBest
    End If

End Function

Implementierung 2 - Verwendet Range().Find() in umgekehrter Reihenfolge

Function LastRowInRange_Find(ByVal rng As Range) As Long

    'searches range from bottom up looking for "*" (anything)
    Dim rngFind As Range
    Set rngFind = rng.Find( What:="*", _
                            After:=Cells(rng.row, rng.Column), _
                            LookAt:=xlWhole, _
                            LookIn:=xlValues, _
                            SearchOrder:=xlByRows, _
                            SearchDirection:=xlPrevious)

    If Not rngFind Is Nothing Then
        LastRowInRange_Find = rngFind.row
    Else
        LastRowInRange_Find = rng.row
    End If

End Function

Implementierung 3 - Durchläuft ein Array in umgekehrter Reihenfolge

Function LastRowInRange_Array(ByVal rng As Range) As Long

    'store range's data as an array
    Dim rngValues As Variant
    rngValues = rng.Value2

    Dim lastRow As Long

    Dim i As Long
    Dim j As Long

    'loop through range from left to right and from bottom upwards
    For i = LBound(rngValues, 2) To UBound(rngValues, 2)                'columns
        For j = UBound(rngValues, 1) To LBound(rngValues, 1) Step -1    'rows

            'if cell is not empty
            If Len(Trim(rngValues(j, i))) > 0 Then
                If j > lastRow Then lastRow = j

                Exit For
            End If

        Next j
    Next i

    If lastRow = 0 Then
        LastRowInRange_Array = rng.row
    Else
        LastRowInRange_Array = lastRow + rng.row - 1
    End If

End Function

Ich habe nicht getestet, welche dieser Implementierungen am schnellsten bei großen Datensätzen funktioniert, aber ich würde mir vorstellen, dass der Gewinner _Array wäre, da er nicht jede Zelle auf dem Blatt einzeln durchläuft, sondern die im Speicher gespeicherten Daten durchläuft. Ich habe jedoch alle 3 für Abwechslung :)


Wie benutzt man

Um diese Funktionen zu verwenden, legen Sie sie in Ihr Code-Sheet/-Modul ab, geben einen Bereich als Parameter an und geben dann die "niedrigste" gefüllte Zeile innerhalb dieses Bereichs zurück.

So können Sie eines von ihnen verwenden, um das angefragte anfängliche Problem zu lösen: 

Sub answer()

    Dim testRange As Range
    Set testRange = Range("A1:F28")

    MsgBox LastRowInRange_xlUp(testRange)
    MsgBox LastRowInRange_Find(testRange)
    MsgBox LastRowInRange_Array(testRange)

End Sub

Jeder von ihnen wird 18 zurückgeben.

1
Marcucciboy2

Wenn Ihr wbshtSelect als Arbeitsblatt definiert ist und Sie das definierte Arbeitsblatt mit set definiert haben, können Sie dieses verwenden.

 Dim LastRow As Long

 wbshtSelect.UsedRange ' Refresh UsedRange
 LastRow = wbshtSelect.UsedRange.Rows(wbshtSelect.UsedRange.Rows.Count).Row

Ansonsten schauen Sie hier http://www.ozgrid.com/VBA/ExcelRanges.htm

1
Niclas
LR_wbSelectNew = wbshtSelect.cells(LR_wbSelect, "B").End(xlUp).Row

Warum verwenden Sie "LR_wbSelect" als Zeilenzähler? Wenn Sie die letzte Zeile der Spalte 'B' kennen möchten, sollten Sie Rows.count verwenden

Rows.count -> Gibt die maximale Anzahl von Zeilen zurück (1048576 für Excel 2007 und höher) End (xlUp) -> Bewegt den Zeiger nach oben zur letzten verwendeten Zeile

So, Zellen (Rows.count, "A"). End (xlUp) .Row -> Hiermit wird der Zeiger in die letzte Zeile verschoben, wenn die Spalte "A" gedrückt wird (als ob Sie bei der Auswahl der Zelle A1048576 die Tasten Strg + Aufwärts drücken).

Verwenden Sie Rows.count, um auch die letzte Zeile für Spalte 'B' auszuwählen. Wenn Sie bestimmte Anforderungen bezüglich LR_wbSelect haben, geben Sie dies bitte an.

Wenn Sie die letzte in einem Arbeitsblatt verwendete Zeile wissen möchten, können Sie alternativ die folgende verwenden:

mySheet.Cells.SpecialCells(xlCellTypeLastCell).Row
1
ArindamD
LR_wbSelect = ThisWorkbook.Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row
1
Punith

Hoffe, dieses Stück Code hilft!

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

Das Problem beim Versuch, dies zu tun, besteht darin, dass, wenn eine Zelle eine Formel enthält, Excel denkt, dass es gefüllt ist, auch wenn die Formel ein Leerzeichen zurückgibt.

0
atame

Range().End bringt Sie zum Ende eines Codeblocks. Wenn die Startzelle leer ist, wird die erste oder letzte Zelle angezeigt. Wenn die Zellen nicht leer sind, gelangen Sie zur zuletzt verwendeten Zelle. Aus diesem Grund müssen Sie testen, ob die Zelle in Spalte B bestimmen soll, ob LR_wbSelectNew als letzte Zeile verwendet werden soll. 

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

Dieser Code definiert einen Zielbereich, der sich von A1 bis zur letzten Zeile in Spalte a - 22 und 10 Spalten erstreckt.

Dim Target As Range
With wbshtSelect
    Set Target = .Range("A1", .Cells(Rows.Count, "A").End(xlUp).Offset(-22)).Resize(, 10)
End With
0
user6432984

Die erste Lösung von Shai Rado ist eine großartige , aber für einige braucht es vielleicht ein bisschen mehr Ausarbeitung:

 Dim rngCurr, lastRow
 rngCurr = wbshtSelect.Range("B10").CurrentRegion
 lastRow = rngCurr.Rows(rngCurr.Rows.Count).Row

Wenn Sie die letzte Zeile des gesamten Arbeitsblatts kennen möchten:

 Dim rngCurr, lastRow
 rngCurr = Range("A1").CurrentRegion
 lastRow = rngCurr.Rows(rngCurr.Rows.Count).Row

Wenn Sie dies als hilfreich empfinden, bestätigen Sie seine Antwort.

0
gibberish