VBA Code per VBA ändern

Hallo zusammen bei wewewa,

hatte das erst unter Tabellenkalkulation gepostet, ich Dummerchen …

schlag mich mal wieder mit EXCEL herum und raffs nicht.

Ich möchte aus einem bestehenden Workbook Code in ein anderes
Workbook schreiben, der Code soll dort den „Worksheet_Change“
eines Sheets abfangen.

Den nötigen Code habe ich in einer var codestring gespeichert,
und der tuts auch. Grundsätzlich funzt das Schreiben, aber
unter Umständen möchte EXCEL sich gerne bei MS melden, wegen
des Fehlerberichtes halt. Also EXCEL-Totalabsturz!

actWorkbook ist das zu ändernde Workbook und toChangeSheet ist
das zu ändernde Sheet.

If actWorkbook.VBProject.Protection = vbext\_pp\_locked Then
 MsgBox "VBA-Project is protected! Can´t change
it!", vbOKOnly
 Else
 If
actWorkbook.VBProject.VBComponents(toChangeSheet.CodeName).CodeModule
Is Nothing Then

actWorkbook.VBProject.VBComponents(toChangeSheet.CodeName).CodeModule.AddFromString
("")
 End If
 With
actWorkbook.VBProject.VBComponents(toChangeSheet.CodeName).CodeModule

 If .Find(" Worksheet\_Change(", 1, 1, -1, -1)
Then
 'StartLine =
.ProcBodyLine("Worksheet\_Change", vbext\_pk\_Proc)
 'startStr = Replace(.Lines(StartLine, 1),
"Worksheet\_Change(", "Worksheet\_Change\_old(")
 '.ReplaceLine StartLine, startStr
 '.AddFromString (codestring)
 MsgBox "Existing sub ""Worksheet\_Change""
could not be replaced!", vbOKOnly
 Else
 .AddFromString (codestring)
 End If

 End With
 End If

Was muss alles passen, damit das .AddFromString „immer“
erfolgreich ist?

Die auskommentierten Fragmente sollten den etwa schon
vorhandenen Code löschen, klappt aber noch weniger… Ich
habe den Eindruck, dass der Eventhandler nicht zur Laufzeit
verändert werden darf. Hat da vileicht jemand Erfahrung?

mfg ein leicht frustierter

Dirk.Pegasus

Hi Dirk,

was Du mal probieren kannst (so habe ich mal eine Ereignisroutine per Code deaktiviert).

Setze einfach vor die Programmzeilen ein Hochkomma. So wird die Ereignisroutine zwar noch aufgerufen, aber sie tut nix mehr. Bei mir lautet die entscheidende Zeile:

Application.VBE.VBProjects(„PfB“).VBComponents(„Tabelle_17“).CodeModule.ReplaceLine 4, „’“ & strCode

Ich hoffe, ich konnte helfen.

Viele Grüße
Martin

Hallo Martin,

werds mal probieren. Vielen Dank für den Tipp.

Falls dann der Thread noch da ist, werd ich mich melden.

mfg

Dirk.Pegasus

Hi Dirk,

…geht außerdem mittels:

Application.EnableEvents = False

Hast Du das schon probiert?
Martin

Hallo Martin,

vielen Dank für den Hinweis.

Application.EnableEvents = False

Hab ich probiert aber das ist auch nicht die Lösung (werd’s aber nochmal prüfen …)

Zu meinem gewünschten Ablauf:

Der User öffnet ein eigenes Workbook (UserBook) und mein Workbook (codeBook). Aus UserBook startet er ein Makro in codeBook. Dieses soll in dem aktiven Sheet in userBook einen „Eventhandler“ für Worksheet_Change einbauen und mit Code füllen. Das klappt, wenn kein Handle da ist.

Wenn einer da ist würde ich diesen gerne umbenennen (nach einer Meldung versteht sich!) und meinen Handle einfügen. Dabei gibt EXCEL „den Löffel“ ab.

Es scheint mir, dass der Eventhandler ständig lauscht, Weswegen ich auch Application.EnableEvents = False einegbaut habe. Aber ob der wirklich schläft oder nur die Ausführung seines Codes unterbunden wird, ist mir schleierhaft.

Da der Absturz auch ziemlich ultimativ ist, bleibt auch keine Chance zu debuggen.

Da fällt mir beim Schreiben noch etwas ein: Dein vorheriger Tipp zusammen mit dem was ich aktuell mache: Alle vorhandenen Zeilen des eventuell vorhandenen Handlers auskommentieren und die neuen einfügen. Das werd ich mal versuchen. Löst (falls erfolgreich) zwar nicht das Problem, währe aber ein akzeptabler Workaround!

mfg

Dirk.Pegasus

Hi Dirk,

ich muß gestehen, daß ich immer noch nicht ganz kapiere, was Du da vor hast. Das ist alles noch etwas zu abstrakt. Vielleicht holst Du noch ein bisserl weiter aus oder mailst mir was?!

Viele Grüße
Martin

Workaround gefunden!
Hallo zusammen,

hab jetzt dank der Tipps einen Workaround.

Das Löschen des „EventHandler“ „workbook_change“ oder auch das Umbenennen der zugehörigen Sub ist mE nicht möglich. Dürfte wohl für alle Eventhandler gelten, da die ja „aktiv“ lauschen. Alle Versuche sind kläglich gescheitert und ich geb das jetzt auf.

Workaround:
Alle Zeilen der ggfs. vorhandenen Sub auskommentieren und die neuen Zeilen eintragen. Wenn keine Sub da ist kann man diese komplett erzeugen. Kurze Nachricht an den User. Funzt!

@Mod: Wegen mir kannst du Sperre nun aufheben.

mfg

Dirk.Pegasus