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:
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.
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
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.
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
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
LR_wbSelect = ThisWorkbook.Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row
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
'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)
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.
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
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.