VBA-Konverter |
|
|||||||||||||||||||||||
Mit diesem Makropaket ist es möglich, den VBA Code eines einzelnen Makros/einer Funktion oder eines
gesamten Modules als HTML-Datei darzustellen. Aufbau des Programmes:
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. 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. 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. 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. ' 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. ' 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. 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. 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. 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. Beispiele:
|
www.chf-online.de/vba/vbakonv.htm | © 2001-11 Christian Freßdorf (Zaphod-Systems) |