2016-11-15 1 views
3

sagen wir ich habe folgendes:Kann ich den Text der Kommentare in der VBA-Code

Public Sub Information() 
    'TEST 
End Sub 

Gibt es eine Möglichkeit „TEST“ als Ergebnis zu bekommen? Irgendwie durch VBA?

z. - In PHP gibt es eine gute Möglichkeit, die Kommentare zu nehmen. Irgendwelche Ideen hier?

Edit: Es sollte einen Weg geben, weil Werkzeuge wie MZ-Tools die Kommentare bereitstellen können, wenn sie die Dokumentation generieren.

+0

willst du den Inhalt eines Kommentars von einer Zelle lesen? Nehmen wir an, in Zelle A1 haben Sie einen Kommentar, möchten Sie ihn lesen? –

+0

Nein. Ich suche nach einer Möglichkeit, "TEST" aus meinem Code zu lesen. – Vityata

+2

Das Ruberduck-Team könnte so etwas in ihrem Code haben: http://chat.stackexchange.com/rooms/14929/vba-rubberducking – Chrismas007

Antwort

2

Nach einigen Tests habe ich zu dieser Lösung:

einfach den Namen des Code-Moduls an die Funktion übergeben, und es wird alle Kommentarzeilen drucken. Inline-Kommentare werden nicht funktionieren (Sie haben den Zustand ändern)

Function findComments(moduleName As String) 

Dim varLines() As String 
Dim tmp As Variant 

With ThisWorkbook.VBProject.VBComponents(moduleName).CodeModule 

    'split the lines of code into string array 
    varLines = Split(.lines(1, .CountOfLines), vbCrLf) 
End With 

'loop through lines in code 
For Each tmp In varLines 

    'if line starts with ' 
    If Trim(tmp) Like "'*" Then 

     'print comment line 
     Debug.Print Trim(tmp) 
    End If 
Next tmp 
End Function 
+0

Danke für den Code, es funktioniert ganz ok, wie erwartet!:) – Vityata

+0

Es war schwierig, eine Antwort zu wählen, wenn es 3 so gut wie deine gibt, aber ich habe deine ausgewählt, weil sie keine externe Bibliothek verwendet. (Es hätte ein Kriterium geben müssen). – Vityata

+1

@Vityata es * tut *. Es erwähnt es einfach nicht. Die 'VBProject'-,' VBComponents'-, 'CodeModule'-Typen und die' CountOfLines'-Methode sind alle in der Bibliothek definiert, die alle anderen Benutzer angeben müssen. –

3

Sie können für Anwendungserweiterbarkeit Microsoft Visual Basic-Code zur Laufzeit prüfen:

'Requires reference to Microsoft Visual Basic for Applications Extensibility 
'and trusted access to VBA project object model. 
Public Sub Information() 
    'TEST 
End Sub 

Public Sub Example() 
    Dim module As CodeModule 
    Set module = Application.VBE.ActiveVBProject.VBComponents(Me.CodeName).CodeModule 

    Dim code As String 
    code = module.lines(module.ProcStartLine("Information", vbext_pk_Proc), _ 
         module.ProcCountLines("Information", vbext_pk_Proc)) 
    Dim lines() As String 
    lines = Split(code, vbCrLf) 
    Dim line As Variant 
    For Each line In lines 
     If Left$(Trim$(line), 1) = "'" Then 
      Debug.Print "Found comment: " & line 
     End If 
    Next 
End Sub 

Beachten Sie, dass das obige Beispiel geht davon aus, dass es in einem Arbeitsblatt oder Arbeitsmappe Code-Modul ausgeführt wird (daher Me wenn die CodeModule Ortung) . Die beste Methode, um das richtige Modul zu finden, hängt davon ab, wo Sie die Prozedur finden möchten.

+0

Danke für den Hinweis :) Ich habe es zuerst im Modul ausgeführt! :) – Vityata

3

Sie müssen den Code selbst analysieren, die VBA Extensibility-Bibliothek (auch bekannt als „VBIDE API“). Fügen Sie einen Verweis auf die Microsoft Visual Basic für Applikationen Extentibility 5.3 Typ Bibliothek, und dann können Sie Typen zugreifen wie CodePane und VBComponent:

Sub FindComments() 

    Dim component As VBComponent 
    For Each component In Application.VBE.ActiveVBProject.VBComponents 
     Dim contents As String 
     contents = component.CodeModule.Lines(1, component.CodeModule.CountOfLines) 
     '"contents" now contains a string with the entire module's code. 

     Debug.Print ParseComments(contents) 'todo 

    Next 

End Sub 

Sobald Sie ein Modul des contents haben, müssen Sie Logik implementieren zu finden Kommentare ... und das kann schwierig sein - hier einige Beispielcode zu spielen:

Sub Test() 
    Dim foo 'this is comment 1 

    'this _ 
     is _ 
      comment 2 

    Debug.Print "This 'is not a comment'!" 

    '..and here's comment 3 

    REM oh and guess what, a REM instruction is also a comment! 
    Debug.Print foo : REM can show up at the end of a line, given an instruction separator 
End Sub 

So müssen Sie die Linien zu durchlaufen, verfolgen, ob der Kommentar in der nächsten Zeile/Fortsetzung von der vorherigen Zeile fortgesetzt, Überspringen String Liter als

Viel Spaß!

+0

Danke! Funktioniert gut. :) – Vityata

1

Sie könnten versuchen, Zeile für Zeile Code in Ihrem Modul zu lesen. Hier ist nur Idee, die ersten Kommentar für weitere Verbesserungen:

Sub callIt() 

    Debug.Print GetComment("Module1") 

End Sub 
Function GetComment(moduleName As String) 
    Dim i As Integer 
    With ThisWorkbook.VBProject.VBComponents(moduleName).CodeModule 
     For i = 1 To .CountOfLines 

      If Left(Trim(.Lines(i, 1)), 1) = "'" Then 
       'here we have comments 
       'return the first one 
       GetComment = .Lines(i, 1) 
       Exit Function 
      End If 
     Next i 
    End With 


End Function 

Wichtig! Fügen Sie im Referenzfenster eins zu 'Erweiterbarkeit von Microsoft Visual Basic für Applikationen' hinzu.

+0

Dies funktioniert nur für den ersten Kommentar, dann beendet. – Vityata

+1

, die richtig ist, wie ich geschrieben habe, ursprünglichen Code für weitere Verbesserungen :) –

+0

Wie dem auch sei Dank ist die +1 von mir :) – Vityata

Verwandte Themen