Hallo zusammen. Ich hoffe, mir kann hier vielleicht jemand ein wenig auf die Sprünge helfen, denn ich stecke momentan fest.
Ich habe einen recht umfangreichen Datensatz in Excel importiert, kann aber mit der Ursprungsform nicht viel anfangen, weshalb er komplett umgeformt werden muss. Dazu habe ich ein Makro, das allerdings nur bedingt tut, was es soll. Bedingt heißt, der Großteil der Werte wird neu angeordnet, es bleiben aber sporadisch einfach mehrere Werte in einer Zeile stehen und werden ignoriert. Eine Bearbeitung "von Hand" ist aus Zeitgründen unmöglich.
Meine VBA-Kenntnisse sind leider arg begrenzt und reichen definitiv nicht aus, um den Fehler im Makro (das ich nicht selbst geschrieben) zu beheben.
Was muss gemacht werden:
Es handelt sich um eine Datensatz mit X-,Y- und Z-Werten. Jedem Y-Wert werden 35 X- und 35 Z-Werte zugeordnet. Was das Makro auch brav macht. Eine Zeit lang.
Der Großteil der Daten ist in der Rohform in Gruppen zu je fünf Z-Werten angeordnet, die vom Makro dann sukzessiv in eine Zeile kopiert werden. Ist eine Zeile voll, hat also jeder X-Wert des momentanen Y-Wertes seinen Z-Wert erhalten, springt das Makro eine Zeile nach unten und macht dort weiter.
Was läuft schief:
Im Rohdatensatz gibt es einige Zeilen, die statt fünf Werten bis zu 13 Werte enthalten. Werden diese kopiert ist die noch offene Zahl an Zellen kein Vielfaches von 5 mehr. Es bleibt z.B. noch eine Zelle übrig, bevor der Zeilenwechsel stattfinden müsste. Weshalb das Makro dann meist auch nur den einen Wert einfügt und den Rest stehen lässt wo er ist. Danach wird zu einem neuen Y-Wert gewechselt (klar, der vorherige Y-Wert ist nun abgeschlossen). Nun werden aber nicht die restlichen Daten der angefangenen Zeile eingefügt, sondern die Auswahl ignoriert die übrigen Daten und springt eine Zeile nach unten, um dort weiter zu machen.
Hier der Makro-Quellcode:
Schonmal vielen Dank im Voraus!
Edit: Von Spoiler nach Code geändert.
Ich habe einen recht umfangreichen Datensatz in Excel importiert, kann aber mit der Ursprungsform nicht viel anfangen, weshalb er komplett umgeformt werden muss. Dazu habe ich ein Makro, das allerdings nur bedingt tut, was es soll. Bedingt heißt, der Großteil der Werte wird neu angeordnet, es bleiben aber sporadisch einfach mehrere Werte in einer Zeile stehen und werden ignoriert. Eine Bearbeitung "von Hand" ist aus Zeitgründen unmöglich.
Meine VBA-Kenntnisse sind leider arg begrenzt und reichen definitiv nicht aus, um den Fehler im Makro (das ich nicht selbst geschrieben) zu beheben.
Was muss gemacht werden:
Es handelt sich um eine Datensatz mit X-,Y- und Z-Werten. Jedem Y-Wert werden 35 X- und 35 Z-Werte zugeordnet. Was das Makro auch brav macht. Eine Zeit lang.
Der Großteil der Daten ist in der Rohform in Gruppen zu je fünf Z-Werten angeordnet, die vom Makro dann sukzessiv in eine Zeile kopiert werden. Ist eine Zeile voll, hat also jeder X-Wert des momentanen Y-Wertes seinen Z-Wert erhalten, springt das Makro eine Zeile nach unten und macht dort weiter.
Was läuft schief:
Im Rohdatensatz gibt es einige Zeilen, die statt fünf Werten bis zu 13 Werte enthalten. Werden diese kopiert ist die noch offene Zahl an Zellen kein Vielfaches von 5 mehr. Es bleibt z.B. noch eine Zelle übrig, bevor der Zeilenwechsel stattfinden müsste. Weshalb das Makro dann meist auch nur den einen Wert einfügt und den Rest stehen lässt wo er ist. Danach wird zu einem neuen Y-Wert gewechselt (klar, der vorherige Y-Wert ist nun abgeschlossen). Nun werden aber nicht die restlichen Daten der angefangenen Zeile eingefügt, sondern die Auswahl ignoriert die übrigen Daten und springt eine Zeile nach unten, um dort weiter zu machen.
Hier der Makro-Quellcode:
Code:
Application.ScreenUpdating = False
Columns("A:M").Select
Selection.Replace What:="???? =", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:=";", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Selection.Replace What:="}", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Range("AJ1").Select
ActiveCell.FormulaR1C1 = "999"
Columns("A:M").Select
Selection.Replace What:=" ", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Range("A3:M3").Select
Selection.Cut
Range("N2").Select
Selection.End(xlToLeft).Select
ActiveCell.Offset(0, 1).Select
ActiveSheet.Paste
Range("A4").Select
1
n = 0
While n < 8
2
Application.ScreenUpdating = False
If ActiveCell.Offset(0, 1) = 0 Then GoTo 3
Range(Selection, Selection.End(xlToRight)).Select
3 Selection.Cut
Selection.End(xlUp).Select
If ActiveCell.Offset(0, 1) <> 0 Then GoTo 5
GoTo 6
5 Selection.End(xlToRight).Select
6 ActiveCell.Offset(0, 1).Range("A1").Select
ActiveSheet.Paste
Selection.End(xlToLeft).Select
Selection.End(xlDown).Select
If ActiveCell = Range("a83500") Then GoTo 1000
n = n + 1
Wend
Selection.End(xlUp).Select
Selection.End(xlToRight).Select
If ActiveCell.Offset(-1, 1) <> 999 Then GoTo 7
Selection.End(xlToLeft).Select
Selection.End(xlDown).Select
GoTo 1
7 ActiveCell.Offset(-1, 0).Range("A1").Select
If ActiveCell <> 999 Then GoTo 8
ActiveCell.Offset(1, 0).Range("A1").Select
GoTo 10
8 Selection.End(xlToLeft).Select
If ActiveCell <> 999 Then GoTo 2000
9 ActiveCell.Offset(1, 0).Range("A1").Select
Range(Selection, Selection.End(xlToRight)).Select
10 Selection.Cut
Selection.End(xlToLeft).Select
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveSheet.Paste
ActiveCell.Offset(-1, 0).Range("A1").Select
Selection.End(xlToRight).Select
ActiveCell.Offset(0, 1).Range("A1").Select
ActiveCell.FormulaR1C1 = "999"
11 If ActiveCell.Offset(1, 0) <> 0 Then GoTo 9
Selection.End(xlToLeft).Select
Selection.End(xlDown).Select
Selection.End(xlDown).Select
n = 0
GoTo 2
500 Stop
1000
Range("a2").Select
Selection.End(xlDown).Select
ActiveCell.Offset(-1, 0).Range("A1").Select
Selection.End(xlToRight).Select
If ActiveCell.Offset(1, 0) = 0 Then GoTo 2000
GoTo 11
2000
Range("a1").Select
Selection.End(xlDown).Select
Selection.End(xlDown).Select
If ActiveCell <> Range("a83500") Then GoTo 1
Range("a1").Select
End Sub
Schonmal vielen Dank im Voraus!
Edit: Von Spoiler nach Code geändert.
Zuletzt bearbeitet: