Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1508to1512
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Transponieren mit VBA

Transponieren mit VBA
09.08.2016 16:51:09
Dawson
Hallo zusammen,
ich hab ein etwas komplexeres Excel-Problem, bei dem ich mir hier Hilfe erhoffe.
Ich habe eine große Anzahl einzelner Excel-Dateien.
Darin sind eine oder mehrere Tabellenblätter.
Diese sind folgendermaßen aufgebaut:
Spalten: Nr. / Wert1 / Wert2 / Wert3 / Datum
Zeilen:
1 / 1,5 / 2,3 / 3,1 / 01.01.2016
2 / 2,5 / 1,3 / 2,2 / 02.01.2016
3 / 0,5 / 0,3 / 18 / 03.01.2016
oder manche haben auch:
Spalten: Nr. / Wert1 / Wert2 / Wert3 / Wert4 / Wert5 / Datum
(und die Zeilen dementsprechend mit 5 Werten befüllt)
Darunter sind mehrere Zeilen mit entsprechenden Werten ausgefüllt. Möglich sind wohl 1 Zeile bis max. 50 Zeilen.
Jetzt müsste mir das VBA die Excel so umformen, dass ich eine Excel-Datei bzw. ein Tabellenblatt heraus bekomme, welches mir pro Spalte "Wert" die Daten in diese Form bringt:
Spalten: Nr.NEU / Wert / Datum
Zeilen:
1+[Spaltenname von Spalte Wert1] / Wert1 / Datum Nr.1
1+[Spaltenname von Spalte Wert2] / Wert2 / Datum Nr.1
1+[Spaltenname von Spalte Wert3] / Wert3 / Datum Nr.1
2+[Spaltenname von Spalte Wert1] / Wert1 / Datum Nr.2
2+[Spaltenname von Spalte Wert2] / Wert2 / Datum Nr.2
2+[Spaltenname von Spalte Wert3] / Wert3 / Datum Nr.2
3+[Spaltenname von Spalte Wert1] / Wert1 / Datum Nr.3
usw.
Ich hoffe, mich verständlich ausgedrückt zu haben.
Grüße
Dawson

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Sicher geht das mit VBA, ...
09.08.2016 21:50:20
Luc:-?
…Dawson,
aber da du in Xl besser als in VBA bist, könntest du das auch mit Fmln versuchen. Für eine Zeile dieser Struktur in beliebiger Länge sähe die Fml so aus:
{=MTRANS(INDEX($A$21:$G$21;1;WAHL(SPALTE(A1);1;2;ANZAHL($A21:$G21))):INDEX($A$21:$G$21;1; WAHL(SPALTE(A1);1;ANZAHL($A21:$G21)-1;ANZAHL($A21:$G21)))) }
Dabei muss für die spaltenweise MatrixFml in jeder Spalte die notwendige Anzahl von Zeilen ausgewählt wdn.
Problematisch ist zZ noch der ZeilenWechsel und die flfd Nummer. Arbeite dran, habe aber momentan wenig Zeit dafür.
Feedback nicht unerwünscht! Gruß, Luc :-?
Besser informiert mit …
Anzeige
AW: Sicher geht das mit VBA, ...
09.08.2016 23:46:45
Dawson
Danke für deine Mithilfe.
Leider komm ich mit der Formel nicht ganz klar.
Mit Formeln hab ich das Ganze aber auch schon (mehr oder weniger elegant) gelöst, zumindest mit Hilfe zweier Hilfsspalten.
Habe dir mal eine Beispiel-Datei angehängt.
Der Witz ist, die Original-Daten sehen viiieeeeel komplizierter aus und haben viel mehr Spalten, als ich in diesem Beispiel nutze. Das Ausgangsformat in dieser Beispieldatei (obere Zeilen) ist also bereits per Hand vorformatiert (Spalten gelöscht, Spaltenreihenfolge angepasst, Spaltenbeschriftung usw.)
Und darunter habe ich mal meine "Lösung". Mit den beiden Hilfsspalten A+B klappt das nun so ganz gut. Ich muss also immer nur drei Zeilen hinein kopieren und kann den Rest über markieren+runterziehen ausfüllen. Nicht schön oder gar praktisch, aber funzt und ist wohl schneller, als alles per Hand zu machen.
Vielleicht kannst du ja in der Datei ein zweites Blatt anlegen, auf dem du deine Formeln mit einbaust. In Aktion sehe ich vielleicht, was du gemeint hast.
Danke.
Datei: https://www.herber.de/bbs/user/107515.xlsx
Anzeige
Habe inzwischen eine Fml-KomplettLösung, ...
13.08.2016 00:42:28
Luc:-?
…Dawson,
die allerdings Hilfszellen benötigt und 2 meiner Standard-UDFs benutzt, die in der benötigten Version auch im Archiv enthalten sind. In der hier verlinkten BspDatei siehst du auch, wie sie in deiner Mappe untergebracht wdn müssen. Der nachfolgende blaue Text ist für die vorgelegte Lösung irrelevant und wendet sich an Nutzer, die bereits UDFs von mir benutzen bzw zukünftig verwenden wollen.
Die vorangestellte und von VJoin benutzte Enumeration cxTriState wurde in bisher unveröffentlichten Versionen von VJoin, VSplit (aktuell zZ beide in Vs1.5) u.a. (bereits veröffentlichten) UDFs geändert:
alt: Public Enum cxTriState: cxAsUsed = -2: cxRTrue: cxFalse: cxPTrue: End Enum
neu: Public Enum cxTriState: cxAsUsed = -2: cxTrue: cxFalse: cxCTrue: End Enum
Die Enum und die entsprd SchlüsselWorte in der UDF perspektivisch ggf ändern, damit es keine Konflikte mit anderen Versionen gibt, falls diese mal in einem AddIn oder der Personal.xlsb zusammengefasst wdn sollen.

Mein Lösungsvorschlag sähe dann so aus:
 ABCDEFGHIJKL
1NrWert 1Wert 2Wert 3Datum | Wert 4leer | Wert 5leer | Datum     
2 23456  Hilfsspalte1Hilfsspalte2Hilfsspalte3
31233,52,51,612.02.2016   123-2 123-3 123-43,5 2,5 1,642412 42412 42412 
4333974,904.05.2016   333-2 333-3 333-49 7 4,942494 42494 42494 
556756407.08.2016   567-2 567-3 567-45 6 442589 42589 42589 
64442,22,31,43,52,612.08.2016 444-2 444-3 444-4 444-5 444-62,2 2,3 1,4 3,5 2,642594 42594 42594 42594 42594 
7            
8  Nr. (neu)WertDatum   PrimärFormel-Bsp f.QuellZeile3:
9B1123-23,512.02.2016   123-23,512.02.2016 
10C1123-32,512.02.2016   123-32,512.02.2016 
11D1123-41,612.02.2016   123-41,612.02.2016 
12B2333-2904.05.2016 Formeln:     
13C2333-3704.05.2016 I3[:K6]: {=VJoin(VSplit(GLÄTTEN(VJoin(WENNFEHLER(INDEX($A3:$G3;1;WAHL(SPALTE(A1);1;2;ANZAHL
14D2333-44,904.05.2016             ($A3:$G3))):INDEX($A3:$G3;1;WAHL(SPALTE(A1);1;ANZAHL($A3:$G3)-1;ANZAHL($A3:$G3)))&WAHL
15B3567-2507.08.2016             (SPALTE(A1);"-"&INDEX($A$2:$G$2;2):INDEX($A$2:$G$2;ANZAHL($A3:$G3)-1);"";"");"");;-2))))}
16C3567-3607.08.2016       
17D3567-4407.08.2016 C9[:E22]: {=MTRANS(VSplit(VJoin(I3:I6);;1))}
18B4444-22,212.08.2016       
19C4444-32,312.08.2016 I9:I11[;J9:K11]: {=MTRANS(VSplit(GLÄTTEN(VJoin(WENNFEHLER(INDEX($A3:$G3;1;WAHL
20D4444-41,412.08.2016                        (SPALTE(A1);1;2;ANZAHL($A3:$G3))):INDEX($A3:$G3;1;WAHL(SPALTE(A1);1;ANZAHL($A3:
21E4444-53,512.08.2016                        $G3)-1;ANZAHL($A3:$G3)))&WAHL(SPALTE(A1);"-"&INDEX($A$2:$G$2;2):INDEX($A$2:$G$2;
22F4444-62,612.08.2016                        ANZAHL($A3:$G3)-1);"";"");"");;-2));;1))}
Ich verzichte auf das Hochladen einer komplettierten BspDatei, da das für mich erhöhten Aufwand bedeutet und ich doch davon ausgehe, dass du das anhand der Darstellung und der BspDatei selbst hinbekommst. Beachte beim Erstellen der Fmln bitte, dass zuerst die Hilfszellen angelegt wdn müssen. Ihre (grauen) Fmln sind singulare MatrixFmln, d.h., jede einzelne umfasst nur diese eine Zelle. Die schwarzen Fmln (im grünen ErgebnisBereich) verbinden die Hilfszellen­Ergebnisse spaltenweise, sind also spalten­orientierte (plurale) MatrixFmln, d.h., jede erzeugt stets eine ganze Spalte* der ErgebnisTabelle, die dann auch vor Eintrag der Fml in ihre jeweils 1.Zelle ausgewählt wdn muss. Die Eingabe aller MatrixFmln wird bekanntlich nicht nur mit [enter], sondern bei gleichzeitig gedrückten Tasten [strg][umsch] abgeschlossen.
Die blauen Fmln dienen nur als Bsp für die Auswertung einer einzigen Zeile, also die Grundlage der komplexeren Fmln. Hier kann man dann auch sehen, dass die Xl-Steuerung einen einzelnen Ergebnis­Wert einer MatrixFml auf den ganzen markierten Bereich ausdehnt. Da dieser Effekt auch in den Zusammen­fassungs­Fmln der Hilfszellen wirksam ist, konnte er zur Verviel­fachung der nur einzeln vorliegenden Werte genutzt wdn.
* Falls in der ErgebnisTab unbedingt EinzelWerte erzeugt wdn sollen, muss die 1.Fml entweder =INDEX(VSplit(VJoin(I$3:I$6);;1);ZEILE(A1)) oder =Splint(VJoin(I$3:I$6);;ZEILE(A1)) lauten. Die ebenfalls im Archiv enthaltene UDF Splint (RECHERCHE!) integriert die Auswahl (INDEX) und kann im Ggsatz zu VSplit nur EinzelBezüge bzw -Werte verarbeiten. Die MatrixFml-Form ist bei beiden Varianten nicht erforderlich.
Viel Erfolg! Gruß + schöWE, Luc :-?
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige