Aktuelle Seite:
/vba/vbakonv.htm
Letzte Änderung: 24.06.2006

Getestet unter Word97Getestet unter Word2000  
Beispiel anzeigen
Makro/Datei speichern
Print

Mit diesem Makropaket ist es möglich, den VBA Code eines einzelnen Makros/einer Funktion oder eines gesamten Modules als HTML-Datei darzustellen.
Dabei werden VBA-Befehle, Parameter und Kommentarzeilen farblich hervorgehoben ( siehe Beispiel).

Die Auswahl des Makros erfolgt über Auswahllisten (ComboBoxen) hierarchisch nach Vorlage, Modul und Makro. Sofern in einem Modul ein Deklarationsbereich existiert, wird dieser über einen eigenen Listeneintrag angezeigt.
Neben der Konvertierung einzelner Makros/Funktionen besteht auch die Möglichkeit ein gesamtes Modul zu konvertieren.

Aufbau des Programmes:
  1. Einlesen der Schlüsselworte
  2. Prüfen, ob eine Vorlage geöffnet werden kann.
    (Bei Add-Ins oder geschützten Vorlagen ist kein Zugriff möglich)
  3. Einlesen der Modul-, Formular- bzw. Klassenmodulnamen
  4. Einlesen der Modul-, Formular- bzw. Klassenkomponenten
  5. Einlesen der Prozedurnamen
  6. Einlesen des Quellcodes
  7. Zeilenweise auf Schlüsselworte prüfen
  8. Gefundene Schlüsselworte den jeweiligen CSS-Definitionen zuweisen
  9. Schreiben der HTML-Datei

zu 1.

Als erstes werden die Schlüsselworte eingelesen. Diese liegen in einer separaten Datei 'vba.ini', die sich im selben Verzeichnis wie die Dokumentvorlage, in das Makro eingebunden ist, befinden muss.
Für jeden Schlüsselwort-Typ existiert ein eigener Abschnitt "Keywords", in dem die einzelnen Worte zeilenweise eingetragen sind.
Es wird dabei zwischen Befehlen und Parameter unterschieden.

Das Einlesen erfolgt mit Hilfe des API GetPrivateProfileSection wobei der Pfad zur .ini-Datei mit der Container-Funktion der VBA-Umgebung ermittelt wird:

 Set Makrovorlage = MacroContainer
 strFileName = Makrovorlage.Path & "\" & "vba.ini"
 strSectName = "Keywords 1"
 strSectName2 = "Keywords 2"
 lngRet = GetPrivateProfileSection(strSectName, strKeys, lngLen, strFileName)
 lngRet2 = GetPrivateProfileSection(strSectName2, strKeys2, lngLen, strFileName)

Da die Schlüsselworte anschließend als String in den beiden Variablen vorliegen, müssen die einzelnen Schlüsselworte noch getrennt und in ein Array eingelesen werden.

zu 2.

Anschließend werden alle verfügbaren Dokumentvorlagen geprüft, ob sie sich einlesen lassen.
Dieses ist notwendig, da ansonsten beim Versuch auf geschützte Projekte oder Projekte in Add-Ins zuzugreifen, ein Fehler gemeldet würde. Alle ungeschützten Projekte werden in eine Combobox geschrieben.

For myProjectNr = 1 To VBE.VBProjects.Count
If VBE.VBProjects(myProjectNr).Protection = vbext_pp_none Then ' 0=none, 1=yes
    ComboBox3.AddItem VBE.VBProjects(myProjectNr).Name
End If 

zu 3.

Das Einlesen der Module und Userforms einer Dokumentvorlage erfolgt erst zur Laufzeit, wenn die jeweilige Vorlage aus der Auswahlliste ausgewählt wird.
Dazu werden alle VBProjekte durchlaufen und geprüft, von welchem Typ ein VBProjekt ist. Der Typ eines VBProjekts gibt an, ob es sich um ein Formular (Userform), ein normales Modul oder eine Klasse (Klassenmodul) handelt. Diese werden über die Schleifen sortiert in die Auswahlliste der Module und Formulare eingefügt.

sCb3Index = ComboBox3.List(ComboBox3.ListIndex)
Set mymakro= VBE.VBProjects(sCb3Index).VBComponents
ComboBox1.AddItem "---Module-----"
For I = 1 To mymakro.Count
    If mymakro.Item(I).Type = vbext_ct_StdModule Then '=1
        ComboBox1.AddItem mymakro.Item(I).Name
    End If 
Next I
ComboBox1.AddItem "---Userforms--"
For I = 1 To mymakro.Count
    If mymakro.Item(I).Type = vbext_ct_MSForm Then '=3
        ComboBox1.AddItem mymakro.Item(I).Name
    End If 
Next I
ComboBox1.AddItem "---Klassen---"
For I = 1 To mymakro.Count
    If mymakro.Item(I).Type = vbext_ct_ClassModule Then 
        ComboBox1.AddItem mymakro.Item(I).Name
    End If 
Next I

zu 4.

Sobald ein Formular,Modul oder eine Klasse ausgewählt wird, werden die Komponenten (VBComponents) eingelesen. Um die Namen zu ermitteln, wird die CodeModule-Methode verwendet.
Mit dieser Methode lassen sich auch evtl. vorhandene Deklarationsbereich vor den eigentlichen Prozeduren (Makros und Ereignissen) ermitteln.

' Makros auslesen 
If Not Left(sCb1Index, 2) = "--" Then 
    For myline = 1 To myproc(sCb1Index).CodeModule.CountOfLines
    antw = myproc(sCb1Index).CodeModule.ProcOfLine(myline, vbext_pk_Proc)
    If antw <> MySub Then 
        MySub = antw
        ComboBox2.AddItem MySub
    End If 
    Next myline
End If 

zu 5.

Die Prozeduren werden mit der ProcOfLine-Methode des CodeModuls ermittelt.
Dazu werden alle Zeilen durchlaufen, nacheinander die Prozedurnamen ermittelt und diese in die dritte Auswahlliste eingetragen.

' Makros auslesen 
If Not Left(sCb1Index, 2) = "--" Then 
    For myline = 1 To myproc.CodeModule.CountOfLines
        antw = myproc.CodeModule.ProcOfLine(myline, vbext_pk_Proc)
        If antw <> MySub Then 
            MySub = antw
            ComboBox2.AddItem MySub
        End If 
    Next myline
    Label11.Caption = mymodlines & " Z."
    ComboBox2.ListIndex = 0
End If 

Somit stehen alle Prozeduren der verschiedenen Module und Formulare in den einzelnen Vorlagen zur Verfügung.


zu 6.

Wird ein Prozedurname ausgewählt, wird anhand der Einträge der drei Auswahllisten die entsprechende Prozedur ermittelt und nacheinander der VBA-Code eingelesen. Dabei wird die Pseudo-Prozedur "Declaration" mitausgewertet, um ggf. mit den entsprechenden Methoden auf den Deklarationsbereich zuzugreifen. Anschließend wird zeilenweise der Quellcode ausgelesen.

If ComboBox2.List(ComboBox2.ListIndex) = "Declaration" Then 
  länge2 = myproc(sCb1Index).CodeModule.CountOfDeclarationLines
  For i2 = 1 To (länge2)
    CurLine = myproc(sCb1Index).CodeModule.Lines(i2, 1)
    If Not Trim(CurLine) = "" Then 
      ListBox1.AddItem CurLine & " "
    End If 
  Next i2
ElseIf myproc(sCb1Index).Type = vbext_ct_StdModule Then 
  antw2 = myproc(sCb1Index).CodeModule.ProcStartLine(sCb2Index, vbext_pk_Proc)
  länge2 = myproc(sCb1Index).CodeModule.ProcCountLines(sCb2Index, vbext_pk_Proc)
  For i2 = antw2 To (antw2 + länge2 - 1)
    CurLine = myproc(sCb1Index).CodeModule.Lines(i2, 1)
    If Not Trim(CurLine) = "" Then 
      ListBox1.AddItem CurLine & " "
    End If 
  Next i2
End If 

Bei den Klassenmodulen gestaltet sich das Auslesen etwas aufwändiger, da es in den Klassen unterschiedliche Eigenschaftsprozeduren gibt.
Prinzipiell erfolgt das Auslesen der Zeilen aber wie bei den anderen Prozeduren.

If myproc(sCb1Index).Type = vbext_ct_ClassModule Then 
On Error Resume Next 
  antw1 = myproc(sCb1Index).CodeModule.ProcStartLine(sCb2Index, vbext_pk_Proc)
  If antw1 = "" Then 
    antw1a = myproc(sCb1Index).CodeModule.ProcStartLine(sCb2Index, vbext_pk_Get)
    länge2 = myproc(sCb1Index).CodeModule.ProcCountLines(sCb2Index, vbext_pk_Get)
    For i2 = antw1a To (antw1a + länge2 - 1)
      CurLine = myproc(sCb1Index).CodeModule.Lines(i2, 1)
      If Not Trim(CurLine) = "" Then 
        ListBox1.AddItem CurLine & " "
      End If 
    Next i2
  Else 
    antw2 = myproc(sCb1Index).CodeModule.ProcStartLine(sCb2Index, vbext_pk_Proc)
    länge2 = myproc(sCb1Index).CodeModule.ProcCountLines(sCb2Index, vbext_pk_Proc)
    For i2 = antw2 To (antw2 + länge2 - 1)
      CurLine = myproc(sCb1Index).CodeModule.Lines(i2, 1)
      If Not Trim(CurLine) = "" Then 
        ListBox1.AddItem CurLine & " "
      End If 
    Next i2
  End If 
End If


zu 7.

Bei der Konvertierung der ausgewählten Prozedur oder der markierten Zeilen, wird jede Zeile analysiert und in einzelne Befehle, Parameter oder Zeichen zerlegt.
Dazu wird die Zeile nacheinander auf Befehlstrenner wie Leerzeichen, Anführungszeichen, Kommata oder geöffnete Klammern geprüft. In diesen Fällen wird der davorstehende Bereich abgetrennt und weiteranalysiert, z.B. auf Gleichheitszeichen, geschlossene Klammern o.a.
Am Ende dieser Analyse steht ein isolierter String.
Beispiel:

tempwort = Left(temp, InStr(1, temp, " "))
If (InStr(1, Trim(tempwort), ",",") > 1) And Len(Trim(tempwort)) > 1 Then 
    temp = Right(temp, Len(temp) - InStr(1, temp, ",",") + 1)
    tempwort = Left(tempwort, Len(tempwort) - 2)
Else 

zu 8.

Die unter 7 isolierten Strings werden anschließend mit der Liste der eingelesenen Schlüsselworte verglichen und bei Übereinstimmung mit definierten CSS-Styles eingeklammert. Alle übrigen Strings werden auf Sonderzeichen überprüft, die HTML-konform übersetzt werden.
Die verschiedenen Strings werden danach wieder zu Zeilen zusammengesetzt und als Ergebnis in die untere Liste geschrieben.

For Each itm In befehle
    If (StrComp(Trim(tempwort), Trim(itm), vbTextCompare)) = 0 Then 
        gefunden = True 
        Exit For 
    End If 
Next itm
...
If gefunden Then 
    sAnalyse = sAnalyse & "<a class='Code'>" & tempwort & "</a>"
ElseIf gefunden2 Then 
    sAnalyse = sAnalyse & "<a class='Parms'>" & tempwort & "</a>"
Else 
    sAnalyse = sAnalyse & tempwort
End If 

zu 9.

Beim Export des konvertierten Quellcodes wird als Standardeinstellung das konfigurierte Temp-Verzeichnis verwendet. Je nach Betriebssystem kann es somit C:\Temp oder das temporäre Verzeichnis in Dokumente und Einstellungen.
Damit die hervorgehobenen Schlüsselworte auch mit dem CSS-Styles in der HTML-Datei korrekt angezeigt werden, wird um den konvertierten Quellcode ein HTML-Gerüst eingefügt, in dem auch die Styles definiert sind.


Beispiele:
Übersicht
Übersicht
29.52 KB
Auswahl konvertieren
Auswahl konvertieren
24.60 KB

 www.chf-online.de/vba/vbakonv.htm © 2001-11 Christian Freßdorf (Zaphod-Systems)