Folgendes vorweg.
Es geht hier NUR um das genannte Transponieren.
Also nicht um das verteilen von mehreren Spalten auf x-Zeilen (1, oder 2) oder ähnliches PUNKT. Das sind hier die Hausregeln.

Zu dem Thema habe ich eine Lösung, die auch funktioniert, dazu komme ich noch.
Eins sei aber schon mal dazu gesagt.
Die Lösung ist NUR für 2 Spalten geeignet.
Ich möchte wissen:
- Wie ihr das Thema angeht?
- Wie ihr auf die Lösung gekommen seid?
- Welche Informationsquellen dabei euch zur Verfügung standen (Bücher, PDFs, Forum …)?
- Oder ob ihr “abgekupfert“ habt
?
Ich hatte natürlich hier auch gesucht, aber leider keine geeignete Beiträge gefunden.
Das einzige System was ich fand, hatte etwas mit DISPATCH zu tun. Nix gegen ihn generell, aber da gibt es für mich zu viele Parameter die ICH nicht verstehe.
Auch die deutsche Übersetzung vom Andrew Pitonyak war mir keine Hilfe.
Dabei war mein Wunsch doch eigentlich recht “einfach“.
“Eine Zeile auf zwei Spalten verteilen.“
Okay, eine extra bedingung kam noch dazu.
“Das muss Paarweise geschehen.“
Soll heisen (einfach dargestellt).
Aus
s1, s2, s3, s4, s5, s6
Wird
s1 – s2
s3 – s4
s5 – s6
Da ich mir mit getDataArray(0)(0) die Zeile einlese, müsste ich dann doch nur noch das Array irgendwie im Arbeitspeicher transponieren.
Aber genau das “irgendwie“ machte mir kopfzerbrechen.
Meine fehlversuche waren zahlreich. Bis ich mir eine ganz andere Strategie überlegte.
Dazu schaute ich mir mit XRAY das 2 spaltige Array noch mal anders an (hatte ich von Hand angelegt). Der Inhalt des Array war ersrmal unwichtig.
Wichtiger war die Array-Adressierung. Und die sah wie folgt aus.
(0,0)
(0,1)
(1,0)
(1,1)
(2,0)
(2,1)
Die Zahl vor dem Komma ist die Array Zeile.
Die Zahl nach dem Komma ist die Array Spalte.
Und nun schaute ich mir den Array Inhalt zusätzlich mit an, und das sah dann insgesammt so aus (einfach dargestellt, und der Array Inhalt steht in Gänsefüßchen).
(0,0) string : “s1“
(0,1) string : “s2“
(1,0) string : “s3“
(1,1) string : “s4“
(2,0) string : “s5“
(2,1) string : “s6“
Jetzt zeichnete sich so langsam ein Bild vor meinem geistigen Auge ab. Aber da fehlt noch einiges, wie z.B. die eingelesene Zeile. Denn auch sie ist ein Array.
Also her mit XRAY!
Und was zeigt es mir?
Auch wieder vereinfacht …
(0) string : “s1“
(1) string : “s2“
(2) string : “s3“
(3) string : “s4“
(4) string : “s5“
(5) string : “s6“
-
Hier ist nur ein Wert in der Klammerung. Warum und wieso das so ist, ist ein Thema für sich. Das lassen wir mal beiseite.
Aber kurz gesagt:
Die Zahl in der Klammerung ist die Spaltennummer der eingelesenen Zeile.
Und nun kommt ein kleiner “Kunstgriff“ von mir. Ich stelle beide Arrays nebeneinander.
(0,0) - (0)
(0,1) - (1)
(1,0) - (2)
(1,1) - (3)
(2,0) - (4)
(2,1) - (5)
Was mir auf fiel ist folgendes.
Wenn die 0 neben dem Komma steht, handelt es sich in der einfachen Klammerung um eine Gerade Zahl, bei der 1 ist sie Ungerade. Und das ist sehr hilfreich zu wissen. Denn dadurch lässt sich eine “Wahrheitsliste“ erstellen.
Bevor ich zur Lösung komme, wird es Zeit ein paar “Sprechende Variablennamen“ zu vergeben. Das hilft den Makro-Code besser zu verstehen.
Da die in Calc eingelesene Zeile ein Array ist und sie die Quelle darstellt, nenne ich sie einfach:
- aQuellAri
- aZielAri
- zz = ZielZeile im aZielAri
- zs = ZielSpalte im aZielAri
- qs = QuellSpalte im aQuellAri
(0,0) – (0)
So ähnlich sieht das auch im Makro-Code aus.
Code: Alles auswählen
aZielAri(zz,zs) = aQuellAri(qs)(0)
Kommen wir nun zur eigentlichen Transponierungs Routine.
Code: Alles auswählen
'__ Transponieren anfang
zz = 0 : zs = 0 : qs = 0
For b = 0 to 13
aZielAri(zz,zs) = aQuellAri(qs)(0)
IF zs = 0 then
zz = zz : zs = zs +1
else
zz = zz +1 : zs = 0
end IF
qs = qs +1
next b
'__ Transponieren ende
Nachdem die FOR-Schleife ihren ersten Schritt gemacht hat, überprüft die IF-Abfrage welchen Wert zs hat. Ist er 0, dann bleibt zz wie er ist und zs wird um 1 erhöht. Hat zs aber den Wert 1, dann wird zz um 1 erhöht und zs bleibt so.
Egal wie die IF-Abfrage ausfällt, qs wird immer um 1 erhöht. Und die Schleife macht ihren nächsten Schritt.
Nebeninfo.
Man kann und darf mehrere Code-Zeilen in eine Zeile durch den Doppelpunkt getrent schreiben. Es MUSS aber darauf geachtet werden das EIN Leerzeichen VOR und NACH dem Doppelpunkt steht. Ansonsten gibts arge Probleme.
Ich gehe damit sehr vorsichtig um. Aber in diesem Fall hier passt das schon.
Bäck tu Topic.
Natürlich hat das gesamte Makro einige Zeilen mehr, aber mir gings hier jetzt primär um die Transponierungs Routine.
In der Beispieldatei könnt ihr mal mein System testen.
Jetzt seid ihr an der Reihe.

Es kann durchaus sein, das ich mich erst in mehreren Tagen wieder melden kann, wenn alles gut geht.
Gruß
balu