nachgestellte Kommentare

.. das wohl mächtigste Werkzeug in Bill Gates' Büro-Sippe. Ob reine Formeln, PowerQuery oder VBA. Hier bleiben kaum Wünsche unerfüllt.
Benutzeravatar
d'r Bastler
Beiträge: 884
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 241 Mal
Danksagung erhalten: 127 Mal

nachgestellte Kommentare

#1

Beitrag von d'r Bastler »

Moin allerseits,

wer viel VBAastelt und dies anderen zur Verfügung stellt, kommentiert auch viel .. manchmal zuviel :)

Hier ein paar Zeilen (in ein Modul), mit denen man nachgestellte Kommentare aufräumen kann. Mit etwas Hirnschmalz klappt das dann auch mit Kommentarzeilen.

Code: Alles auswählen

Sub DeletePostComments()
Dim mdl As Object
Dim sCode As String
Dim i As Integer, iPost As Integer, iPre As Integer, iPos As Integer

Set mdl = ThisWorkbook.VBProject.VBComponents("Modul1").CodeModule 'ANPASSEN

    For i = 1 To mdl.CountOfLines
        sCode = mdl.Lines(i, 1)
        iPos = InStr(sCode, "'")
        
        If iPos > 1 Then
            sCode = Left(sCode, iPos - 1)
            mdl.ReplaceLine i, sCode
            iPost = iPost + 1
        End If
        If iPos = 1 Then
            iPre = iPre + 1
        End If
    Next i
    
    MsgBox iPost & " nachgestellte Kommentare wurden entfernt." & vbNewLine & iPre & " Anfangskommentar sind noch vorhanden.", vbInformation
End Sub
Viel Spaß damit!
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
knobbi38
Beiträge: 62
Registriert: 20. Okt 2024, 14:15
Hat sich bedankt: 4 Mal
Danksagung erhalten: 36 Mal
Kontaktdaten:

Re: nachgestellte Kommentare

#2

Beitrag von knobbi38 »

Hallo d'r Bastler,

leider reicht dieser Code

Code: Alles auswählen

iPos = InStr(sCode, "'")
nicht aus, um den Beginn eines Kommentars in einer Zeile zu erkennen. Ein reguläres "'" wird z.B. sehr häufig in SQL-Strings benötigt, da dort Feldinhalte vom Typ Text immer in Hochkommas stehen.
Wenn du Kommentare erkennen möchtest, muß geprüft werden, ob das Hochkomma z.B. in Strings steht oder wirklich als Symbol verwendet wird. Um das Parsen der Codezeile im weitesten Sinne kommt man also nicht herum, leider.

Gruß Knobbi38
Folgende Benutzer bedankten sich beim Autor knobbi38 für den Beitrag:
d'r Bastler
knobbi38
Beiträge: 62
Registriert: 20. Okt 2024, 14:15
Hat sich bedankt: 4 Mal
Danksagung erhalten: 36 Mal
Kontaktdaten:

Re: nachgestellte Kommentare

#3

Beitrag von knobbi38 »

Nachtrag:

um einen Kommentar einfacher zu identifizieren, könnte man auch mit diesem regulären Ausdruck arbeiten:

Code: Alles auswählen

^(.*)\ '([^']*)$
Dann entsprechen die Backreferences $1 dem Code vor dem Kommentar und $2 dem Kommentar selber.

zum Testen kann man diese Site verwenden:
https://regex101.com/r/gnUb9V/2


HTH
Knobbi38
Folgende Benutzer bedankten sich beim Autor knobbi38 für den Beitrag:
d'r Bastler
Benutzeravatar
d'r Bastler
Beiträge: 884
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 241 Mal
Danksagung erhalten: 127 Mal

Re: nachgestellte Kommentare

#4

Beitrag von d'r Bastler »

Moin Knobbi,

Deine Ergänzung berücksichtigt (natürlich mal wieder :) ) alle möglichen Abgründe der Syntax. Nachdem in meinen Codes (bisher) keine SQL-Statements vorkommen, aber z.B. maskierte Hochkommata im Zusammenhang mit Strings, muss ich zugeben, das nicht berücksichtigt zu haben.

Fehler konnte ich bisher dadurch vermeiden, dass ich meine Kommentare oft einfach durch '# einleite und den Instr entsprechend anpasse. Für Zeilen im Code, die ich mir z.B. als ToDo oder Debug markieren möchte stelle dann einfach ein '### o.Ä. voran und kann sie so auch in umfangreichen Moduln schnell finden. Mein Vorschlag lässt sich dadurch natürlich beliebig individualisieren.

Liebe Grüße
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
knobbi38
Beiträge: 62
Registriert: 20. Okt 2024, 14:15
Hat sich bedankt: 4 Mal
Danksagung erhalten: 36 Mal
Kontaktdaten:

Re: nachgestellte Kommentare

#5

Beitrag von knobbi38 »

Hallo d'r Bastler,

es geht doch nichts über eine gewisse Code-Disziplin ;)

Hier mal ein Beispiel für eine Funktion zum Abschneiden des Kommentars am Ende einer Codezeile

Code: Alles auswählen

Public Function StripComment(ByVal SourceText As String) As String
  Static regEx As Object
  
  If regEx Is Nothing Then
    Set regEx = CreateObject("vbscript.regexp")
    regEx.Global = True: regEx.MultiLine = True
    regEx.Pattern = "(\s+'[^']*)$"
  End If
  
  If regEx.Test(SourceText) Then
    StripComment = regEx.Replace(SourceText, "")
  End If
  
  If Len(StripComment) = 0 Then
    StripComment = SourceText
  End If
End Function
Das reguläre Pattern isr dabei etwas modifiziert, damit führende Einrückungen erhalten bleiben, aber Whitespaces zwischen Codeline und Beginn des Kommentars mit gelöscht werden.

Gruß Knobbi38
Folgende Benutzer bedankten sich beim Autor knobbi38 für den Beitrag:
d'r Bastler
Antworten

Wer ist online?

Mitglieder in diesem Forum: Ahrefs [Bot] und 1 Gast