Hallöchen erstmal, ihr Zankäpfel ...
@balu:
Ich glaube, ich kann etwas Licht ins Dunkel bringen, da ich den Code von Dirk's Projekt mehrere Male analysieren und testen musste/wollte.
Dirk möchte nichts in irgendeine Zelle schreiben. Das Ergebnis der Funktion, über die wir hier philosophieren, ist für die reine Anzeige auf einem Dialogfeld bestimmt und dient Informationszwecken - nur deshalb hat er auch den String "mm" in sein Ausgabe-Objekt geschrieben (scheinbar möchte er damit nichts weiter berechnen). Ziel war, das Schreiben in das Tabellenblatt zu verhindern.
@Dirk:
Vielen Dank, dir auch... und keine Sorge - ich muss dir ja nicht antworten. Die anderen werden sich dir dann schon annehmen!
1) Die Daten in deiner Materialliste sind dynamisch, werden sich also stetig ändern.Dein Vorschlage habe ich kopiert aber noch nicht verstanden.
2) Wenn du die enthaltenen Zellen abfragen möchtest, musst du dafür die Zeilennummer der letzten belegten Zeile wissen. In deinem Beispiel hast du dafür deine Variable bz mit 10 definiert. Aber auch diese Nummer wird sich mit dem Inhalt deiner Tabelle verändern - du musst diese also mittels einer zusätzlichen Schleife herausfinden.
Beispiel:
Code: Alles auswählen
For n = 3 To 250
If oBlatt.getCellByPosition(1, n).Value <> "" Then 'Prüfung auf vorhandenen Inhalt
... 'wenn Zeile belegt, irgendeinen Code ausführen
Else
'... in deiner Beispieltabelle nach 16 Zeilen:
Exit For ''... ab der ersten leeren Zeile ist n = gesuchter Zeilenindex: also Schuhe anziehen und den Raum verlassen ;-)
End If
Next
Code: Alles auswählen
Dim arrMaterial() As Variant
Dim n As Integer
Dim m As Integer : m = 0
For n = 3 To 250
If oBlatt.getCellByPosition(1, n).Value <> "" Then 'Prüfung auf vorhandenen Inhalt
Redim Preserve arrMaterial(m) As Variant 'Neudimensionierung des Arrays
arrMaterial(m) = oBlatt.getCellByPosition(1, n).Value & " " & oBlatt.getCellByPosition(4, n).Value & " mm" 'Extrahierung des Spalteninhalts
m = m + 1
Else
Exit For
End If
Next
Es hilft also nicht einmal, in der getDataArray()-Funktion mit demselben Array weiterzurechnen - es muss ein zweites Array, mit einem vom ersten Array ungebundenen Zeilenindex erstellt werden, so wie Tom es schon erwähnte.
@all:
Die Funktion getDataArray() finde ich zwar ganz übersichtlich und schick, aber eine reine Schleife über die Tabellenzeilen ist zumindest in Dirk's Situation, mit den zwei 'unnötigen' Spalten zwischen den eigentlichen Abfragesequenzen, mindestens doppelt so schnell.
Liebe Grüße,
Marcel
EDIT:
@Stephan:
Code: Alles auswählen
Sub testArray
Dim vz As Integer : vz = 3
Dim bz As Integer : bz = 5
Dim oBlatt As Object
Dim A_Daten2 As Object
Dim i As Integer
Dim tmp
Dim tmp2(1)
oBlatt = thisComponent.Sheets.getByName("Material")
A_Daten2 = oBlatt.getCellRangeByPosition(1, vz, 4, bz).getDataArray()
For i = 0 To uBound(A_Daten2)
tmp = A_Daten2(i)
tmp2(0) = tmp(0)
tmp2(1)= tmp(3) & " mm"
A_Daten2(i) = tmp2
MsgBox join(A_daten2(i), "/")
Next
End Sub