Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

Excel: Daten mit Makro umsortieren





Frage

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!

Antwort 1 von JaO1000

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

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

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

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

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

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

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

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

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

Antwort 10 von JaO1000

Wow,

ich hab den Fehler SELBER! gefunden :D

Ich hatte den Code des Makro im VBA-Editor unter Tabelle 2 - "Daten", also in der Ausgabetabelle liegen.
Deshalb hat er in diesem Teil des Scripts die Werte der falschen Tabelle, weil der Ausgabetabelle benutzt:

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

Okay, die richtige Anzahl der Schleifendruchläufe hätten wir damit, jetzt fehlt nur noch die richtige Zuordnung der Zellen in Tabelle1 zu den Zellen in Tabelle2.

Mal schaun, ob ich das hinbekomme.

Ich schicke euch nachher mal den neuen Script, der hoffentlich funktioniert!

Jan

Antwort 11 von JaO1000

Hallo Leute,

ich glaube ganz so weit bin ich doch noch nicht, dass ich den Script alleine auf meine Bedürfnisse ändern kann.

Ich habe mal geschaut welche Zuordnungen ich genau brauche, sprich den Inhalt welcher Zelle in Tabelle 1 ich in welche Zelle zu Tabelle 2 kopieren möchte:

So ergibt sich folgendes:
In Tabelle 2 in der ersten Zeile sollen von Spalte "A" bis Spalte "FL" (sprich in 168 Spalten) folgende Zellen aus Tabelle 1 kopiert werden:

D1 B1 C1 F1 G1 E1 C2 D2 E2 F2 G2 C3 D3 E3 F3 G3 C4 D4 E4 F4 G4 C5 D5 E5 F5 C6 D6 E6 F6 G6 C7 D7 E7 F7 G7 C8 D8 E8 F8 G8 C9 D9 E9 F9 C10 D10 E10 F10 C11 D11 E11 F11 C12 D12 E12 F12 G12 C13 D13 E13 F13 G13 C14 D14 E14 F14 G14 C15 D15 E15 F15 G15 C16 D16 E16 F16 G16 C17 D17 E17 F17 G17 C18 D18 E18 F18 G18 C19 D19 E19 F19 C20 D20 E20 F20 G20 C21 D21 E21 F21 G21 C22 D22 E22 F22 G22 C23 D23 E23 F23 C24 D24 E24 F24 C25 D25 E25 F25 G25 C26 D26 E26 F26 G26 C28 D28 E28 F28 C29 D29 E29 F29 G29 C30 D30 E30 F30 C31 D31 E31 F31 C32 D32 E32 F32 C33 D33 E33 F33 G33 C34 D34 E34 F34 C35 D35 E35 F35 G35 C36 D36 E36 F36 C37 D37 E37 F37 G37


Es wäre klasse, wenn ihr mir zumindest die ersten 3-4 Kopiervorgänge posten könntet, den Rest kann ich dann ja ruhig per Hand weiter ins Makro einbinden.

Tausend Dank schonmal

Mfg
Jan

Antwort 12 von Kauz

Hallo Jan...

da die gewünschte Umsortierung auf den ersten Blick doch recht chaotisch wirkt, muß ich das mir erstmal genauer anschauen.
Werde mich heute Abend mal damit befassen.

Kopfzerbrech...

Gruss Andreas

Antwort 13 von JaO1000

Hallo Andreas,

ja chaotisch kann man das sogar nennen.
Allerdings steckt ein System dahinter (ich würde dir die Excel Datei gerne mal schicken bzw. online stellen, dann weißt du besser was gemeint ist)

Abgesehen davon wiederholt sich ja die Kopie im immerselben Rythmus alle 37 Zeilen.

Das heißt z.B. für die ersten 3 Zeilen, die von Tabelle 1 kopiert werden sollen, gilt:


D1 B1 C1 F1 G1 E1 C2 D2 E2 F2 G2 C3 D3 E3 F3 G3

1 entspricht 1+ i* 37
2 entspricht 2 + i* 37
3 entspricht 3 + i* 37

Genau dieses Chaos ist ja gerade das Problem, das ich durch die automatisch per Makro ablaufende Sortierung beheben will, um die Daten sinnvoll weiternutzen zu können.

Danke schonmal fürs Kopfzerbrechen!

Jan

Antwort 14 von JaO1000

Kann ich statt der Befehlskette
".copy ... transpose:=true"
zu benutzen, vielleicht etwas in der Art
".copy ... .paste"
nehmen und das dann zellenweise einzeln über kopieren und einfügen - Befehle zurechtstricken.

Dank dir

Jan

Antwort 15 von Kauz

Hallo Jan..

Ausser die Zellen mit der 1 hinter wiederholen sich alle anderen gleichmässig.
D1 B1 C1 F1 G1 E1 ---- ist das richtiog?
C2 D2 E2 F2 G2
C3 D3 E3 F3 G3
... bis zur Zahl 37.

Dann... 168 ist kein Vielfaches von 37... passt auch nicht.

Ich würde sagen, pack die Tabelle mal hier ein, und dann stell ich die Fragen.:-)

Zu dem Debuggen: Das war schon richtig.
Die gelbe Zeile ist der Code, der als nächstes abgearbeitet wird. F8 drücken.
Wenn man in diesem Zustand den Mousecursor auf einer Variablen zum Beispiel 'i' "parkt", dann wird ihr Inhalt als Info angezeigt.
So kann man sich anschauen, ob auch die erwarteten Inhalte eintreten.

Das einzelne Kopieren mit Paste geht auch.
Es wird wohl ein Mix aus beidem werden, schätz ich.

Bis denne Andreas

Antwort 16 von JaO1000

Hi Andreas,

ich weiß, 168 ist kein Vielfaches von 37 - das liegt daran, dass einige Zellen in Tabelle 1 auch nicht in Tabelle 2 kopiert werden sollen, entweder weil ihr Inhalt überflüssig oder leer ist. (Ich weiß schon, dass du alles transponieren wolltest - das ist allerdings nicht mein Ziel)

Mit der Regelmäßigkeit hast du Recht- nach dem Anfang (sprich der ersten Zeile aus jedem 37er Datensatz in Tabelle 1) "D1 B1 C1 F1 G1 E1" wiederholen sich die anderen gleichmäßig.

Achtung:
Ich hoffe , du hast bemerkt, dass z.B. in den folgenden Zellen der Tabelle1 Unregelmäßigkeiten auftreten:
"C4 D4 E4 F4 G4 C5 D5 E5 F5 C6 D6 E6 F6 G6 "
1. 5 Zellen aus Zeile 4 (C4-G4)
2. 4 Zellen aus Zeile 5 (C5-F5)
3. 5 Zellen aus Zeile 6 (C6-G6)

Als ein weiteres Beispiel wirst du bemerken, dass jede 27. Zeile aus der Tabelle1 komplett vernachlässigt werden kann und nicht kopiert werden soll, da sie leer ist!


Die oben beschriebenen Unregelmäßigkeiten sind nur insoweit unregelmäßig, wie man sie im Script betrachtet.
Die Schritte wiederholen sich ja bei jedem Kopiervorgang alle 37 Zeilen.

Könnte ich dir die Datei zeigen, wüsstest du, was ich meine.
Wie funktioniert das hier im Supportnet?


Vielen Dank für deine Mühe
Jan

Antwort 17 von Kauz

Hallo Jan...
schau mal in Deinen Pager.

Gruss Andreas

Antwort 18 von Kauz

Hallo Jan...
ich wage doch schon mal einen vorsichtigen Ansatz:

Cells funktioniert entgegengesetzt zu Range:
Range("A4") entspricht Cells(4,1)


So kann man Werte (Inhalte) direkt von einem zum anderen Tabellenblatt schreiben. (Ohne Formatierungen!)

'----- für die Zellen: D1 B1 C1 F1 G1 E1

Sheets("Auswertung").cells(1,1)=Sheets("Daten").cells(1,4)
Sheets("Auswertung").cells(1,2)=Sheets("Daten").cells(1,2)
Sheets("Auswertung").cells(1,3)=Sheets("Daten").cells(1,3)
Sheets("Auswertung").cells(1,4)=Sheets("Daten").cells(1,6)
Sheets("Auswertung").cells(1,5)=Sheets("Daten").cells(1,7)
Sheets("Auswertung").cells(1,6)=Sheets("Daten").cells(1,5)

'----- für die Zellen: C2 D2 E2 F2 G2

Sheets("Auswertung").cells(1,7)=Sheets("Daten").cells(2,3)
Sheets("Auswertung").cells(1,8)=Sheets("Daten").cells(2,4)
Sheets("Auswertung").cells(1,9)=Sheets("Daten").cells(2,5)
Sheets("Auswertung").cells(1,10)=Sheets("Daten").cells(2,6)
Sheets("Auswertung").cells(1,11)=Sheets("Daten").cells(2,7)

'----- für die Zellen: C3 D3 E3 F3 G3


Sheets("Auswertung").cells(1,12)=Sheets("Daten").cells(3,3)
Sheets("Auswertung").cells(1,13)=Sheets("Daten").cells(3,4)
Sheets("Auswertung").cells(1,14)=Sheets("Daten").cells(3,5)
Sheets("Auswertung").cells(1,15)=Sheets("Daten").cells(3,6)
Sheets("Auswertung").cells(1,16)=Sheets("Daten").cells(3,7)

usw.

So kann man erstmal die ersten 37 Zeilen schreiben.

Dannach muß man mal schauen, wie man das in eine Schleife packt... so wie bei meinem ersten Beispiel.

Finde ich bestimmt auch noch was.

Morgen geht's weiter..

Gruss Andreas

Antwort 19 von JaO1000

Klasse Andreas, echt cool-

ich werds gleich mal testen und leg mich dann hin-

bis morgen und vielen Dank wieder mal für deinen Einsatz!

Schönen Abend noch
Jan

Antwort 20 von JaO1000

Hab ein Problem, den neuen Scriptteil in den das alte Makro einzubauen (ich kenne ja die ganzen VBA Befehle und die Syntax nicht).

Kannst du mir bitte nochmal den Script als Ganzes posten, wenn du Zeit hast?

Vielen Dank
Jan

Antwort 21 von Kauz

Hallo Jan...

Ich bin dabei!

Ist eine Fleisaufgabe, daher dauert es noch ein wenig.

Gruss Andreas

Antwort 22 von JaO1000

Kein Problem, ich habe Geduld :D

Antwort 23 von Kauz

Hallo Jan...

bin dabei!

Ist eine Fleiss-Arbeit... dauert ein wenig.

Gruss Andreas

Antwort 24 von JaO1000

wenn ich dir helfen kann, sag Bescheid, ansonsten Danke nochmal!

Wie funktioniert das hier mit dem Online-Stellen der Excel-Datei? Vielleicht kann dir die ein wenig weiterhelfen!

mfG
Jan

Antwort 25 von Kauz

Hallo Jan...
Ich hab arge Probleme mit dem Posten:
Sende was ab... scheint alles iO.
Kann aber anschließend das Posting nicht sehen.
Kann also sein, dass dies hier auch wieder doppelt kommt.
Das hochladen wird meist über netupload gemacht, und dann der link dazu hier eingestellt.
Kenn ich mich auch nicht mit aus.. hab ich noch nicht gemacht.
Schau mal in Deinen Pager: Kannst mir direkt zumailen.

Hier nun meine Fleißarbeit in zwei Teilen, weil mir gezeigt wird : maximal 10000Zeichen.

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



For i = 0 To Anzahl
'----- für die Zellen: D1 B1 C1 F1 G1 E1

Sheets("Auswertung").Cells(1 + i, 1) = Sheets("Daten").Cells(1 + i * 37, 4)
Sheets("Auswertung").Cells(1 + i, 2) = Sheets("Daten").Cells(1 + i * 37, 2)
Sheets("Auswertung").Cells(1 + i, 3) = Sheets("Daten").Cells(1 + i * 37, 3)
Sheets("Auswertung").Cells(1 + i, 4) = Sheets("Daten").Cells(1 + i * 37, 6)
Sheets("Auswertung").Cells(1 + i, 5) = Sheets("Daten").Cells(1 + i * 37, 7)
Sheets("Auswertung").Cells(1 + i, 6) = Sheets("Daten").Cells(1 + i * 37, 5)

'----- für die Zellen: C2 D2 E2 F2 G2 bis C4 D4 E4 F4 G4
For j = 0 To 2
Sheets("Auswertung").Cells(1 + i, 7 + j * 5) = Sheets("Daten").Cells(2 + j + i * 37, 3)
Sheets("Auswertung").Cells(1 + i, 8 + j * 5) = Sheets("Daten").Cells(2 + j + i * 37, 4)
Sheets("Auswertung").Cells(1 + i, 9 + j * 5) = Sheets("Daten").Cells(2 + j + i * 37, 5)
Sheets("Auswertung").Cells(1 + i, 10 + j * 5) = Sheets("Daten").Cells(2 + j + i * 37, 6)
Sheets("Auswertung").Cells(1 + i, 11 + j * 5) = Sheets("Daten").Cells(2 + j + i * 37, 7)
Next j
'----- für die Zellen: C5 D5 E5 F5

Sheets("Auswertung").Cells(1 + i, 22) = Sheets("Daten").Cells(5 + i * 37, 3)
Sheets("Auswertung").Cells(1 + i, 23) = Sheets("Daten").Cells(5 + i * 37, 4)
Sheets("Auswertung").Cells(1 + i, 24) = Sheets("Daten").Cells(5 + i * 37, 5)
Sheets("Auswertung").Cells(1 + i, 25) = Sheets("Daten").Cells(5 + i * 37, 6)

'----- für die Zellen: C6 D6 E6 F6 G6 bis C8 D8 E8 F8 G8
For j = 0 To 2
Sheets("Auswertung").Cells(1 + i, 26 + j * 5) = Sheets("Daten").Cells(6 + j + i * 37, 3)
Sheets("Auswertung").Cells(1 + i, 27 + j * 5) = Sheets("Daten").Cells(6 + j + i * 37, 4)
Sheets("Auswertung").Cells(1 + i, 28 + j * 5) = Sheets("Daten").Cells(6 + j + i * 37, 5)
Sheets("Auswertung").Cells(1 + i, 29 + j * 5) = Sheets("Daten").Cells(6 + j + i * 37, 6)
Sheets("Auswertung").Cells(1 + i, 30 + j * 5) = Sheets("Daten").Cells(6 + j + i * 37, 7)
Next j
'----- für die Zellen: C9 D9 E9 F9 bis C11 D11 E11 F11
For j = 0 To 2
Sheets("Auswertung").Cells(1 + i, 41 + j * 4) = Sheets("Daten").Cells(9 + j + i * 37, 3)
Sheets("Auswertung").Cells(1 + i, 42 + j * 4) = Sheets("Daten").Cells(9 + j + i * 37, 4)
Sheets("Auswertung").Cells(1 + i, 43 + j * 4) = Sheets("Daten").Cells(9 + j + i * 37, 5)
Sheets("Auswertung").Cells(1 + i, 44 + j * 4) = Sheets("Daten").Cells(9 + j + i * 37, 6)
Next j

'----- für die Zellen: C12 D12 E12 F12 G12 bis C18 D18 E18 F18 G18
For j = 0 To 6
Sheets("Auswertung").Cells(1 + i, 53 + j * 5) = Sheets("Daten").Cells(12 + j + i * 37, 3)
Sheets("Auswertung").Cells(1 + i, 54 + j * 5) = Sheets("Daten").Cells(12 + j + i * 37, 4)
Sheets("Auswertung").Cells(1 + i, 55 + j * 5) = Sheets("Daten").Cells(12 + j + i * 37, 5)
Sheets("Auswertung").Cells(1 + i, 56 + j * 5) = Sheets("Daten").Cells(12 + j + i * 37, 6)
Sheets("Auswertung").Cells(1 + i, 57 + j * 5) = Sheets("Daten").Cells(12 + j + i * 37, 7)
Next j

'----- für die Zellen: C19 D19 E19 F19

Sheets("Auswertung").Cells(1 + i, 88) = Sheets("Daten").Cells(19 + i * 37, 3)
Sheets("Auswertung").Cells(1 + i, 89) = Sheets("Daten").Cells(19 + i * 37, 4)
Sheets("Auswertung").Cells(1 + i, 90) = Sheets("Daten").Cells(19 + i * 37, 5)
Sheets("Auswertung").Cells(1 + i, 91) = Sheets("Daten").Cells(19 + i * 37, 6)

'----- für die Zellen: C20 D20 E20 F20 G20 - Bis - C22 D22 E22 F22 G22

For j = 0 To 2
Sheets("Auswertung").Cells(1 + i, 92 + j * 5) = Sheets("Daten").Cells(20 + j + i * 37, 3)
Sheets("Auswertung").Cells(1 + i, 93 + j * 5) = Sheets("Daten").Cells(20 + j + i * 37, 4)
Sheets("Auswertung").Cells(1 + i, 94 + j * 5) = Sheets("Daten").Cells(20 + j + i * 37, 5)
Sheets("Auswertung").Cells(1 + i, 95 + j * 5) = Sheets("Daten").Cells(20 + j + i * 37, 6)
Sheets("Auswertung").Cells(1 + i, 96 + j * 5) = Sheets("Daten").Cells(20 + j + i * 37, 7)
Next j

'----- für die Zellen: C23 D23 E23 F23 bis C24 D24 E24 F24
For j = 0 To 1
Sheets("Auswertung").Cells(1 + i, 107 + j * 4) = Sheets("Daten").Cells(23 + j + i * 37, 3)
Sheets("Auswertung").Cells(1 + i, 108 + j * 4) = Sheets("Daten").Cells(23 + j + i * 37, 4)
Sheets("Auswertung").Cells(1 + i, 109 + j * 4) = Sheets("Daten").Cells(23 + j + i * 37, 5)
Sheets("Auswertung").Cells(1 + i, 110 + j * 4) = Sheets("Daten").Cells(23 + j + i * 37, 6)
Next j

'----- für die Zellen: C25 D25 E25 F25 G25 - Bis - C26 D26 E26 F26 G26

For j = 0 To 1
Sheets("Auswertung").Cells(1 + i, 115 + j * 5) = Sheets("Daten").Cells(25 + j + i * 37, 3)
Sheets("Auswertung").Cells(1 + i, 116 + j * 5) = Sheets("Daten").Cells(25 + j + i * 37, 4)
Sheets("Auswertung").Cells(1 + i, 117 + j * 5) = Sheets("Daten").Cells(25 + j + i * 37, 5)
Sheets("Auswertung").Cells(1 + i, 118 + j * 5) = Sheets("Daten").Cells(25 + j + i * 37, 6)
Sheets("Auswertung").Cells(1 + i, 119 + j * 5) = Sheets("Daten").Cells(25 + j + i * 37, 7)
Next j

'----- für die Zellen: C28 D28 E28 F28

Sheets("Auswertung").Cells(1 + i, 125) = Sheets("Daten").Cells(28 + i * 37, 3)
Sheets("Auswertung").Cells(1 + i, 126) = Sheets("Daten").Cells(28 + i * 37, 4)
Sheets("Auswertung").Cells(1 + i, 127) = Sheets("Daten").Cells(28 + i * 37, 5)
Sheets("Auswertung").Cells(1 + i, 128) = Sheets("Daten").Cells(28 + i * 37, 6)

Antwort 26 von Kauz

'----- für die Zellen: C29 D29 E29 F29 G29
Sheets("Auswertung").Cells(1 + i, 129) = Sheets("Daten").Cells(29 + i * 37, 3)
Sheets("Auswertung").Cells(1 + i, 130) = Sheets("Daten").Cells(29 + i * 37, 4)
Sheets("Auswertung").Cells(1 + i, 131) = Sheets("Daten").Cells(29 + i * 37, 5)
Sheets("Auswertung").Cells(1 + i, 132) = Sheets("Daten").Cells(29 + i * 37, 6)
Sheets("Auswertung").Cells(1 + i, 133) = Sheets("Daten").Cells(29 + i * 37, 7)

'----- für die Zellen: C30 D30 E30 F30 bis C32 D32 E32 F32
For j = 0 To 2
Sheets("Auswertung").Cells(1 + i, 134 + j * 4) = Sheets("Daten").Cells(30 + j + i * 37, 3)
Sheets("Auswertung").Cells(1 + i, 135 + j * 4) = Sheets("Daten").Cells(30 + j + i * 37, 4)
Sheets("Auswertung").Cells(1 + i, 136 + j * 4) = Sheets("Daten").Cells(30 + j + i * 37, 5)
Sheets("Auswertung").Cells(1 + i, 137 + j * 4) = Sheets("Daten").Cells(30 + j + i * 37, 6)
Next j

'----- für die Zellen: C33 D33 E33 F33 G33

Sheets("Auswertung").Cells(1 + i, 146) = Sheets("Daten").Cells(33 + i * 37, 3)
Sheets("Auswertung").Cells(1 + i, 147) = Sheets("Daten").Cells(33 + i * 37, 4)
Sheets("Auswertung").Cells(1 + i, 148) = Sheets("Daten").Cells(33 + i * 37, 5)
Sheets("Auswertung").Cells(1 + i, 149) = Sheets("Daten").Cells(33 + i * 37, 6)
Sheets("Auswertung").Cells(1 + i, 150) = Sheets("Daten").Cells(33 + i * 37, 7)


'----- für die Zellen: C34 D34 E34 F34

Sheets("Auswertung").Cells(1 + i, 151) = Sheets("Daten").Cells(34 + i * 37, 3)
Sheets("Auswertung").Cells(1 + i, 152) = Sheets("Daten").Cells(34 + i * 37, 4)
Sheets("Auswertung").Cells(1 + i, 153) = Sheets("Daten").Cells(34 + i * 37, 5)
Sheets("Auswertung").Cells(1 + i, 154) = Sheets("Daten").Cells(34 + i * 37, 6)

'----- für die Zellen: C35 D35 E35 F35 G35

Sheets("Auswertung").Cells(1 + i, 155) = Sheets("Daten").Cells(35 + i * 37, 3)
Sheets("Auswertung").Cells(1 + i, 156) = Sheets("Daten").Cells(35 + i * 37, 4)
Sheets("Auswertung").Cells(1 + i, 157) = Sheets("Daten").Cells(35 + i * 37, 5)
Sheets("Auswertung").Cells(1 + i, 158) = Sheets("Daten").Cells(35 + i * 37, 6)
Sheets("Auswertung").Cells(1 + i, 159) = Sheets("Daten").Cells(35 + i * 37, 7)


'----- für die Zellen: C36 D36 E36 F36

Sheets("Auswertung").Cells(1 + i, 160) = Sheets("Daten").Cells(36 + i * 37, 3)
Sheets("Auswertung").Cells(1 + i, 161) = Sheets("Daten").Cells(36 + i * 37, 4)
Sheets("Auswertung").Cells(1 + i, 162) = Sheets("Daten").Cells(36 + i * 37, 5)
Sheets("Auswertung").Cells(1 + i, 163) = Sheets("Daten").Cells(36 + i * 37, 6)

'----- für die Zellen: C37 D37 E37 F37 G37

Sheets("Auswertung").Cells(1 + i, 164) = Sheets("Daten").Cells(37 + i * 37, 3)
Sheets("Auswertung").Cells(1 + i, 165) = Sheets("Daten").Cells(37 + i * 37, 4)
Sheets("Auswertung").Cells(1 + i, 166) = Sheets("Daten").Cells(37 + i * 37, 5)
Sheets("Auswertung").Cells(1 + i, 167) = Sheets("Daten").Cells(37 + i * 37, 6)
Sheets("Auswertung").Cells(1 + i, 168) = Sheets("Daten").Cells(37 + i * 37, 7)

Next i
Sheets("Auswertung").Activate
Sheets("Auswertung").Range("A1").Activate


Bau das mal ein... probier aus... und meckere dann über die Fehler :-)

Gruss Andreas

Antwort 27 von JaO1000

Oh man, ich krieg den Mund nicht mehr zu.

Wie hast du das denn so schnell hinbekommen? Echt klasse- ich weiß nicht wie, aber ich würd mich gerne revanchieren- du kannst gern darauf zurückkommen.

Aber ;)

Ich müsste noch wissen, was ich ändern muss, damit das Makro mir die Daten erst ab der 2. Zeile im Tabellenblatt "Daten" hinlegt!
(wenn ich ganz oben im Script "For i=0" in "For i=1" umändere, geht mir logischerweise der erste Datensatz aus Tabelle1 verloren, da dieser ja einfach übersprungen wird)

War es richtig, deinen Script von oben noch um "Sub Umsortieren ()" und "End Sub" zu ergänzen?

Was kann ich dagegen tun?

Ansonsten schaue ich gerade weiter nach, welche Zeilen noch nicht so kopiert wurden wie sie sollten. Ich melde mich dann gleich!

Vielen Dank
Jan

Antwort 28 von JaO1000

ups Fehler:

ich meinte:

Den Script möchte ich so ändern, dass mir das Makro die Daten erst ab der 2. Zeile im Tabellenblatt "AUSWERTUNG" hinlegt.

Sorry

Antwort 29 von Kauz

Hallo Jan...
jetzt hast Du eine Fleißaufgabe:
Sheets("Auswertung").Cells(1 + i, 1) = Sheets("Daten").Cells(1 + i * 37, 4)
Ändern in:
Sheets("Auswertung").Cells(2 + i, 1) = Sheets("Daten").Cells(1 + i * 37, 4)
Du mußt also aus der ersten Eins von links eine Zwei machen.

Das mit dem Sub und End ist richtig!

Was passiert, wenn Du aus der Null eine Eins machst, hast Du auch richtig erkannt!

na, dann Tipp mal schön...

Gruss Andreas

Antwort 30 von JaO1000

Damit hatte ich mich schon abgefunden- das mit dem Umtippen hatte ich mir nämlich auch gedacht, ich wollts nur nochmal bestätigt sehen.

Okay, dann mach ich das nachher mal fertig!


Vielen Dank,

soweit ich das sehe, funktioniert das alles prächtig (man ist das geil, ich glaubs ja nicht)

Ich meld mich

Jan

Antwort 31 von nighty

hi kauz :-)

dein einsatz ist ja klasse :-))

gruss nighty

Antwort 32 von JaO1000

Wow Andreas,

das Kopieren funktioniert perfekt.

Wiegesagt, ich weiß nicht wie ich dir danken soll, echt mal!


Wenn du Hilfe bei was brauchst, melde dich bitte!


Mit freundlichem Gruß
Jan

Antwort 33 von Kauz

Hallo Jan...

schön, das ich Dir helfen konnte.

Klasse, das Du sooooo begeistert bist.

Denn so eine Rückmeldung ist für die Helfer in diesem Forum der schönste Lohn!

Viel Spaß mit der Lösung....

bis vielleicht zum nächsten Problem.

Gruss Andreas

PS.: Was machst Du jetzt eigentlich mit der gesparten Zeit? :-)

Antwort 34 von JaO1000

Hallo an alle,


ich habe das Makro jetzt lange getestet und die Arbeitsmappe so gut wie fertig.

Allerdings tritt bei mir folgendes Problem auf:

Einige Tabellen greifen auf die Auswertungstabelle zu, die durch das Makro erstellt wurde.
Und diese Zugriffe erfolgen zeitlich mit der Erstellung des Makros- d.h. während das Makro erstellt wird, greifen sie bereits auf die Tabelle 2, "Auswertung" zu und rechnen mit den Werten weiter.

Während sich die Tabelle2 durch das Makro noch im Aufbau befindet, werden die Berechnungen im Hintergrung durch die sich ändernden Daten ständig wiederholt.

Ich möchte also Folgendes:

Das Makro soll die Daten erst in eine Hilfstabelle speisen, auf die kein anderes Tabellenblatt zugreift.
Nach dem letzten Schleifendurchlauf (=letztezeile/37) soll der komplette Inhalt der Tabelle sozusagen mit einem Schlag in die richtige Tabelle2 ("Auswertung") kopiert werden und die Hilfstabelle soll verschwinden.


Wie nur macht man das?


Vielen Dank
Jan

Antwort 35 von JaO1000

@Andreas-

die Zeit spare im Endeffekt nicht ich, sondern die Mitarbeiter vom Sozialen Dienst hier in der Behindertenwerkstatt, in der ich gerade Zivi bin.

Die wollten mir übrigens alle gar nicht glauben, dass man über das Internet so schnell hilfsbereite und fähige Leute findet- naja jetzt wissen sie's!

Mit dem Makro können sie nämlich die nächsten Mitarbeitererhebungen viel problemloser und schneller durchführen und sich um ihre eigentlichen Aufgaben kümmern- nämlich nicht die Aufbereitung von Daten, sondern die Verbesserung des Wohn- und Arbeitsumfelds unserer behinderten Beschäftigten!

So hast du letztenendes auch Ihnen geholfen!

Antwort 36 von Kauz

Hallo Jan....
ich gehe mal davon aus, das es sich um Zellenformeln handelt, die beim Umsortieren ständig Werte aktualisieren.
Wenn es kein anderes Makro ist, was Dir da Probleme macht, versuch folgendes:

Füge die beiden Codeteile zwischen den gestichelten Linien mit ein. Die Stellen sind einmal ganz am Anfang und das zweite am Ende des bisherigen Code's.

' Der Wert geteilt durch 37 ergibt die Anzahl der Schleifendurchläufe.

' ------------------------------------ automatische Berechnung abschalten -------------------------
With Application
.Calculation = xlManual
.MaxChange = 0.001
End With
ActiveWorkbook.PrecisionAsDisplayed = False
' -----------------------------------------------------------------------------------

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

-
--
-
-
'----- für die Zellen: C37 D37 E37 F37 G37

Sheets("Auswertung").Cells(1 + i, 164) = Sheets("Daten").Cells(37 + i * 37, 3)
Sheets("Auswertung").Cells(1 + i, 165) = Sheets("Daten").Cells(37 + i * 37, 4)
Sheets("Auswertung").Cells(1 + i, 166) = Sheets("Daten").Cells(37 + i * 37, 5)
Sheets("Auswertung").Cells(1 + i, 167) = Sheets("Daten").Cells(37 + i * 37, 6)
Sheets("Auswertung").Cells(1 + i, 168) = Sheets("Daten").Cells(37 + i * 37, 7)

Next i
' ----------------------------- automatische Berechnung einschalten --------
With Application
.Calculation = xlAutomatic
.MaxChange = 0.001
End With
ActiveWorkbook.PrecisionAsDisplayed = False
' -----------------------------------------------------------------------------------

Sheets("Auswertung").Activate
Sheets("Auswertung").Range("A1").Activate
End Sub

So, nu muß ich aber fix los zur Spätschicht.. bis denne.

Gruss Andreas


Ps.: Das freut mich besonders, das ich damit Menschen helfe, die sich der Betreuung hilfebedürftiger Menschen verschrieben haben!

Antwort 37 von JaO1000

Hi Andreas,

vielen Dank für die wie üblich blitzsaubere Antwort- jetzt funktioniert das Makro perfekt und vor allem schnell!


Eine Frage, wenn du von deiner Spätschicht zurück bist:

Wie und von wem hast du die Scriptsprache gelernt? Privat (wenn ja mit welchen Hilfsmitteln) oder beruflich?


Cu
Jan

Antwort 38 von Kauz

Hallo Jan...
hab gerade Pause

Hier eine kurze Beschreibung auf Deine letzte Frage:

Beruflich hab ich nichts mit PC-Programmierung zu tun.

Das ist alles Hobby und im Laufe der Jahre gewachsen.
Die erste Berührung war ca. 1986. Ein Poket-Computer von Sharp mit sagenhaften 4Kilobyte Programmspeicher für Basic.
Das ist mehr ein aufgemotzter Taschenrechner. (Lcd-Display mit 16 Zeichen)

Mich hat es von Anfang an interessiert etwas selbst zu machen,
anstatt nur User zu sein.

Dann kam ein <Plus4> von Commodore. Bessere Variante der 'Brotkiste' C64.
Es folgte ein Amiga500... daraus wurde dann noch ein Amiga1200.
Auf jedem der Rechner hab ich in den verschiedenen Basic-Varianten irgendwas programiert.


Die Pleite von Commodore trieb mich dann zum PC.

Auf dem hab ich mit der basicähnlichen Sprache Pascal weitergemacht.

Nach einer größeren Pause hab ich dann vor ca. 4Jahren entdeckt, das man hinter den Office-Anwendungen auch programmieren kann.
Nu lässt mich der 'Makro-Virus' nicht mehr los!

Für die Firma habe ich einen Schicht-Urlaubsplan in Excel erstellt, der in den letzten 2,5 Jahren immer mehr gewachsen ist.

Das alles war bis vor ca. 2Jahren reines Selbststudium. (Gab niemanden den ich hätte Fragen können)
(Try and Error plus diversen Büchern)

Da hab ich mich ins Internet gewagt und mir Info's aus verschiedenen Foren geholt.
( Die Archive durchforstet, ob ne Lösung für's Augenblickliche Problem zu finden ist.)

FAZIT:
Wenn man wirklich Lust dazu hat, und nicht gleich aufgibt, wenn's mal nen Problem gibt, kann man sich das schon selbst erarbeiten.
Da hilft es auch mal ne Pause von ein paar Tagen einzulegen, um danach mit neuen Gedanken an dem Problem weiter zu machen.

Die Möglichkeiten des Internetz's hätte ich mir damals gewünscht.

Ein Tipp für's Excel:
Eine einmalige Aktion kann man mit dem Makrorekorder aufzeichnen:
So ist auch der Code entstanden um das Berechnen zeitweilig abzuschalten.

Wie färbe ich eine Zelle mit VBA ein.... Makrorekorder anschmeißen.
Auch die Indexhilfe von Excel kann sehr nützlich sein.

Das noch als kleine Anregung. :-)

Gruss Andreas

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: