Hi Forum.
Mit einem Makro gehe ich eine sehr große Exceltabelle durch. Es wird ein Worddokument erstellt, in welches für jede Zeile der Tabelle abhängig vom Inhalt Einträge gemacht werden. Da ich das Makro vor etwa 2 Jahren geschrieben habe, ist es ein ziemlicher spaghetti copy and paste code geworden.
Beispielzeilen aus dem Code:
... Overhead... Year = 3 ... Volume = 13 ...
With ThisWorkbook.Sheets(1)
For Each rngRow In .Range(.Cells(4, 1), .Cells(.Rows.Count, 1).End(xlUp))
If .Cells(rngRow.row, Year) = strJahr Then
...
...
If .Cells(rngRow.row, Volume) <> "" Then
objWord.writeline ("volume = {" & .Cells(rngRow.row, Volume) & "},")
End If
...
...
End If
Next rngRow
End With
...
Dies wollte ich jetzt ändern und die ewig langen Funktionen splitten. Dafür möchte ich die "writeline-Operationen"(es sind viele xD.. insbesondere insbesondere tauchen ähnliche zeilen häufig auf) in eine externe (public)Sub schreiben. (So als Nebenfrage: Ich habe dafür Module genommen. Ist das ok oder müssen es Class Module sein?)
Nun zum Problem:
Wenn ich das verwendette Sheet und die entsprechende Zeilenzahl an eine Sub übergebe (call doSomething(ThisWorkbook.Sheets(1), rngRow.row, objWord) um dort dann in der entsprechenden Zeile des entsprechenden Sheet Lesevorgänge zu starten, bekomme ich einen runtime error 1004.
Warum dieser kommt ist mir klar.
Aber wie kann ich das umgehen? Mein erster gedanke war, die Zeilenzahl zu nehmen in der Hauptfunktion eine Schleife drüber zu legen und das eigentliche Sheet erst in den Subs zu starten und beenden. Aber ich muss ja erst den Wert in der Spalte für das Jahr überprüfen. Soll ich das auch in eine seperate Funktion packen in der das Worksheet geöffnet und wieder geschlossen wird?
Ist das so ein guter Ansatz oder gibt es bessere herangehensweisen? bzw. ist das so denn performant? Es handeln sich um Tabellen die über 500 Zeilen haben können.
Danke schonmal im Voraus für die Hilfe und investierte Zeit.
Grüße.
|