Seite 1 von 1
Dynamische Array einfügen
Verfasst: Mo, 01.11.2021 11:02
von Plan-B
einen schönen guten Tag an Alle,
Bitte um Hilfe:
- test.ods
- (10.65 KiB) 112-mal heruntergeladen
Komme leider nicht weiter beimSchreiben des Arrays auf die nächste Tabelle.
Code: Alles auswählen
Sub test_array
dim quelle(n)
oTest=thiscomponent
halt=0
n=0
i=0
do
if oTest.Sheets(0).getCellByPosition(3,i).string = "x" then 'Check ob Spalte D markiert ist
redim preserve quelle(n)
quelle(n)=oTest.Sheets(0).getcellrangebyposition(0,i,2,i).getDataArray()
n=n+1
i=i+1
else
i=i+1
end if
if oTest.Sheets(0).getCellByposition(0,i).string="" then halt = 1
loop while halt=0
dim ziel(n-1)
ziel(n-1)=oTest.Sheets(1).getCellRangeByPosition(0,0,2,i-1)
ziel.SetDataArray(quelle(n-1)) 'Hier funkt leider nicht. Fehlermeldung: Object variable nicht belegt
End Sub
Was mache ich falsch ? bzw. wie muss ich Zielarray definieren.
Vielen herzlichen Dank für Euere Hilfe.
Gruss
Re: Dynamische Array einfügen
Verfasst: Mo, 01.11.2021 14:39
von craig22
Hallo,
vorweg:
Es gibt verschieden Array-Typen:
typische Deklarationen:
- eindimensionale
- mehrdimensionale
- und "Array von Array's
Die Array können wie in meinen Beispielen bereits dimensioniert werden, muss aber nicht.
Der Datentyp "Variant" kann hingegen wichtig sein, weil die Datenfelder des Array's unterschiedliche Inhalte aufweisen kann:
Text, Datum, Integer, Long, Double usw.
Wenn man aus einem Zellbereich ein Array befüllen will, dann nutzt man einfach ...getDataArray.
Die Festlegung und die Dimensionierung die Dimensionierung des Array's übrenimmt der Basic-Interpreter der IDE.
In jedem Fall ist ein solches Array ein "Array von Array's", das ich wie oben unter Punkt "c" beschrieben habe deklariert.
Dieses verschachtelte Array sieht dann so aus:
- Basic-IDE-Beobachter --- Array von Arrays.JPG (29 KiB) 3285 mal betrachtet
Und hier die Beispieldatei. In Module2 befindet sich das von mir geschrieben Makro inkl. diverser Kommentare:
Re: Dynamische Array einfügen
Verfasst: Mo, 01.11.2021 22:08
von Karolus
@craig Es gibt *nur* die zwei Typen, dein Fall c. ist ein
eindimensionales äusseres Arrray mit einem|mehreren inneren
eindimensionalen Array's als Inhalt.
Off Topic: ein DataArray gebildet via …getDataArray entspricht c. falls aber eine Bereichadresse als Argument in eine UDF geworfen wird, kommt dort ein zweidimensionales Array an das unglücklicherweise ab index 1 dimensioniert ist anstatt wie sonst mit Index 0
zurück zum Thema, "Filtern" aller Zeilen einer Selektion deren letzte Spalte ein 'x' ist, in python per DataArray:
mit einem Cursor-object ( das ist nichts weiter als ein Zell[bereich] mit erweiterten Methoden kann das geschickt gelöst werden:
!Vorsicht Python!
Code: Alles auswählen
doc = XSCRIPTCONTEXT.getDocument()
selection = doc.CurrentSelection
data = selection.DataArray
out = [ row[ :-1] for row in data if row[-1]=='x' ]
target = doc.Sheets.Tabelle2
cursor = target.createCursorByRange(target['A1'])
cursor.collapseToSize(len( out[0] ), len(out) ) #1.col_width 2.row_height
cursor.setDataArray( out )
Re: Dynamische Array einfügen
Verfasst: Di, 02.11.2021 10:09
von Plan-B
guten Morgen,
Vielen vielen Dank für Euere Hilfe.
@Craig22
Danke für die
Und hier die Beispieldatei. In Module2 befindet sich das von mir geschrieben Makro inkl. diverser Kommentare:
Super Erklärung für einen Anfänger wie ich. Vielen Dank.
Als Gerüst für mein Vorhaben kann ich es einsetzen. Es läuft.
Versuche den zu kopierenden Bereich etwas "dynamisch" anzupassen.
@Karolus
Vielen Dank für Deine Tips
Euch allen och einen schönen Tag.
gruss
Re: Dynamische Array einfügen
Verfasst: Di, 02.11.2021 18:28
von mikeleb
Hallo,
wie schon gesagt, liefert .getDataArray ein Array von Arrays (ein Array von Zeilen, bei der jede Zeile wiederum ein Array darstellt. Durch die Konstruktion
Code: Alles auswählen
quelle(n)=oTest.Sheets(0).getcellrangebyposition(0,i,2,i).getDataArray()
Erzeugst du jetzt aber ein Array von Arrays von Arrays.
Lösung:
Code: Alles auswählen
quelle(n)=oTest.Sheets(0).getcellrangebyposition(0,i,2,i).getDataArray()(0)
Durch die (0) wird nur das erste Element des Arrays (= gewünschte Zeile) in das neue array übernommen.
Das Ende
Code: Alles auswählen
dim ziel(n-1)
ziel(n-1)=oTest.Sheets(1).getCellRangeByPosition(0,0,2,i-1)
ziel.SetDataArray(quelle(n-1))
kannst du einfach so schreiben:
Code: Alles auswählen
oTest.Sheets(1).getCellRangeByPosition(0,0,2,n-1).SetDataArray(quelle)
Wichtig ist vor allem die Variable n (anstelle von i).
Re: Dynamische Array einfügen
Verfasst: Di, 02.11.2021 19:48
von Plan-B
Guten Abend,
@Mikeleb
Vielen vielen Dank für Deine Erkärung. Habs gleich in die Tat umgesetzt. Es funktioniert 1a. Danke sehr.
Eine Frage habe ich noch:
Bei dieser Schreibweise bekomme ich Die Fehlermeldung: "Objektvariable nicht belegt"
dim ziel(n-1)
ziel(n-1)=oTest.Sheets(1).getCellRangeByPosition(0,0,2,i-1)
ziel.SetDataArray(quelle(n-1))
Mit deiner Schreibweise hier:
oTest.Sheets(1).getCellRangeByPosition(0,0,2,n-1).SetDataArray(quelle)
Keine Fehlermeldung, funktioniert 1A.
Vielen herzlichen Dank für die klasse Hilfe
Gruss
Re: Dynamische Array einfügen
Verfasst: Di, 02.11.2021 22:43
von mikeleb
Hallo,
Code: Alles auswählen
dim ziel(n-1)
ziel(n-1)=oTest.Sheets(1).getCellRangeByPosition(0,0,2,i-1)
ziel.SetDataArray(quelle(n-1))
ist echt verwirrend ...
Initialisiert ein eindimensionales Array mit n Elementen (von 0 bis n-1)
Code: Alles auswählen
ziel(n-1)=oTest.Sheets(1).getCellRangeByPosition(0,0,2,i-1)
weist dem letzten Element des Arrays einen zweidimensionalen Zellbereich als Objekt zu (hier taucht fälschlicherweise die Variable i auf!!!)
Die Methode .setDataArray soll nun auf ziel angewendet werden. ziel ist aber (wie gerade initialisiert) ein Array (und nicht der Ziel-Zellenbereich)! ... und dann soll diesem auch "nur" die Daten des letzten Elements des Arrays quelle() zugewiesen.
Kurz: Um die Daten aus dem Array quelle() in den Ziel-Zellenbereich zu schreiben muss dieser Bereich angesprochen werden und dann die Daten übertragen werden. Entweder mit "meinem" Einzeiler oder
Code: Alles auswählen
Dim oZiel as object
oZiel=oTest.Sheets(1).getCellRangeByPosition(0,0,2,n-1)
oZiel.setDataArray(quelle())
Noch eine Anmerkung: oZiel.setDataArray(quelle()) und oZiel.setDataArray(quelle) sind gleichwertig. Beim ersterem ist nur eindeutiger, dass es sich um eine Array-Variable handelt.
Re: Dynamische Array einfügen
Verfasst: Mi, 03.11.2021 08:56
von Karolus
Hallo
Noch eine Anmerkung: oZiel.setDataArray(quelle()) und oZiel.setDataArray(quelle) sind gleichwertig. Beim ersterem ist nur eindeutiger, dass es sich um eine Array-Variable handelt.
@mikele: an das fertige
quelle-objekt nochmal ()klammern dranzuhängen ist syntaktischer Unsinn, wenn du unbedingt kenntlich machen willst daß das ein array ist dann nenne es halt
aquelle, das ist dann zumindest informativer wie das häufig zu sehende
my…prefix.
Re: Dynamische Array einfügen
Verfasst: Mi, 03.11.2021 13:14
von craig22
Hallo,
@karolus
karolus hat geschrieben:Es gibt *nur* die zwei Typen,
Dank für die Korrektur, werde mich nochmals näher mit den Array-Typen auseinandersetzen.
karolus hat geschrieben: nenne es halt aquelle, das ist dann zumindest informativer wie das häufig zu sehende my…prefix.
In diesem Fall verwende ich meist die Präfixe gemäß der AOO-Konventionen.
m → Präfix für Array's
a → Präfix für Structures
https://wiki.openoffice.org/wiki/DE/Mak ... #Variablen
Re: Dynamische Array einfügen
Verfasst: Mi, 03.11.2021 15:50
von Plan-B
@all
Super Erklärung. Vielen herzlichen Dank.
Mit freundlichen Grüssen
Plan-B