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

Forumthread: Letzte beschrieben Zeile ermitteln

Letzte beschrieben Zeile ermitteln
03.07.2013 09:10:04
Nils
Hallo,
ich habe direkt am Morgen schon folgende Frage:
Mit folgenden Zeilen versuche ich die letzte beschriebene Zeile der Spalte D zu ermitteln:
lzzuo = ActiveSheet.Cells(Rows.Count, 4).End(xlUp).Row

Spalte D ist so aufgebaut, dass die erste Zeile frei ist und die Zeilen 2-4 beschrieben sind (Überschrift in Zeile 2 und zwei Zahlen in den Zeilen 3-4).
Für mich heißt das, dass sich die letzte beschriebene Zelle in Zeile 4 befindet, wenn ich mir allerdings per MsgBox den Wert wiedergeben lasse, erhalte ich "3" als Ergebnis.
MsgBox "Wert ist " & lzzuo
Warum? Werden mit Rows.Count nur die beschriebenen Zeilen gezählt? Wie kann ich es ändern, so dass mir als Ergebnis die Zeile der letzten beschriebene Zelle wiedergegeben wird, egal wieviele Zellen darüber frei waren?
Vielen Dank!

Anzeige

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Letzte beschrieben Zeile ermitteln
03.07.2013 09:18:32
Klaus
Hallo Nils,
bist du denn auf dem richtigem Sheet, dem activesheet?
Nur der Form halber: Rows.Count gehört auch referenziert!
lzzuo = ActiveSheet.Cells(ActiveSheet.Rows.Count, 4).End(xlUp).Row
(bei ActiveSheet ist das natürlich nur halb so schlimm).
Rows.Count zählt die Anzahl der verfügbaren Zeilen, bei xl2010 sollte da 1048576 herauskommen. Kannst du einfach ausprobieren mit "MsgBox ActiveSheet.Rows.Count".
Die beschriebene Zeile wird gefunden mit .end(xlup), das simuliert die Tastenkombi STRG+PfeilOben.
Kannst du auch ausprobieren .... gehe in Zelle D1048576 und drücke STRG+PfeilOben und schau wo du landest!
Von ganz unten mit STRG+PfeilOben die letzte Zelle festzustellen funktioniert eigentlich zuverlässig. Probleme bereitet diese Methode, wenn sie:
- mit ausgeblendeten Zellen zu tuen hat
- mit verbundenen Zellen zu tuen hat
- mit einem Autofilter-Bereich zu tuen hat
Beliebt ist auch, einen Bug zu vermuten wenn:
- die letzten Zeilen mit Formelergebnissen "" gefüllt, also faktisch nicht leer sind
- irgendwo ein einsames Leerzeichen in einer Zelle steht
Versuch als Alternative mal:
lzzuo = ActiveSheet.Range("A1").SpecialCells(xlCellTypeLastCell).Row
wenn das auch nix bringt, müsstest du uns die Tabelle hochladen!
Grüße,
Klaus M.vdT.

Anzeige
AW: Letzte beschrieben Zeile ermitteln
03.07.2013 09:31:57
Nils
Danke Klaus,
nun weiß ich auch genau wie Rows.Count funktioniert. Ich bin trotzdem noch überfragt.
Ich habe mir mal einen Button direkt auf das Tabellenblatt gelegt und ausgeführt:
Sub Zeilentest()
lzzuo = ActiveSheet.Cells(Rows.Count, 4).End(xlUp).Row
MsgBox "Wert ist " & lzzuo
End Sub
Schon spuckt er "4" aus.
Wenn ich es aber im Rahmen eines etwas größeren Makros nutze und das Sheet vorher aktiviere:
Sheets("Tabelle2").Activate
MsgBox "Wert ist " & lzzuo
, dann bekomme ich nach wie vor eine "3".
Es gibt keine verbundenen Zellen, keinen Filter und auch keine ausgeblendeten Zellen. Falls noch jmd, eine Idee hat, versuche ich mich gerne, ansonsten lade ich das Sheet später gerne mal hoch.
Danke!

Anzeige
AW: Letzte beschrieben Zeile ermitteln
03.07.2013 09:36:48
Klaus
Hallo Nils,
wenn ich das sehe:
Sheets("Tabelle2").Activate
MsgBox "Wert ist " & lzzuo

dann setze ich Geld darauf, dass du falsch referenzierst!
Activate und Select sind eh zu 99% unnötig und machen nur Ärger.
Vorschlag:
du lädst deinen gesamten Code, ich schau einmal drüber. In der Zeit liest du folgendes Tutorial:
http://www.online-excel.de/excel/singsel_vba.php?f=78
und dann sehen wir weiter!
Grüße,
Klaus M.vdT.

Anzeige
AW: Letzte beschrieben Zeile ermitteln
03.07.2013 09:48:00
Beverly
Hi Nils,
wenn ich deinen 2. Codeschnipsel richtig verstanden habe, ermittelst du zuerst die Variable luzzuo und aktivierst dann das Tabellenblatt? Kein Wunder - dann bekommst du doch den Wert aus dem Tabellenblatt, in dem du dich befindest, wenn du den Code ausführst.


Anzeige
AW: Letzte beschrieben Zeile ermitteln
03.07.2013 09:59:19
Nils
Jetzt verstehe ich es. Ich dachte, ich kann:
lzzuo = ActiveSheet.Cells(Rows.Count, 4).End(xlUp).Row

1x definieren und dann für verschiedene Tabellenblätter benutzen und dachte wenn ich folgendes schreibe:
Sheets("Tabelle2").Activate
MsgBox "Wert ist " & lzzuo
holt er sich die letzte Zeile in Spalte D zu dem aktiven Tabellenblatt erneut, da lzzuo ja auf das aktive Sheet verweist. Ich habe nun die oben genannte Zeile lzzuo also nochmal geschrieben, nachdem ich das Tabellenblatt aktiviert habe. Nun funktioniert es.
Ich lade meinen Code gleich noch mal hoch, weil mir noch schleierhaft ist, wie ich z.B. For Next Schleifen oder eine MsgBox direkt mit dem Sheet verbinden kann, ohne es vorher zu aktivieren.

Anzeige
zzzzZZZZzzzzzz
03.07.2013 11:38:59
Klaus
Hallo Nils,
Ich lade meinen Code gleich noch mal hoch,
wir sitzen hier alle in den Startlöchern und wollen optimieren :-)
Grüße,
Klaus M.vdT.

'Gleich' scheint doch sehr dehnbar...! ;-) orT
03.07.2013 19:53:39
Luc:-?
Gruß Luc :-?

AW: 'Gleich' scheint doch sehr dehnbar...! ;-) orT
03.07.2013 20:32:48
Nils
Schande über mich! Da will man mir schon helfen, da komme ich nicht aus dem Quark, sorry!"Gleich" hätte "heute Abend" heißen sollen :) Also hier der Code. Ich glaube ich weiß wo ich hier und da schon was optimieren kann. Gerade was "Activate" und "Select" angeht, weiß ich aber nicht, wie ich weiter vorgehen kann. Zumindest funktioniert es so, wie ich es haben will :)
Kurze Erklärung. Ich versuche Umsätze neu zu ordnen, nämlich einmal in einer Monatsübersicht und dann werden die Einsätze "Horst", "Peter", "Werner" und "Alle" auf den jeweiligen Sheets zugeordnet.

Sub nils12345()
Dropdown
zeile = 3
lz = Sheets("Umsaetze").Cells(Rows.Count, 2).End(xlUp).Row
AktuellerMonat = Sheets("Umsaetze").Range("D1")
Application.ScreenUpdating = False
' Erstellen eines neuen Sheets für den aktuellen Monat
ThisWorkbook.Activate
Worksheets("Monatsuebersicht").Copy After:=Worksheets("Umsaetze")
ActiveSheet.Name = AktuellerMonat
Range("A4:E100").ClearContents
' Definition der verschiedenen Spalten im Sheet der Umsätze
Sheets("Umsaetze").Select
For S = 5 To lz
If Cells(S, 3) = "" Then GoTo 1
Datum = Cells(S, 1)
VonAn = Cells(S + 1, 2)
Umsatz = Cells(S, 3)
Total = Cells(S, 4)
Zuo = Cells(S, 5)
' Einträge im Sheet des aktuellen Monats
ThisWorkbook.Worksheets(AktuellerMonat).Activate
Cells(zeile, 1) = Datum
Cells(zeile, 2) = VonAn
Range("C" & zeile).FormulaLocal = Left(Umsatz, Len(Umsatz) - 4)
Range("D" & zeile).FormulaLocal = Left(Total, Len(Total) - 4)
Cells(zeile, 5) = Zuo
' Einträge in den jeweiligen Sheets von "Horst", "Peter", "Werner" und "Alle"
ThisWorkbook.Worksheets(Zuo).Activate
lzzuo = ActiveSheet.Cells(Rows.Count, 4).End(xlUp).Row
Cells(lzzuo + 1, 2) = Datum
Cells(lzzuo + 1, 3) = VonAn
Range("D" & lzzuo + 1).FormulaLocal = Left(Umsatz, Len(Umsatz) - 4)
Sheets("Umsaetze").Select
zeile = zeile + 1
1:
Next
' Summe unter der Betragsspalte im Sheet "Alle"
Sheets("Alle").Activate
lzzuo = ActiveSheet.Cells(Rows.Count, 4).End(xlUp).Row
Sheets("Alle").Cells(lzzuo + 1, 4) = WorksheetFunction.Sum(Range(Cells(3, 4), Cells(lzzuo, 4)))
Application.ScreenUpdating = True
Sheets(AktuellerMonat).Activate
End Sub
So. In oder Hoffnung, dass ich es bald etwas geschickter hinbekomme :) Danke für Eure Hilfe.

Anzeige
AW: 'Gleich' scheint doch sehr dehnbar...! ;-) orT
04.07.2013 08:55:36
Klaus
Hallo Nils,
nach ganz grobem drüberschauen, etwa so:
Sub nils12345()
'DropDown 'Was ist das?
zeile = 3
'lz = Sheets("Umsaetze").Cells(Rows.Count, 2).End(xlUp).Row
AktuellerMonat = Sheets("Umsaetze").Range("D1").Value
Application.ScreenUpdating = False
' Erstellen eines neuen Sheets für den aktuellen Monat
ThisWorkbook.Activate
Worksheets("Monatsuebersicht").Copy After:=Worksheets("Umsaetze")
With ActiveSheet
.Name = AktuellerMonat
.Range("A4:E100").ClearContents
End With
' Definition der verschiedenen Spalten im Sheet der Umsätze
With Sheets("Umsaetze")
lz = .Cells(.Rows.Count, 2).End(xlUp).Row
For S = 5 To lz
If Not .Cells(S, 3) = "" Then   'KEIN GOTO!!!!!! Das ist nicht TurboPascal!
Datum = .Cells(S, 1)
VonAn = .Cells(S + 1, 2)
Umsatz = .Cells(S, 3)
Total = .Cells(S, 4)
Zuo = .Cells(S, 5)
' Einträge im Sheet des aktuellen Monats
With Sheets(AktuellerMonat)
.Cells(zeile, 1) = Datum
.Cells(zeile, 2) = VonAn
.Range("C" & zeile).FormulaLocal = Left(Umsatz, Len(Umsatz) - 4)
.Range("D" & zeile).FormulaLocal = Left(Total, Len(Total) - 4)
.Cells(zeile, 5) = Zuo
End With
' Einträge in den jeweiligen Sheets von "Horst", "Peter", "Werner" und "Alle"
With Sheets(Zuo)
lzzuo = .Cells(.Rows.Count, 4).End(xlUp).Row
.Cells(lzzuo + 1, 2) = Datum
.Cells(lzzuo + 1, 3) = VonAn
.Range("D" & lzzuo + 1).FormulaLocal = Left(Umsatz, Len(Umsatz) - 4)
End With
zeile = zeile + 1
End If
Next S
End With
' Summe unter der Betragsspalte im Sheet "Alle"
With Sheets("Alle")
lzzuo = .Cells(.Rows.Count, 4).End(xlUp).Row
.Cells(lzzuo + 1, 4) = WorksheetFunction.Sum(.Range(.Cells(3, 4), .Cells(lzzuo, 4)))
End With
Sheets(AktuellerMonat).Activate
Application.ScreenUpdating = True
End Sub
Ich habe alle Select und Activate entfernt, alle Referenzierungen angepasst und das GOTO rausgeworfen.
Beachte: immer wenn .CELLS oder .RANGE steht, bezieht sich das auf die Tabelle die im WIDTH weiter oben genannt wurde.
Du machst den Fehler, dass du durchgehen rows.count NICHT auf die Tabellen referezierst, das habe ich für dich geändert. Es ist zwar sehr sehr warscheinlich, dass die verschiedenen Tabellen die gleiche Zeilenanzahl haben ... aber halt nicht 100% sicher. Und man sollte alleine aus Prinzip in der Tabelle die Zeilen zählen, in der man mit den Zeilen arbeiten will ... und nicht irgendwo. Du zählst ja auch nicht die Autos deines Nachbarn (eins) und sagst dann: korrekt, ich habe ein Auto! (Obwohl das Ergebniss warscheinlich stimmt).
Grüße,
Klaus M.vdT.

Anzeige
AW: 'Gleich' scheint doch sehr dehnbar...! ;-) orT
04.07.2013 11:24:52
Nils
Lieber Klaus, hab vielen Dank. Das ist ganz großes Tennis ;).
Viele dieser Möglichkeiten waren mir gar nicht bekannt und helfen mir sehr weiter.
Insbesondere das Umgehen des GoTos sowie folgende Schreibweise über With

With Sheets("Umsaetze")
lz = .Cells(.Rows.Count, 2).End(xlUp).Row
ist mir neu und bringt mich viel weiter. So brauche ich die Benennung des Sheets nicht jede Zeile mitziehen.
Also noch mal vielen Dank!

Anzeige
Danke für die Rückmeldung! owT.
04.07.2013 11:56:19
Klaus
.

AW: 'Gleich' scheint doch sehr dehnbar...! ;-) orT
04.07.2013 20:21:22
Nils
Ich verstehe es noch nicht ganz. Wieso wird dieser Absatz nicht durch ein End With geschlossen?
 With Sheets("Umsaetze")
lz = .Cells(.Rows.Count, 2).End(xlUp).Row
For S = 5 To lz
If Not .Cells(S, 3) = "" Then   'KEIN GOTO!!!!!! Das ist nicht TurboPascal!
Datum = .Cells(S, 1)
VonAn = .Cells(S + 1, 2)
Umsatz = .Cells(S, 3)
Total = .Cells(S, 4)
Zuo = .Cells(S, 5)
Wenn ich eines hinzufüge heißt es: "End With ohne With".

Anzeige
AW: 'Gleich' scheint doch sehr dehnbar...! ;-) orT
04.07.2013 20:28:03
Nils
Und wieso wird im gleichen Absatz das
If Not .Cells(S, 3) = "" Then   'KEIN GOTO!!!!!! Das ist nicht TurboPascal!
nicht ebenfalls durch ein End If geschlossen?

AW: 'Gleich' scheint doch sehr dehnbar...! ;-) orT
04.07.2013 22:14:24
Nils
Ich schließe das hier mal wieder. Mein schlaues VBA Buch hat mir schon geholfen.

Anzeige
EndIF und EndWIth
09.07.2013 09:43:20
Klaus
Hallo Nils,
die EndIf's und EndWIth's sind alle vorhanden! Du übersiehst sie blos. Druck den Code mal aus und markier jedes WITH - und END WITH mit Textmarker, dann siehst dus.
Grüße,
Klaus M.vdT.
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Letzte beschriebene Zeile in Excel ermitteln


Schritt-für-Schritt-Anleitung

Um die letzte beschriebene Zeile einer bestimmten Spalte in Excel mit VBA zu ermitteln, kannst du folgende Schritte befolgen:

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

  2. Füge ein neues Modul hinzu: Klicke auf Einfügen > Modul.

  3. Gib den folgenden Code ein:

    Sub LetzteZeileErmitteln()
       Dim lzzuo As Long
       lzzuo = ActiveSheet.Cells(Rows.Count, 4).End(xlUp).Row
       MsgBox "Die letzte beschriebene Zeile in Spalte D ist: " & lzzuo
    End Sub
  4. Führe das Makro aus: Schließe den VBA-Editor und drücke ALT + F8, wähle LetzteZeileErmitteln und klicke auf Ausführen.

Du erhältst eine Meldung mit der letzten beschrifteten Zeile in Spalte D.


Häufige Fehler und Lösungen

  • Fehler: Falsches Ergebnis bei MsgBox
    Wenn du als Ergebnis eine falsche Zeile erhältst, stelle sicher, dass du die richtige Arbeitsmappe aktiv hast. Verwende ActiveSheet, um sicherzustellen, dass du auf das aktuelle Arbeitsblatt zugreifst.

  • Lösung: Rows.Count richtig referenzieren
    Stelle sicher, dass du ActiveSheet.Rows.Count verwendest, um die Zeilenanzahl korrekt zu ermitteln:

    lzzuo = ActiveSheet.Cells(ActiveSheet.Rows.Count, 4).End(xlUp).Row
  • Problem mit leeren Zellen
    Wenn deine letzte Zeile nicht korrekt ermittelt wird, könnte es daran liegen, dass in der Spalte D leere Zellen oder nur Formelergebnisse vorhanden sind. Vergewissere dich, dass die Zellen tatsächlich mit Werten gefüllt sind.


Alternative Methoden

  1. Verwendung von SpecialCells: Eine andere Methode zur Ermittlung der letzten Zeile könnte die Verwendung von SpecialCells sein:

    lzzuo = ActiveSheet.Range("A1").SpecialCells(xlCellTypeLastCell).Row
  2. Ermittlung in einem bestimmten Bereich: Wenn du nur innerhalb eines bestimmten Bereichs suchen möchtest, kannst du dies so tun:

    lzzuo = ActiveSheet.Range("D1:D100").End(xlUp).Row

Praktische Beispiele

Hier sind einige Beispiele zur Anwendung der Methoden:

  • Einfaches Makro zur Ermittlung:

    Sub BeispielLetzteZeile()
       Dim letzteZeile As Long
       letzteZeile = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
       MsgBox "Letzte Zeile in Spalte A: " & letzteZeile
    End Sub
  • Anpassung des Codes für verschiedene Spalten:

    Sub LetzteZeileSpalte()
       Dim letzteZeile As Long
       letzteZeile = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
       MsgBox "Letzte beschriebene Zeile in Spalte B: " & letzteZeile
    End Sub

Tipps für Profis

  • Vermeide Activate und Select: Verwende stattdessen With-Anweisungen, um den Code effizienter und lesbarer zu gestalten.

    With Sheets("Tabelle2")
      lzzuo = .Cells(.Rows.Count, 4).End(xlUp).Row
    End With
  • Fehlerbehandlung einfügen: Implementiere eine Fehlerbehandlung, um Probleme bei der Ausführung zu vermeiden.

    On Error Resume Next
    lzzuo = ActiveSheet.Cells(Rows.Count, 4).End(xlUp).Row
    If Err.Number <> 0 Then MsgBox "Fehler bei der Ermittlung der Zeile!"
    On Error GoTo 0

FAQ: Häufige Fragen

1. Wie kann ich die letzte Zeile mit Inhalt in einer bestimmten Spalte ermitteln?
Du kannst dies mit dem folgenden Code tun:

Dim letzteZeile As Long
letzteZeile = ActiveSheet.Cells(Rows.Count, 3).End(xlUp).Row

2. Was ist der Unterschied zwischen Cells und Range in VBA?
Cells referenziert Zellen anhand ihrer numerischen Position (z.B. Cells(1, 1) für A1), während Range die Zellen durch ihren Namen oder Bereich definiert (z.B. Range("A1")).

3. Was mache ich, wenn ich leere Zellen in meiner Spalte habe?
Wenn leere Zellen vorhanden sind, könnte die Methode End(xlUp) nicht die gewünschte letzte Zeile zurückgeben. Stelle sicher, dass du die Spalte vor der Ausführung auf leer überprüfst.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige