Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1320to1324
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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!

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.

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!

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.

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.

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige