Probleme mit Excel-Makro

Dirtbag

Enthusiast
Thread Starter
Mitglied seit
07.07.2007
Beiträge
298
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:
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:
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Quellcode bitte mit dem code tag einfügen dann geht die Formatierung nicht verlohren. Wobei ich angesichsts der vielen GoTo nicht glaube, dass das dann viel übersichtlicher ist.

---------- Beitrag hinzugefügt um 15:35 ---------- Vorheriger Beitrag war um 13:52 ----------

Das ist echt grausam.

Range("AJ1").Select
ActiveCell.FormulaR1C1 = "999"
[...]
If ActiveCell.Offset(-1, 1) <> 999 Then GoTo 7

Wäre auch zu einfach gewesen einfach bis 35 zu zählen... Nein da schreibt man lieber in Spalte 36 Zeile 1 die 999. Man prüft nicht ob die aktuelle Spalte die 35 ist sondern ob die Zeile drüber in der Spalte daneben die 999 steht. GoTo ist eine Sache aber das geht echt zu weit. Das kann man doch niemanden antun...

Sry aber eine Anpassung des bestehenden Quellcodes halte ich für unmöglich. Wegschmeißen und komplett neu schreiben wäre in jedem Fall deutlich einfacher.
 
Das habe ich schon fast befürchtet, dass man das Makro wohl am besten neu schreibt. Ich werd das mal so weitergeben. :d

Tut mir leid wegen des grausigen Codes, ich wollte niemandem Kopfschmerzen bereiten.

Nach einigen Stunden rumprobieren hab ich es gestern dann mit Hilfe eines Kumpels, der Informatik studiert, noch hinbekommen. Allerdings ohne Excel. Er hat mir in C ein Programm geschrieben, was die Daten direkt aus der Quelldatei ausliest und in eine Textdatei richtig formatiert abspeichert. Damit wurde das ganze Makro-Problem umgangen.

Dennoch vielen Dank fürs Anschauen! :)
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh