PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (VBA Excel) Anzahl der Zeilen in beliebiger Tabelle ermitteln?


Axel
2006-01-04, 11:24:24
Guten Morgen,

ich stehe vor der Aufgabe eine Makro zur Auswertung einer Tabelle zu schreiben. Diese Tabelle kann unterschiedlich viele Zeilen enthalten.
Für die Programmierung der For-Next-Schleifen, zum Beispiel, benötige ich die Anzahl der Durchläufe und somit die Anzahl der Zeilen meiner Tabelle. Mit welcher Funktion kann ich die Anzahl ermitteln?
Bei den Listboxen gibt es z.B. ListBox1.List. Aber wie funktioniert dies bei Tabellen?

MeLLe
2006-01-04, 12:31:36
Guten Morgen,

ich stehe vor der Aufgabe eine Makro zur Auswertung einer Tabelle zu schreiben. Diese Tabelle kann unterschiedlich viele Zeilen enthalten.
Für die Programmierung der For-Next-Schleifen, zum Beispiel, benötige ich die Anzahl der Durchläufe und somit die Anzahl der Zeilen meiner Tabelle. Mit welcher Funktion kann ich die Anzahl ermitteln?
Bei den Listboxen gibt es z.B. ListBox1.List. Aber wie funktioniert dies bei Tabellen?
Du könntest z.B. die Tabelle zeilenweise durchackern und die Zeilen zählen, bis du auf ne Leerzelle stößt.

In etwa so, VBA ist laaaaaaaaaaaaaaange her ...

dim zeile as long
dim wirHabenDasEndeErreicht as boolean
zeile = 0
wirHabenDasEndeErreicht = false

do loop
zeile = zeile + 1
if (sheets("meinsheet").cells(zeile,1) = "")
wirHabenDasEndeErreicht = true
end if
until (wirHabenDasEndeErreicht)

msgbox zeilen & " Zeilen hat die Tabelle!"

Juerg
2006-01-04, 13:28:12
Um zu iterieren brauchst Du dies gar nicht zu wissen (ausser natürlich Du möchtest dies explizit)...
Das geht z.B so:For Each rRow In rSelection.Rows
For Each rCell In rRow.Cells
If Not IsEmpty(rCell) Then
MsgBox rCell.Value
End If
Next rCell
Next rRow

Axel
2006-01-05, 09:10:47
Vielen Dank für die Vorschläge. Ich hatte gehofft, daß es auch eleganter geht.
Melles Variante liegt mir mehr, da ich sie selbst nachvollziehen kann.
Mit "For Each..." komme ich noch nicht klar, da es mir zu kryptisch ist. Die Werte von r.row und r.selection sind für mich derzeit nicht nachvollziehbar. Bei Gelegenheit werden ich mir "For Each" zu Gemüte führen.

Ich erlaube mir noch Melles Code zu korrigieren:


dim zeile as long
dim wirHabenDasEndeErreicht as boolean
zeile = 0
wirHabenDasEndeErreicht = false

do until (wirHabenDasEndeErreicht)
zeile = zeile + 1
if (sheets("meinsheet").cells(zeile+1,1) = "") Then wirHabenDasEndeErreicht = true
loop

msgbox zeilen & " Zeilen hat die Tabelle!"

FlashBFE
2006-01-05, 09:25:17
Wenn die Anwendung aber performance-orientiert sein soll, musst du aufpassen, dass du nicht zuviele von den Schleifen drin hast, wenn deine Tabellen sehr lang sind.

Wenn beispielsweise nicht bekannt ist, ob und wieviele Leerzeilen in der Tabelle sind, musst du zwangsläufig von 65536 rückwärts alle Zellen durchklappern und da macht jede Schleife weniger viel aus.

Axel
2006-01-05, 09:36:13
Ehrlich gesagt bin ich froh, wenn ich das alles fehlerfrei zum Laufen bekomme.
Die Performance steht nicht an oberster Stelle und könnte auch später verbessert werden, wenn ich z.B. besser mit VBA zurecht komme.

Axel
2006-01-05, 15:24:48
Jetzt habe ich die richtige Lösung gefunden. Eine ganze Zeile Code, um die benutzen Zeilen zu ermitteln. So solls sein. =)


z = ThisWorkbook.Worksheets(1).UsedRange.Rows.Count

FlashBFE
2006-01-05, 15:47:47
Jetzt habe ich die richtige Lösung gefunden. Eine ganze Zeile Code, um die benutzen Zeilen zu ermitteln. So solls sein. =)


z = ThisWorkbook.Worksheets(1).UsedRange.Rows.Count


Tolle Sache, die Funktion kannte ich auch noch nicht! :)

MeLLe
2006-01-05, 17:02:48
Groovy ;)
Falls mich - Gott bewahre - VBA doch nochmal streifen sollte, weiss ich jetzt, wo ich was finden kann, wenn ich wissen muss, wieviele Zeilen durchgeackert werden sollen.
Ömpf. :|

FlashBFE
2006-01-06, 13:13:27
Naja es kann ja auch passieren, dass du aus einer anderen Programmiersprache auf Excel zugreifen willst und da gilt ja die Objektbibliothek genauso.

MeLLe
2006-01-06, 16:00:08
Das stimmt natürlich. Aber COM ist doch per se böse :| ;D