Re: [gelöst]Anfänger-Problem mit Array-Bildung
Verfasst: Fr, 17.01.2020 20:16
@all:
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!
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:
Und wenn du sowieso schon eine Schleife über deine Tabellenzeilen hast, sind die zwei zusätzlichen Zeilen mit der Array-Erstellung und Wertezuweisung eben gar nicht mehr so viel Mehraufwand:
Wenn du der Variable bz vorher einen festen Wert, mit z.B. 150, zuweist, sind auch im Ergebnis der Funktion getDataArray() 150 Elemente enthalten, wobei diese dann (bei leeren Zeilen in deiner Tabelle) eben auch leer sind - aber vorhanden. Du hast dann dort also 600 einzelne Elemente!
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:
Wenn ich deine erste Funktion wie oben abfrage, bekomme ich ein korrektes Ergebnis?! Mache ich etwas falsch?
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