Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1464to1468
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

Tabelle um 90 Grad drehen, bzw DS einzeln listen

Tabelle um 90 Grad drehen, bzw DS einzeln listen
17.12.2015 15:38:37
Jockel
Hallo,
oh je, ich muss per VBA Tabellen sozusagen um 90 Grad drehen. Die Tabelle hat momentan folgende Struktur:
Zeile1 = leer
Zeile2 = leer
Zeile3 = Beschriftung Sp. (Nr.______PRODUKT__ZUSATZ...)
Zeile4 = Datum (aber erst ab Spalte F)
Zeile5 = Daten (siehe unterhalb von #########)
A________B________C________D________E________F________G________H________I_____
Nr.______PRODUKT__ZUSATZ___WERT_____GESAMT___Anz1_____Anz2_____Anz3_____Anz4__
_____________________________________________Juni16___Juli16___Aug16____Sept___
################################################################################
1._______AUTO_____BMW______70%______80_______20_______50_______10_______________
2._______AUTO_____OPEL_____20%______70_______50________________20_______________
3._______SCHIFF___U-BOOT___90%______40________________20________________20______
Aus dieser Tabelle muss ich folgende Tabelle bauen:
Die erste Zeile von oben muss ich aufsplitten in Anzahl der in den Spalten F, G, H... gelistetet Mengen
Wenn man die erste Zeile anschaut, dann sieht man, dass es von "BMW" insgesamt "80" Stück gibt (Spalte E)
und die sich aufteilen in JUNI16 = 20; JULI16=50 und AUG16 = 10
Genau so soll dann auch meine neue Tabelle (neues Sheet) aussehen:
Die Stammdaten in den Spalten B, C und D sind überall gleich und dahinter für jeden MOnat die entsprechende Werte.
Wenn der erste DS von oben durch ist, kommt der zweite DS mit "AUTO_____OPEL" dran.
Dann der dritte usw:
Neues Ergebnis:
1._______AUTO_____BMW______70%______Juni16___20
2._______AUTO_____BMW______70%______Juli16___50
3._______AUTO_____BMW______70%______Aug16____10
4._______AUTO_____OPEL_____20%______Juni16___50
5._______AUTO_____OPEL_____20%______Aug16____20
7._______SCHIFF___U-BOOT___90%______Juli16___20
8._______SCHIFF___U-BOOT___90%______Sept16___20
Dabei gibt es aber zwei Probleme:
Das erste Datum steht zwar immer in Spalte F drin, die Anzahl der nachfolgenden Monatsnamen kann anstatt bis Spalte I auch mal bis Spalte M,oder N oder so gehen (längere Vorschau) und nicht in jedem Monat muss zwingend ein Wert stehen.
Die Anzahl der DS ist natürlich auch nicht immer nur 3, können auch mehr sein.
Kann man das mit einem Makro machen, dass zB die Erste Zeile mit Daten (Zeile5) von A ab durchlaufen wird, jeweils die Stammdaten erfasst und ab Spalte F schaut, ob ein Wert drin steht, Wenn JA, für welchen Monat und diese INfo dann zu einem neuen DS zusammen fasst. So wie unten dargestellt. wenn der DS fertig ist, den nächsten erzeugen.
Das Ende der Spalten und de Zeilen muss dynamisch sein.
Ja dajemand eine Idee und kann mir helfen ?
Ich hoffem das Problem ist herüber gekommen, sonst bitte nachfragen.
Danek mal
Jockel

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: nachgefragt ...
17.12.2015 17:35:06
der
Hallo Jockel,
... wie viele Datensätze wären denn max "auseinanderzufitzen" und wie viele Monatswerte je Datensatze sind denn max zu erwarten? Wenn es nicht tausend(e) Datensätze sind, könnte man das auch mit Formel(n) lösen.
Allerdings solltest Du dazu einfach eine Excel-Datei einstellen, aus der Deine Datenstruktur sowohl bzgl. des IST als auch des Ziels eindeutiger zuordenbar.
Gruß Werner
.. , - ...

Absolut klasse, danke ..... noch eine BItte..
17.12.2015 19:32:45
Jockel
Hallo Michael,
der Code macht genau das, so wie ich es mir vorgestellt habe. Da kann ich weiter dran bauen.
Noch eine Bitte:
ich verstehe den Code fast garnicht.
Könntest du mir in den Code ein paar Notizen rein machen, falls sich bei mir mal was ändert, ich vielleicht noch mal eine weitere Kopfzeile einbauen muss oder es muss irgend wo eine Spalte noch rein oder raus,oder die Datums müssen wo anders rein, .... dass ich eine Chance habe, den Code anzupassen.
Das wäre sehr nett, aber auf jeden Fall hast du mir super viel geholfen.
Danke
Gruß
Jockel

Anzeige
na, mal sehen,
18.12.2015 15:43:52
Michael
Jockel,
ich habe den Code mal etwas kommentiert:
Sub machen_Mit_Erklaerung()
Dim von&, bis&, z&, z2&, s&, s2&, smax&
Dim a As Variant ' das wird unten als "Array" verwendet
von = 5  ' Tabelle1: oberste Zeile mit Daten
s2 = 2 ' für Überschrift in der ersten Zeile
' = oberste Zeile für AUSGABE in Tabelle2
' Range.CurrentRegion ist der Bereich, der mit der genannten
' Adresse zusammenhängt, also von A3 aus gesehen:
' nach unten: erst mal nix, da A4 leer
' nach rechts: bis Ende, in der Testdatei bis Spalte H
' von irgendeiner der (rechts) beteiligten Zelle nach unten,
' weil da die Monate stehen und wiederum von da aus
' zu den Daten, die dann allesamt "irgendwie" zusammenhängen.
' kann man auch schön anschauen mit
Range("A3").CurrentRegion.Interior.Color = vbYellow
' dieser Bereich wird wiederum dem Array a zugewiesen
' Array heißt auf dt. so viel wie Feld
' Bitte lesen:
' http://www.online-excel.de/ _
excel/singsel_vba.php?f=152
a = Range("A3").CurrentRegion
bis = UBound(a, 1) ' zeilenweise "Obergrenze" von a
' = Nr. der untersten Zeile
smax = UBound(a, 2) ' spaltenweise "Obergrenze" von a
' = Nr. der rechtesten Spalte
If bis  Empty Then
Tabelle2.Range("A" & s2 & ":E" & s2) = _
WorksheetFunction.Index(a, z, 0)
' Index ist die Funktion INDEX, die man im Tabellenblatt
' über "Funktion einfügen" auch erhält; INDEX ist unter
' Matrix zu finden. Hilfe durchlesen!
' INDEX verwendet man üblicherweise im Tabellenblatt, kann
' aber in VBA auch für Arrays verwendet werden.
' Man kann damit einzelne Zeilen bzw. Spalten eines Arrays
' ansprechen und "in einem Rutsch", d.h. ohne Schleife
' zurück ins Tabellenblatt schreiben.
' Weiterhin werden Arrays *NUR* in den "links vom =" angegebenen
' Bereich geschrieben; weitere, vorhandendene Daten werden
' ignoriert.
' Klingt alles ein bißchen esoterisch, zugegeben.
' Wenn man es aber mal "gefressen" hat, läßt es sich sehr
' kompakt programmieren.
' WorksheetFunction.Index(a, z, 0) enthält Daten aus dem
' Array a, aus der Zeile z werden ALLE (das gibt die 0 an)
' in a vorhandenen Spalten "zurückgegeben", aber wegen
' Tabelle2.Range("A" & s2 & ":E" & s2) nur die ersten 5
' für die Spalten A bis E auch wirklich geschrieben.
Tabelle2.Range("F" & s2) = a(2, s)
' In Spalte F werden die Daten aus der 2. Zeile des Arrays
' geschrieben (also die Monate), und zwar jeweils aus Spalte s
' s ist ja der Zähler für die Spalten in der inneren Schleife
Tabelle2.Range("G" & s2) = a(z, s)
' In Spalte G werden die Daten aus der z. Zeile und s. Spalte
' geschrieben, und zwar in die Zeile Nr. s2
s2 = s2 + 1
End If
Next
' Falls Leerzeile gewünscht:
s2 = s2 + 1
Next
MsgBox "Ausgabe erfolgte in Tabelle2"
End Sub
Laß Dir bitte keine grauen Haare wachsen, wenn Du ihn nicht auf Anhieb verstehst; ich habe selber immer wieder gelesen und herumprobiert, um das so kompakt formulieren zu können.
Warum? Man kann es viel einleuchtender schreiben, aber diese Variante flutscht auch bei großen Datenmengen und der Code ist sehr kompakt. Wenige Zeilen Code sind übersichtlicher und weniger fehleranfällig als viele Zeilen...
Happy Exceling,
Michael
P.S.: Es ist auch immer hilfreich, einen zunächst "schwierigen" Code mit der F8-Taste durchzugehen; zwischendrin kann man dann mal in die Tabelle schauen, ob und was passiert ist; außerdem werden die aktuellen Werte von Variablen in einem Tooltip angezeigt, wenn man den Mauszeiger drüberhält.

Anzeige
Kommando zurück
19.12.2015 16:44:45
Michael
Hallo Jockel,
gestern bin ich einem anderen Projekt darüber gestolpert, daß es anscheinend eine Mengenbegrenzung bei index gibt; ich habe jetzt keine Zeit, das gründlich zu recherchieren, poste aber mal eine Lösung, die dieses *möglicherweise* auftretende Problem umgeht:
ub machen_anders()
Dim von&, bis&, z&, z2&, s&, s2&, smax&
Dim a As Variant ' das wird unten als "Array" verwendet
Dim b As Variant ' das auch, für die ersten 5 Werte A-E
von = 5  ' Tabelle1: oberste Zeile mit Daten
s2 = 2 ' für Überschrift in der ersten Zeile
' = oberste Zeile für AUSGABE in Tabelle2
a = Tabelle1.Range("A3").CurrentRegion
b = Tabelle1.Range("A1:E1") ' Zeile 1 ist die nächstbeste;
' es geht nur darum, die richtige Größe zu bekommen.
bis = UBound(a, 1)
smax = UBound(a, 2)
If bis  Empty Then
'      Tabelle2.Range("A" & s2 & ":E" & s2) = WorksheetFunction.Index(a, z, 0)
' ersetzt durch die Schleife und die darauf folgende Zuweisung
For z2 = 1 To 5: b(1, z2) = a(z, z2): Next
Tabelle2.Range("A" & s2 & ":E" & s2) = b
Tabelle2.Range("F" & s2) = a(2, s)
Tabelle2.Range("G" & s2) = a(z, s)
s2 = s2 + 1
End If
Next
' Falls Leerzeile gewünscht:
s2 = s2 + 1
Next
MsgBox "Ausgabe erfolgte in Tabelle2"
End Sub
Schöne Grüße,
Michael

Anzeige
AW: nachgefragt ...
20.12.2015 10:18:42
der
Hallo Michael,
... zu Deiner Aussage: "... daß es anscheinend eine Mengenbegrenzung bei index gibt...". Worauf bezieht diese sich genau? Lässt sich das vermeintliche Problem so herauslösen, dass es auch ohne VBA-Einsatz nachvollziehbar ist?
Gruß Werner
.. , - ...

AW: nachgefragt ...
20.12.2015 16:20:20
Michael
Hallo Werner,
ich hab's schnell im Tabellenblatt mit {=INDEX(A12:G210;0;3)} gemacht, da geht's auch mit besagter Größe.
Ist ja keine "ernsthafte" Datenmenge, und "VBA-frei" zum Glück kein Problem.
Aber mal ganz langsam: ich hatte den Index verwendet, um variabel Spalten eines Arrays (=Kopie eines Bereichs) mit geänderter Spaltenzuordnung in ein anderes Blatt zu schreiben. Dann hab ich die Sub kopiert, einige Änderungen für ein anderes (größeres) Blatt vorgenommen, und plötzlich ging's nimmer: "Typen unverträglich". Ich hab dann ne halbe Stunde gesucht, aber den Fehler nicht gefunden - und schließlich ersatzweise die Schleife programmiert. Reine Zeitfrage.
For i = 1 To UBound(Sp, 2)
If Sp(1, i) > 0 Then
'''    For k = 1 To maxz
'''      ganzeSpalte(k, 1) = a(k, Sp(1, i))
'''    Next
'''  '  Stop
'''    Konto.Cells(uKto, i).Resize(maxz, 1) = ganzeSpalte
Debug.Print "ukto " & uKto & " i " & i & " maxz " & maxz & " Sp(1,i) " & Sp(1, i)
' ergibt: ukto 215 i 1 maxz 199 Sp(1,i) 1
Konto.Cells(uKto, i).Resize(maxz, 1) = _
WorksheetFunction.Index(a, 0, Sp(1, i))
End If
Next

Alle Variablen sind als long definiert; der obere mit drei ' auskommentierte Teil läuft, die Anweisung mit dem Index nicht - ich begreif's nicht.
Exakt das gleiche Ding in der anderen Sub ...
For i = 1 To UBound(Sp, 2)
If Sp(1, i) > 0 Then
Debug.Print "oben " & oben & " i " & i & " maxz " & maxz & " Sp(1,i) " & Sp(1, i)
'ergibt: oben 215 i 1 maxz 2 Sp(1,i) 1
Konto.Cells(oben, i).Resize(maxz, 1) = _
WorksheetFunction.Index(a, 0, Sp(1, i))
End If
Next

funktioniert; der einzige Unterschied ist, daß hier nur sehr wenige Werte vorhanden sind (maxz). Naja, die eine Variable heißt oben statt uKto, aber, wie gesagt, ist alles long.
Ich habe für das Untere mal mehr Daten reinkopiert; im Debug-Fenster steht denn:
oben 215 i 1 maxz 256 Sp(1,i) 1
oben 215 i 2 maxz 256 Sp(1,i) 2
oben 215 i 3 maxz 256 Sp(1,i) 3
oben 215 i 4 maxz 256 Sp(1,i) 5
oben 215 i 5 maxz 256 Sp(1,i) 8
oben 215 i 6 maxz 256 Sp(1,i) 9
oben 215 i 9 maxz 256 Sp(1,i) 10
also: maxz 256 ist mehr als 199 und es geht doch.
Null Schimmer!
In den 80ern hatte ich mal so ne Sache mit Turbo Pascal 6; bei einem bestimmten Programm kam beim Kompilieren immer "Internal Error [hatte der ne Nummer?] - please report to Borland". Hab ich nicht, und Netz gab's damals auch nocht nicht. Zufällig hatte ich dann das Mainboard gewechselt und plötzlich war der Fehler weg. Ich hab's dann rausgefummelt (ach, diese Tauschaktionen damals!): es war ein einzelner Speicherriegel, der offenbar an einer bestimmten Stelle ein "weak bit" hatte.
So, jetzt hast Du meinen VBA-Frust abgekriegt, der Dich eh nicht interessiert. Sorry.
Schöne Grüße samt den besten Wünschen für die Feiertage,
Michael

Anzeige
AW: Danke für Deine Information ...
21.12.2015 09:39:02
...
Hallo Michael,
... und auch Dir schöne Grüße und beste Wünsche für die kommenden Feiertage.
Gruß Werner
.. , - ...

Cool, vielen Dank ...
21.12.2015 13:16:05
Jockel
Hallo Michael,
vielen Dank, das ist ja echt cool. Habe einiges verstanden.
Konnte den Code sogar schon soweit mit Deiner Beschreibung ändern, als dass ich
weiter Spalten eingefügt haben, das Startdatum also erst weiter hinten anfängt in Spalte J statt F und der Code trotzdem weiter noch geht.
Vielen Dank dafür.
Wünsche ein schönes Fest.
Gruß
Jockel

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige