Thema: Excel: Daten mit Makro umsortieren


Seite durchsuchen:
Home


zurück zur Übersicht

Diskussionsgruppe: Tabellenkalkulation

Guten Morgen,

ich habe folgendes Problem:

Ich bekomme von einem bestimmten Programm Daten als fließkommagetrennte Werte ausgespuckt.
Wenn ich diese nun in Excel weiterverwenden will habe ich allerdings das Problem, dass die Anordnung mit Spalten und Zeilen eine vernünftige Weiterverarbeitung und -aufbereitung nicht zulässt.

Ich möchte die Daten zunächst umsortieren, also für meine Bedürfnisse neu anordnen.

Die Tabelle sieht wiefolgt aus:

A: B: C: D: E: F: G:
(unwichtige name vorname 102 1 datum1 datum2
kennziffer )
" 1.01 wert1 wert2 wert3 wert4 wert5
" 1.02 wert1 wert2 wert3 wert4 wert5

usw. bis:

" 1.XX wert1 wert2 wert3 wert4 wert5

Von diesen untereinanderstehenden Daten habe ich 600 Datensätzen, die sich alle 38 Zeilen in ihrem Aufbau wiederholen.
D.h. es kommt wieder eine Zeile mit Name, Vorname und dann 36 Zeilen mit den Werten, im Schema wie oben gezeigt.

Ich möchte, dass mir ein VBA Makro die Daten so umschreibt, dass ich nur noch eine Zeile statt 37 pro Datensatz habe.

Also:
A: B: C: D: E: F: G: H: I: usw....
Name Vorname 102 1 datum 1 datum 2 1.01wert1 1.01 wert2 ..... 1.XXwert5


Kann mir jemand erklären, wie ich soetwas hinprogrammiert bekomme?

Ich bin echt verzweifelt, weil es unmöglich ist, die sich im Jahresrythmus ändernden Daten alle per Hand in das gewünschte Format zu übertragen.

Bei Fragen meldet euch bitte!

Von: JaO1000 Datum: 21.03.2007, 11:23

alle Antworten zu dieser Frage




Antwort 1 von JaO1000 vom 21.03.2007, 11:38
Falls es euch hilft:

Diese Seite hat mich auf die Idee mit dem Makro gebracht:
http://xltreff.de/makro/umsortieren.htm

Allerdings weiß ich nicht, wo ich anfangen soll, diesen Code für mich umzustricken.



Also was ich brauche ist ein Automatismus der sagt, guck in die Zelle und kopier den Inhalt in eine bestimmte Zelle in das Arbeitsblatt "Auswertung". Und das ganze im immergleichen Schema (also im Prinzip nix Wildes)

C2 auf Auswertung!L2
(und 37 Zeilen weiter unten)
C39 auf Auswertung!L3
(und 37 Zeilen weiter unten)
C76 auf Auswertung!L4
...

Dementsprechend dann auch mit den anderen Spalten:

B1 auf Auswertung!A2
(und 37 Zeilen weiter unten)
B38 auf Auswertung!A3
...

Wie bekomme ich das mit nem Makro hin?

Antwort 2 von Kauz1 vom 21.03.2007, 22:41
Hallo Namenloser...

ich hab mal was zusammengebastelt:

Private Sub CommandButton1_Click()
'
' Von Tabelle1 die Zellen A1 bis A37 werden kopiert,
' und in Tabelle2 in Zeile10 ab Spalte A Tranpondiert (Waagerecht) wieder eingefügt.
' In letzteZeile steht die Nummer der letzten Zeile mit Inhalt.
' Der Wert geteilt durch 37 ergibt die Anzahl der Schleifendurchläufe.

sub Umsortieren
letztezeile = IIf(IsEmpty(Range("A65536")), Range("A65536").End(xlUp).Row, 65536)
Anzahl = Int(letztezeile / 37)


For i = 0 To Anzahl
Sheets("Tabelle1").Activate
Sheets("Tabelle1").Range("A" & i * 37 + 1 & ":A" & i * 37 + 37).Copy
Sheets("Tabelle2").Activate
Sheets("Tabelle2").Cells(10 + i, 1).Activate
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
Next i
Sheets("Tabelle2").Range("A1").Activate
End Sub


Ob es das trifft, was Du Dir vorstellst kannst Du ja mal kundtun.
Das Beispiel kopiert 37 senkrechte Zellinhalte von einem Blatt in
37 waagerechte Zellen eines anderen Blattes.

Probier mal aus

Gruss Andreas

Antwort 3 von Kauz1 vom 21.03.2007, 22:45
Hallo Namenloser..

Ich hab mal ein wenig gebastelt:
---------------------------------------------------------------------
Sub Umsortieren
'
' Von Tabelle1 die Zellen A1 bis A37 werden kopiert,
' und in Tabelle2 in Zeile10 ab Spalte A Tranpondiert (Waagerecht) wieder eingefügt.
' In letzteZeile steht die Nummer der letzten Zeile mit Inhalt.
' Der Wert geteilt durch 37 ergibt die Anzahl der Schleifendurchläufe.


letztezeile = IIf(IsEmpty(Range("A65536")), Range("A65536").End(xlUp).Row, 65536)
Anzahl = Int(letztezeile / 37)


For i = 0 To Anzahl
Sheets("Tabelle1").Activate
Sheets("Tabelle1").Range("A" & i * 37 + 1 & ":A" & i * 37 + 37).Copy
Sheets("Tabelle2").Activate
Sheets("Tabelle2").Cells(10 + i, 1).Activate
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
Next i
Sheets("Tabelle2").Range("A1").Activate
End Sub
-------------------------------------------

Probier mal aus...

Gruss Andreas

Antwort 4 von Kauz vom 21.03.2007, 23:36
Hallo....
Entschuldigung für's doppelt Posten.

War der Meinung, beim 1. Mal hat' s nicht geklappt.

Inzwischen hab ich auch mein Passwort wiedergefunden,
und mich diesmal richtig eingeloggt.

Gruss Andreas

Antwort 5 von JaO1000 vom 22.03.2007, 08:44
Hallo Kauz,

vielen Dank für die schnelle Antwort - ich werde deinen Tipp gleich einmal ausprobieren und schauen was passiert bzw. gucken inwieweit man den Code noch erweitern müsste.


Nochmal tausend Dank

Ich melde mich im Laufe des Tages

Antwort 6 von JaO1000 vom 23.03.2007, 09:12
Guten Morgen,

ich habe dein Makro mal ausprobiert, es sieht nun folgendermaßen aus:

Sub Umsortieren()
'
' Von Tabelle1 die Zellen A1 bis A37 werden kopiert,
' und in Tabelle2 in Zeile10 ab Spalte A Tranpondiert (Waagerecht) wieder eingefügt.
' In letzteZeile steht die Nummer der letzten Zeile mit Inhalt.
' Der Wert geteilt durch 37 ergibt die Anzahl der Schleifendurchläufe.


letztezeile = IIf(IsEmpty(Range("A65536")), Range("A65536").End(xlUp).Row, 65536)
Anzahl = Int(letztezeile / 37)


For i = 0 To Anzahl
Sheets("Daten").Activate
Sheets("Daten").Range("A" & i * 37 + 1 & ":A" & i * 37 + 37).Copy
Sheets("Auswertung").Activate
Sheets("Auswertung").Cells(2 + i, 1).Activate
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
Next i
Sheets("Auswertung").Range("A1").Activate
End Sub


Die ersten 37 Zeilen der Spalte A werden ordnungsgemäß in Tabelle 2 bzw. "Auswertung" in die 2. Zeile kopiert.

Allerdings geschieht das nicht mit den nächsten 37 Zeilen.

Woran liegt das?

Ich verstehe im Besonderen nicht, wie ich den folgenden Bereich des Makros auf meine Bedürfnisse anwenden kann:
"
Sheets("Daten").Range("A" & i * 37 + 1 & ":A" & i * 37 + 37).Copy
"
(ich will ja, wie oben angesprochen, die Daten auch ein bisschen umsortieren, d.h. im immerselben Rythmus anordnen, nicht nur: Zellen A1-A37 werden zu A1-AK1)

Was hat es mit " ("A" & i * 37 + 1 & ":A" & i * 37 + 37) " genau auf sich?
Könnte mir jemand die Operatoren bzw. Variablen kurz erläutern?


Vielen Dank schonmal

Jan

Antwort 7 von Kauz vom 23.03.2007, 20:02
Hallo Jan

Wieviele Zeilen mit Inhalt gibt es denn in Spalte A?

Ich hab es bis 148 ausprobiert..(4 mal ein 37er Block).
Warum bei Dir nur die ersten kopiert werden weiß ich im Mom. auch nicht.
Kommt eine Fehlermeldung?


Die Zeile:
Sheets("Daten").Range("A" & i * 37 + 1 & ":A" & i * 37 + 37).Copy

wählt pro Schleifendurchlauf immer einen 37er Block aus:
Beim ersten Durchlauf (i=0) die ersten 37 Zeilen.
Zweiten Durchl. (I=1) die Zeilen 38-74.

(A 0*37+1:A 0*37+37) ergibt: (A1:A37)
(A 1*37+1:A1*37+37) ergibt: (A38:A74)
usw..
Mit dem '.Copy' dahinter wird dieser Block kopiert.


Ich hoffe es hilft erstmal weiter

Gruss Andreas

Antwort 8 von Kauz vom 24.03.2007, 02:49
Hallo Jan....
Nachtrag:
Betrifft Zeile 'For i = 0 To Anzahl'
Setze für die Variable Anzahl mal eine feste Zahl ein:
z.B. 'For i = 0 To 5' das sind dann 6 Durchläufe, also 6 mal 37 Zeilen die umkopiert werden.

Wenn es jetzt geht, so wird es an den ersten beiden Zeilen liegen:
'letztezeile = IIf(IsEmpty(Range("A65536")), Range("A65536").End(xlUp).Row, 65536)'
'Anzahl = Int(letztezeile / 37)'
Dann vielleicht im Vb-Editor mal unter debuggen im Einzelsatz ausführen bis zum Schleifenanfang.

Nun mit dem Cursor auf 'letztezeile' und 'Anzahl' gehen, um zu sehen, was sie für einen Inhalt haben.

Vielleicht hilft das ja weiter...

Gruss Andreas

Antwort 9 von JaO1000 vom 26.03.2007, 09:01
Hallo Andreas,

vielen Dank erstmal für deine tollen Erläuterungen: Wenn man die "Range"-Syntax erklärt bekommt, ist es wirklich einfach.

Du hattest Recht! Wenn ich 'For i = 0 To Anzahl' z.B. durch 'For i = 0 To 5' ersetze, funktioniert der Durchlauf.

Das Debuggen im VB-Editor habe ich auch ausprobiert, allerdings weiß ich nicht ganz, ob ich wirklich gedebuggt habe.

D.h. die Zeilen im Editor waren gelb markiert, wenn ich den Code in Einzelschritten durchgegangen bin. Allerdings hat sich am Code selbst nichts geändert.

Wie gehe ich nun weiter vor, um das Makro selbstständig bis in die letzte Zeile (max. 256^2 = 65536) durchlaufen zu lassen?

Hast du bzw. habt ihr einen Tipp?


Vielen Dank

Jan

Antworten der Gruppe: Tabellenkalkulation
www.supportnet.de







Office 365 stellt vertraute Microsoft Office-Tools für die Zusammenarbeit und Produktivität über die Cloud bereit. So können alle ganz einfach von nahezu überall zusammenarbeiten und auf E-Mails, Webkonferenzen, Dokumente und Kalender zugreifen.

07121 07122 07123 07124 07125 07126 07127 07128