VBA-Code-Erzeugung zur Laufzeit

VBA bietet nicht nur die Möglichkeit, manuelle Abläufe zu automatisieren, sondern auch neuen VBA-Code dynamisch zur Laufzeit zu erzeugen.

Als Anwendungsbeispiel dient dabei mein aktuellster Auftrag. Darin generiert ein Excel-VBA-Programm nach gewissen Regeln ein neues Workbook mit Daten. Bisher wurde dieses Workbook am Ende der Verarbeitung als eine ganz normale Excel-Tabelle im xslx-Format abgelegt, da darin ausschließlich Daten ohne Code enthalten waren. Nun hat sich herauskristallisiert, dass dieses dynamisch erzeugte Workbook doch noch eine kleine SUB-Routine benötigt, die gewisse Abläufe in diesem Workbook zu steuern hat

Um dies zu ermöglichen, habe ich mich dabei der VBA-Möglichkeit bedient, Codemodule zur Laufzeit zu generieren. Dafür ist die Aktivierung des Verweises „Microsoft Visual Basic for Applications Extensibility“ im VBA-Editor erforderlich. Damit ist sichergestellt, dass das Programm den Zugriff auf seine Codemodule erhält.

Wie funktioniert denn das Ganze? Im Listing weiter unten ist ein Codebeispiel abgebildet. Darin wird in der Auflistung mit den VBA-Komponenten die Methode Add aufgerufen. Diese Methode fügt im referenzierten Workbook ein allgemeines Modul hinzu und weist diesem einzelne Codezeilen zu. So wird „aus dem Nichts“ eine neue Methode generiert, die einer Schaltfläche zugewiesen oder aufgerufen werden kann.

    Dim workbookObject As Workbool
    Set workbookObject = Workbooks.Add

    With workbookObject.VBProject.VBComponents.Add(vbext_ct_StdModule).CodeModule
        .InsertLines 3, "Sub dynamischErzeugteSub()"
        .InsertLines 4, ""
        .InsertLines 5, "       MsgBox ""ein neues Modul wurde erzeugt"""
        .InsertLines 6, ""
        .InsertLines 7, "End Sub"
    End With
Fazit

Zum Schluss sei noch gesagt, dass diese Art der Codeerzeugung gut überlegt eingesetzt werden sollte. Im Beispiel ist erkennbar, dass es im Code für mehr Komplexität sorgt. In den Einsatzgebieten, wo ein Workbook komplett dynamisch erzeugt wird, ist diese beschriebene Vorgehensweise jedoch oft die einzige Möglichkeit, neben Daten auch ausführbaren Code zur Laufzeit zu generieren.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.