Converti codice VBA in BBCODE con colorazione della sintassi

Stato
Chiusa ad ulteriori risposte.

klingklang

Ciappinaro VBA_Expert
Expert
20 Ottobre 2017
5.239
213
43
San Giovanni in Persiceto (BO)
www.excelswissknife.com
2016, 365
376
Ciao a tutti Saluto_saluto

Ho pensato che sarebbe carino avere un tool per rendere un po' più "colorato" il nostro codice VBA... e così ho sviluppato un micro-add-in per Excel (2007 e successivi), che si occupa di colorare in blu le parole chiave del linguaggio VBA, e in verde i commenti, proprio come li vediamo nel VBEditor. Basta incollare il codice VBA in una casella di testo, premere un pulsante et voilà, il codice BBCODE viene generato e copiato negli appunti, pronto per essere incollato in un messaggio del forum.

Diventerà quindi da così:

Codice:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim fRange As Range
    Dim colore As Long
    Dim rosso As Integer
    Dim verde As Integer
    Dim blu As Integer
  
    'il range delle celle con gli sfondi
    Set fRange = ActiveSheet.Range("D2:D22")
  
    If Not Intersect(fRange, Target) Is Nothing And Target.Cells.Count = 1 Then
      
        'Rilevo il colore della cella modificata
        colore = Target.DisplayFormat.Interior.Color
      
        'Ricavo i valori RGB dall'indice ricavato in precedenza
        rosso = colore Mod 256
        verde = Int(colore / 256) Mod 256
        blu = Int(colore / 65536) Mod 256

        Shapes(Target.Offset(0, -3).Value).Fill.ForeColor.RGB = RGB(rosso, verde, blu)
  
    End If

End Sub

A così:
RTF (BB code):
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim fRange As Range
    Dim colore As Long
    Dim rosso As Integer
    Dim verde As Integer
    Dim blu As Integer
  
    'il range delle celle con gli sfondi
    Set fRange = ActiveSheet.Range("D2:D22")
  
    If Not Intersect(fRange, Target) Is Nothing And Target.Cells.Count = 1 Then
      
        'Rilevo il colore della cella modificata
        colore = Target.DisplayFormat.Interior.Color
      
        'Ricavo i valori RGB dall'indice ricavato in precedenza
        rosso = colore Mod 256
        verde = Int(colore / 256) Mod 256
        blu = Int(colore / 65536) Mod 256

        Shapes(Target.Offset(0, -3).Value).Fill.ForeColor.RGB = RGB(rosso, verde, blu)
  
    End If

End Sub

Video dimostrativo

Spero vi piaccia! E come sempre, accetto consigli e suggerimenti su come migliorarlo e renderlo ancora più utile Saluto_saluto
 

Allegati

Ultima modifica:

klingklang

Ciappinaro VBA_Expert
Expert
20 Ottobre 2017
5.239
213
43
San Giovanni in Persiceto (BO)
www.excelswissknife.com
2016, 365
376
Ricordo agli interessati che il file allegato si può aprire così com'è o installare come componente aggiuntivo, per averlo sempre a disposizione nel Ribbon. In questo caso, accertatevi di aver annullato il blocco di sicurezza del file:

Clic destro sul file -> proprietà -> generale -> Annulla blocco (segue screenshot preso da questo topic)




Allego inoltre il listato del componente aggiuntivo... colorato, ovviamente ';) (e con qualche "§" aggiunto qua e là per non far sfasare la formattazione del blocco CODE)

RTF (BB code):
'Procedura per convertire il codice VBA in BBCODE, formattato con commenti, parole chiave etc
'by Klingklang

Private Sub cmdGenera_Click()
    Dim bluArray As Variant
    Dim i As Long
    Dim strContents As String
    Dim regex As Object
    Dim Matches
    Dim Match
   
    Set regex = CreateObject("VBScript.RegExp")
   
    bluArray = Array("#If", "#Else", "#Else If", "#End If", "#Const", "Alias", "And", "As", "Base", "Boolean", "Byte", "ByRef", "ByVal", "Call", "Case", "CBool", "CByte", "CCur", "CDate", "CDbl", "CInt", "CLng", "CLngLng", "CLngPtr", "Compare", _
                    "Const", "CSng", "CStr", "Currency", "CVar", "Database", "Date", "Declare", "DefBool", "DefByte", "DefDate", "DefDec", "DefDouble", "DefInt", "DefLng", "DefLngLng", "DefLngPtr", "DefObj", "DefSng", "DefStr", "Dim", "Do", _
                    "Double", "Each", "Else", "ElseIf", "Empty", "End", "Enum", "Erase", "Error", "Event", "Exit", "Explicit", "False", "For", "Friend", "Function", "Get", "Global", "GoTo", "If", "IIf", "Implements", "Integer", "Is", "Let", _
                    "LBound", "Lib", "Like", "Long", "LongLong", "Loop", "LSet", "Mod", "New", "Next", "Not", "Nothing", "Null", "Object", "On", "Option", "Optional", "Or", "ParamArray", "Preserve", "Private", "Property", "Public", _
                    "RaiseEvent", "ReDim", "Resume", "Return", "RSet", "Select", "Set", "Single", "Static", "Step", "Stop", "String", "Sub", "Text", "Then", "To", "True", "Type", "TypeOf", "UBound", "Until", "Variant", "Wend", "While", "With", "WithEvents")
   
    strContents = "[§CODE]" & vbNewLine & Me.txtVBA & vbNewLine & "[/§CODE]"
   
    For i = LBound(bluArray) To UBound(bluArray)
       
        'FORMATTAZIONE DELLE PAROLE CHIAVE BLU
        With regex
          .Pattern = "([\W\s\n])(" & bluArray(i) & ")([\W\s\n])"
          .Global = True
        End With
   
        Set Matches = regex.Execute(strContents)
       
        For Each Match In Matches
            strContents = Replace(strContents, Match, Match.submatches(0) & "[COLOR=§#0000ff]" & Match.submatches(1) & "[/§COLOR]" & Match.submatches(2))
        Next Match
       
    Next i


    'FORMATTAZIONE DEI COMMENTI
    With regex
      .Pattern = "(\s)('[^\n\r]+)"
      .Global = True
    End With

    Set Matches = regex.Execute(strContents)
   
    For Each Match In Matches
        strContents = Replace(strContents, Match, Match.submatches(0) & "[COLOR=§#008000]" & Replace(Replace(Match.submatches(1), "[COLOR=§#0000ff]", ""), "[/§COLOR]", "") & "[/§COLOR]")
    Next Match
       

    Me.txtVBA.Visible = False
    Me.txtBBCODE.Text = strContents
    Me.txtBBCODE.Visible = True
    Me.cmdGenera.Visible = False
    Me.cmdCopy.Visible = True

    With New MSForms.DataObject
        .SetText Me.txtBBCODE.Text
        .PutInClipboard
    End With
   
    MsgBox "Codice BBCODE copiato negli appunti", vbInformation, "Codice copiato"
       
End Sub

Private Sub cmdCopy_Click()
    With New MSForms.DataObject
        .SetText Me.txtBBCODE.Text
        .PutInClipboard
    End With
End Sub


Private Sub cmdExit_Click()
    Unload Me
End Sub

Private Sub txtVBA_Change()
    Me.cmdGenera.Enabled = (Len(Me.txtVBA.Text) > 0)
End Sub
 
Ultima modifica:
C

calibro22

Guest
Ciao a tutti.
Complimenti KK, questa cosa puoi tornare molto utile.
Pensi che si possa integrare il codice che hai scritto nella funzionalita tag CODE del forum?
 

klingklang

Ciappinaro VBA_Expert
Expert
20 Ottobre 2017
5.239
213
43
San Giovanni in Persiceto (BO)
www.excelswissknife.com
2016, 365
376
Ciao a tutti.
Complimenti KK, questa cosa puoi tornare molto utile.
Pensi che si possa integrare il codice che hai scritto nella funzionalita tag CODE del forum?
Grazie calibro :StrettaDiMano: ipoteticamente si potrebbe creare un TAG personalizzato che con del javascript fa qualche operazione di sostituzione, ma il lavoro fatto da me non è certo riutilizzabile. Sarebbe carino se si potesse sviluppare un plugin per l'editor VBA anziché dover passare da Excel per avere il codice taggato, ma per questo bisogna saper sviluppare in #C, VB, o VB.net (neppure so quale dei tre), cosa che io non so fare ahimé!
 
Stato
Chiusa ad ulteriori risposte.

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!