Hallo!
@Stephan
Sehe meine kommenden Einwende bitte nicht als einen persönlichen Angriff dir gegenüber an. Und sollte ich dich irgendwie falsch verstanden haben, so sag mir das bitte schön.
Also denn.
Stephan hat geschrieben:
die Daten sind nun im Array "meine_Daten", aber dieses Array hat nur eine Spalte mir 1000 Unterarrays ...
Mag vielleicht sein das dies wohl der richtige Technische Ausdruck dafür ist, ich jedoch sehe das etwas anders was auch für die Verständigung für Anfänger leichter zu verdauen ist. Ich versuche das mal so weit wie möglich recht einfach zu beschreiben.
Durch die Aktion
meine_Daten = oSheet.getCellRangeByName("A1:F1000").getDataArray() wird der Datenbereich in den Arbeitsspeicher eingelesen. Es wird so gesehen fast eine 1:1 Kopie des Zellbereichs
A1:F1000 dort angelegt. Das kann man sich ja noch sehr gut und einfach merken.
Wenn man jetzt aber damit per Basic weiter arbeiten möchte, dann wird es jetzt etwas, ein klein wenig, komplizierter.
Fangen wir mit den Koordinaten an.
Eine Zelle im Tabellenblatt, nehmen wir die Zelle B2, wird immer erst mit der Spalte und dann mit der Zeile angesprochen.
B, ist ganz klar die Spalte.
2, ist dann natürlich die Zeile.
Und in der Programmierung sieht das dann wie folgt aus.
Aber mann kann die Zelle auch noch über die Position ansprechen.
Aber auch hier kommt erst die Spalte, und dann die Zeile.
So, und nun folgt ein Sprung zu der Calc-Funktion =SVERWEIS().
Wer SVERWEIS kennt, der weiss das erst in einer Spalte gesucht wird, und dann aus einer bestimmten Spalte rechts daneben mit der gleichen Zeilennummer ein Ergebnis zurück gegeben wird. Dürfte auch klar sein.
Aber auch hier wird erst mit der Spalte, und dann mit der Zeile gearbeitet. Bis hier hin gibt es also Parallelitäten zu der Zelladressierung.
Doch nun kommt der dicke und fette Sprung zum
ABER!
Um jetzt aber das mehrdimensionale Array, denn das ist ja der eingelesene Zellbereich
A1:F1000 da er mehr als eine Spalte beinhaltet (eine Spalte wäre nur ein eindimensionales Array), muss jetzt eine relativ einfache Methode herhalten um daraus Daten auszulesen.
Stephan hat geschrieben:
... also muss man es ggf. noch umformen:
Nein, umformen muss man da nix. Man muss das mehrdimensionale Array nur anders ansprechen, um damit zu arbeiten können. Und das ist eigentlich so weit auch kein besonders großes "Hexenwerk". Mann muss sich jetzt nur Geistlich etwas umstellen. Denn das bisher gesagte: "Erst Spalte, dann Zeile." wird nun auf den Kopf gestellt.
Ich habe eine kleine einfache Beispieldatei angehängt, um das folgende sich selber mal anschauen zu können. Zu finden ist das in der Datei im *Modul1*.
Code: Alles auswählen
Dim oDok as Object, oBlatt1 as Object
DIM oData
oDok = ThisComponent
oBlatt1 = oDok.Sheets.GetByName("Tabelle1")
oData1 = oBlatt1.getCellRangeByName("A1:E100")
oData = oData1.getDataArray()
Das dürfte soweit verständlich sein.
Variablen deklaration, Variablen defenition, und den Datenbereich des Zellbereichs
A1:E100 in ein Array einlesen.
Doch das folgende ist schon interessanter.
Code: Alles auswählen
For iAs = 0 to 4
for iAz = LBound(oData()) to UBound(oData())
if oData(iAz)(iAs) = 430 then ' <------ Hier kann auch ein anderer Wert eingegeben werden,
' der aber im Tabellenblatt vorhanden sein muss.
print "Gefunden! Array Koordinate ist: Zeile " & iAz &" Spalte " & iAs
end if
next iAz
next iAs
Es soll der Wert 430 gesucht werden, der auch im Tabellenblatt vorhanden ist. Und wenn er gefunden wurde, wird anschließend die Zeilen und die Spaltennummer des mehrdimensionalem Array ausgegeben.
iAs bedeutet: indexArraySpalte
iAz bedeutet: indexArrayZeile
Die eigentliche Suche, und das vergleichen mit dem Suchwert (Suchbegriff), geschieht hiermit.
Hier wird jetzt auch ersichtlich, das erst die Zeile, und dann die Spalte in dem mehrdimensionalem Array angesprochen wird. Das ist also das, was ich eben noch mit auf den Kopf stellen meinte.
Und ja(!), das ist richtig so geschrieben. Es sind 2 Klammerpaare direkt hintereinander ohne einen Punkt, Komma, oder sonstwas.
Die Reihenfolge, Zeile dann Spalte, kann auch NICHT getauscht werden. Also so etwas
führt dann unweigerlich zu einer Fehlermeldung. Die Reihenfolge ist nun mal halt fest vorgegeben, genauso wie die Zelladressierung im Tabellenblatt B2, die kann man auch nicht einfach auf 2B ändern.
Die beiden Schleifen arbeiten wohl erst die Spalten und dann die Zeilen ab, jedoch hat das nix mit der Adressierung des Arrays zu tun welche ja mit
oData(iAz)(iAs) vorgenommen wird.
Jetzt nehmen wir uns mal vor die =SVERWEIS() zu ersetzen. Und das machen wir folgt, was in der Datei im *Modul2* nachgesehen werden kann.
Code: Alles auswählen
for iAz = LBound(oData()) to UBound(oData())
if oData(iAz)(1) = 111 then
print oData(iAz)(4)
end if
next iAz
Diesmal setzen wir die Spalte in der gesucht werden soll auf den festen Wert 1.
Und wenn in dieser Spalte der gesuchte Wert gefunden wurde, soll dann in der gleichen Zeile aus der Spalte 4 der dementsprechende Wert zurückgegeben werden.
Ich hoffe das diese kleine Erklärung etwas hilfreich ist.
Natürlich ist dadurch das Hauptproblem von akBenutzer noch nicht gelöst, aber es ist schon mal der erste Schritt.
Ich mache jetzt aber Feierabend, es ist schon sehr Spät, oder zu früh.
Gruß
balu