Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Letzte gefüllte Zeile in List.Object

Letzte gefüllte Zeile in List.Object
26.06.2013 08:11:44
Nette13
Hallo zusammen,
ich habe ein kniffeliges Problem. Für mich zumindest. Ich möchte in einem List.Object die letzte gefüllte Zeile in einer Spalte ermitteln.
Aber mit diesem Code bringt er mich immer ans Tabellenende.
lr = Cells(Rows.Count, suchspalte).End(xlUp).Row
Ich muss in diesen Code irgendwie das Tabellenobject einbauen, aber weiß leider nicht wie. Hat jemand von Euch eine Idee?
Ich sage schon mal Danke.
Gruß
Annette

Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Letzte gefüllte Zeile in List.Object
26.06.2013 08:32:13
Tino
Hallo,
was meinst Du mit List.Object?
Dein Codeschnipsel weist auf die letzte Zeile in der suchspalte in einer Tabelle.
(Tabelle kommt drauf an wo der Code steht)
Die letzte Spalte in einer Zeile müsste so gehen.
lr = Cells(suchZeile,Columns.Count).End(xltoleft).column
Gruß Tino

Anzeige
AW: Letzte gefüllte Zeile in List.Object
26.06.2013 08:37:43
Luschi
Hallo nette Anette,
so sollte es auch bei Dir funktionieren:

Sub test1()
MsgBox lastRow_oList("Tabelle1")
End Sub
Function lastRow_oList(xName As String)
Dim oList As ListObject, n As Long
Set oList = Me.ListObjects("Tabelle1")
n = oList.DataBodyRange.SpecialCells(xlCellTypeLastCell).Row
Set oList = Nothing
lastRow_oList = n
End Function
Gru0 von Luschi
aus klein-Paris

Anzeige
AW: Letzte gefüllte Zeile in List.Object
26.06.2013 08:50:26
Luschi
Hallo nette Anette,
um es variabler zu mac hen sollte man die Funktion in ein Modul stecken und dann sieht das so _ aus:

Sub test1()
MsgBox lastRow_oList("Tabelle1", "Liste_01")
End Sub
Function lastRow_oList(xTabName As String, xListName As String)
lastRow_oList = ThisWorkbook.Worksheets(xTabName).ListObjects(xListName).DataBodyRange. _
SpecialCells(xlCellTypeLastCell).Row
End Function
wobei 'Tabelle1' der Tabellenname und 'Liste_01' der Name des ListObjektes ist.
Gruß von Luschi
aus klein-Paris

Anzeige
AW: Letzte gefüllte Zeile in List.Object
26.06.2013 09:02:23
hary
Moin Luschi
Zum Verstehen.
Hab ich auch probiert,aber er zeigt mir mit:
SpecialCells(xlCellTypeLastCell).Row
die nur die letzte Zeile an(5) wenn z.B. von 5 Zeilen nur die ersten 3 belegt sind.
Hab es so geloest:
With Worksheets("Tabelle1").ListObjects("Tabelle1").DataBodyRange
MsgBox .Cells(.Rows.Count, 1).End(xlUp).Row
End With

Muss doch aber auch gehen die 1 zu ersetzten mit der Spaltenueberschrift.
So ganz steig ich noch nicht durch beim Tabellentool.
gruss hary

Anzeige
AW: Letzte gefüllte Zeile in List.Object
26.06.2013 09:47:41
Luschi
Hallo Harry,
Du hast Recht, wenn man das Listobjekt mit der Maus durch ziehen am Rahmen erweitert,
gibt meine Funktion nur die letzte beschreibene Zellzeile zurück, deshalb so:

Sub test1()
MsgBox lastRow_oList("Tabelle2", "meineListe_2")
End Sub
Function lastRow_oList(xTabName As String, xListName As String) As Long
Dim oList As ListObject
Dim adr As String, n As Long
Set oList = ThisWorkbook.Worksheets(xTabName).ListObjects(xListName)
adr = Split(oList.Range.Address, ":", -1, vbTextCompare)(1)
Set oList = Nothing
lastRow_oList = ThisWorkbook.Worksheets(xTabName).Range(adr).Row
End Function
Gruß von Luschi
aus klein-Paris
PS: Auch Dein Versuch bringt unter den gegebenen Umständeen nicht das korrekte Ergebnis.

Anzeige
AW: Letzte gefüllte Zeile in List.Object
26.06.2013 09:52:05
Nette13
Vielen lieben Dank Euch allen. Ich habe es letztendlich so gelöst wie Luschi. Das erschien mir am leichtesten verständlich.
VBA kann das Leben so viel einfacher machen... Danke nochmals.
Gruß
Eure nette Annette

AW: Letzte gefüllte Zeile in List.Object
26.06.2013 10:07:30
Luschi
Hallo Harry,
hier noch eine Antwort auf Deine eigentliche Frage:

Function firstCol_oList(xTabName As String, xListName As String) As Long
firstCol_oList = ThisWorkbook.Worksheets(xTabName).ListObjects(xListName).Range.Cells(1, 1). _
Column
End Function
Sub test3()
MsgBox firstCol_oList("Tabelle2", "meineListe_2")
End Sub
Gruß von Luschi
aus klein-Paris

Anzeige
AW: Ich meinte so
26.06.2013 10:41:48
hary
Moin Luschi
Das passt so doch nicht, ich brauche Zeile 5. Hier mit dem ersten Code.
Userbild
gruss hary

verdacht
26.06.2013 11:21:50
Tino
Hallo,
ich nehme an dies verhält sich wie mit dem UsedRange/Benutzter Bereich in einer normalen Tabelle.
Teste mal diese Variante
Sub Beispiel()
Dim oList As ListObject, rngLetzte As Range
Set oList = Tabelle1.ListObjects(1)
Set rngLetzte = FindLetzte(oList.Range)
MsgBox rngLetzte.Row
End Sub

Function FindLetzte(rngRange As Range) As Range
Dim LRow As Long, LCol As Long
Dim A As Long
 
 With rngRange
   On Error Resume Next
        'Finde Zeile 
        LRow = .Find("*", , xlValues, xlWhole, xlByRows, xlPrevious, False, False).Row
        LRow = Application.Max(LRow, .Find("*", , xlFormulas, xlWhole, xlByRows, xlPrevious).Row)
        If LRow = 0 Then LRow = 1
   
        'Finde Spalte 
        For A = .Columns(.Columns.Count).Column To .Columns(1).Column Step -1
              LCol = .Columns(A).Find("*", , xlValues, xlWhole, xlByRows, xlPrevious).Column
              LCol = Application.Max(LCol, .Columns(A).Find("*", , xlFormulas, xlWhole, xlByRows, xlPrevious).Column)
              If LCol > 1 Then: LCol = A: Exit For
        Next A
        If LCol = 0 Then LCol = 1
        Set FindLetzte = .Parent.Cells(LRow, LCol)
 End With
 
 
End Function
Gruß Tino

Anzeige
AW: verdacht
27.06.2013 08:27:19
hary
Moin Tino
Danke, klappt.
gruss hary

noch 1 Hinweis...
26.06.2013 09:03:40
Luschi
..., das funktioniert aber nur, wenn kein Blattschutz existiert oder der Blattschutzparameter UserInterfaceOnly:=True gesetzt wurde.
Gruß von Luschi
aus klein-Paris
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Letzte gefüllte Zeile in List.Object ermitteln


Schritt-für-Schritt-Anleitung

Um die letzte gefüllte Zeile in einem ListObject in Excel VBA zu ermitteln, befolge diese Schritte:

  1. Öffne den VBA-Editor: Drücke ALT + F11 in Excel, um den VBA-Editor zu öffnen.

  2. Füge ein neues Modul hinzu: Klicke mit der rechten Maustaste auf "VBAProject (DeineDatei.xlsx)", wähle Einfügen und dann Modul.

  3. Füge den folgenden Code ein:

    Sub test1()
       MsgBox lastRow_oList("Tabelle1", "Liste_01")
    End Sub
    
    Function lastRow_oList(xTabName As String, xListName As String) As Long
       lastRow_oList = ThisWorkbook.Worksheets(xTabName).ListObjects(xListName).DataBodyRange.SpecialCells(xlCellTypeLastCell).Row
    End Function
  4. Passe die Tabellennamen an: Ersetze "Tabelle1" und "Liste_01" durch die Namen deiner Tabelle und deines ListObjects.

  5. Führe das Makro aus: Kehre zu Excel zurück und führe das Makro test1 aus, um die letzte gefüllte Zeile anzuzeigen.


Häufige Fehler und Lösungen

  • Fehler: Runtime Error 1004 bei SpecialCells

    • Lösung: Stelle sicher, dass dein ListObject tatsächlich Daten enthält. Wenn das DataBodyRange leer ist, wird dieser Fehler ausgelöst.
  • Fehler: Falsche Zeilennummer wird zurückgegeben

    • Lösung: Verwende Cells(.Rows.Count, 1).End(xlUp).Row, um die letzte Zeile mit Inhalt zu ermitteln, anstatt SpecialCells.
    With Worksheets("Tabelle1").ListObjects("Liste_01").DataBodyRange
      MsgBox .Cells(.Rows.Count, 1).End(xlUp).Row
    End With

Alternative Methoden

  1. Direkte Referenzierung: Du kannst die letzte Zeile auch direkt über die DataBodyRange des ListObject ermitteln:

    Sub test2()
       Dim oList As ListObject
       Set oList = ThisWorkbook.Worksheets("Tabelle1").ListObjects("Liste_01")
       MsgBox oList.DataBodyRange.Rows.Count
    End Sub
  2. Finde die letzte Zeile mit einer Funktion:

    Function FindLastRow(oList As ListObject) As Long
       FindLastRow = oList.DataBodyRange.Cells(oList.DataBodyRange.Rows.Count, 1).End(xlUp).Row
    End Function

Praktische Beispiele

  • Beispiel 1: Ermitteln der letzten gefüllten Zeile in einer bestimmten Spalte:

    Sub BeispielLetzteZeile()
       Dim lastRow As Long
       With ThisWorkbook.Worksheets("Tabelle1").ListObjects("Liste_01").DataBodyRange
           lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
           MsgBox "Die letzte gefüllte Zeile ist: " & lastRow
       End With
    End Sub
  • Beispiel 2: Eine Funktion zur Ermittlung der ersten Spalte eines ListObject:

    Function firstCol_oList(xTabName As String, xListName As String) As Long
       firstCol_oList = ThisWorkbook.Worksheets(xTabName).ListObjects(xListName).Range.Cells(1, 1).Column
    End Function

Tipps für Profis

  • Verwendung von UsedRange: Um den benutzten Bereich der Tabelle zu optimieren, kannst du UsedRange in Kombination mit ListObject verwenden.
  • Blattschutz: Stelle sicher, dass kein Blattschutz aktiv ist oder setze UserInterfaceOnly:=True, um das VBA-Skript ohne Einschränkungen auszuführen.

    ActiveSheet.Protect UserInterfaceOnly:=True

FAQ: Häufige Fragen

1. Wie kann ich die letzte Zeile mit Inhalt ermitteln, wenn ich nur eine bestimmte Spalte berücksichtigen möchte? Du kannst die End(xlUp) Methode auf die spezifische Spalte anwenden, um die letzte gefüllte Zeile in dieser Spalte zu finden.

2. Gibt es eine Möglichkeit, die letzte Zeile in einem ListObject dynamisch zu ermitteln? Ja, indem du die Methode Rows.Count und End(xlUp) auf die DataBodyRange des ListObject anwendest, kannst du die letzte Zeile dynamisch bestimmen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige