La giusta forma per le stringhe

Diciamo che l'idea è nata abbastanza per caso. Smanettando con altri linguaggi è facile notare che ci sono alcune facilitazioni per la formattazione delle stringhe, mediante l'uso sapiente di placeholders e modificatori si possono realizzare formattazioni pregevoli delle stringhe in output che agevolano sicuramente il debug o la presentazione coerente dei dati. MI vengono in mente le convenzioni di formattazione delle stringhe di python, Java, C#, C++, .Net e chissà quanti altri linguaggi evoluti offrono questa posisbilità... ma non VBA! Allora ho deciso di costruirmi la mia semplice funzioncina personalizzata :) E' talmente semplice che non prevede l'uso di modificatori o quantificatori, per cui accetta solo placeholders (alfanumerici) posizionali, che verranno riempiti nell'ordine in cui vengono passati nella variabile ParamArray passata come secondo argomento. Consideriamola un'idea stuzzicante ma... soltanto un'idea :)
Option Explicit

'simulare la funzione format di python in VBA
'consentendo di utilizzare placeholders {0}..{n}
'in una stringa di formato e passando poi gli argomenti da stampare
'i placeholders sono indici numerici e alfanumerici
'i placeholders devono essere coerenti con il numero di variabili
'passate nel secondo argomento
'es. print_using("{0} <{1}> *{2}", "a", "b", "c") ---> "a <b> *c"

'es. print_using("Ecco qui {0} e {1}. Questo non conta: {} ma questi sì 
'{pippo} e {0abc}.", "a", "b", "c", "d", "e")        -> Error

Function print_using(stri As String, ParamArray vars() As Variant) As String
Dim itm As Variant, i As Integer, v() As Variant, m As String
Dim regex As Object, placeholders As Object, placeholder As Object
Dim unique_placeholders As Collection

    Set regex = CreateObject("VBScript.RegExp")
    With regex
        .Global = True
        .MultiLine = False
        .IgnoreCase = True
        .Pattern = "({\w+})"    'match '{0}' but not '{}'
    End With

    For Each itm In vars
        ReDim Preserve v(i) As Variant
        v(i) = itm
        i = i + 1
    Next
    
    Set placeholders = regex.Execute(stri)
    
    On Error GoTo coll_err_handler
    Set unique_placeholders = New Collection
    For Each placeholder In placeholders
        unique_placeholders.Add placeholder, placeholder
    Next
        
    If i <> unique_placeholders.Count Then        'nb collection base is 0
        print_using = "Inconsistent number of variables and number of 
uniques placeholders."
        Exit Function
    End If
    
    i = 0
    m = Trim(stri)
    For Each placeholder In unique_placeholders
        m = Replace(m, placeholder.Value, v(i))
        i = i + 1
    Next
    
    print_using = m
    Exit Function

coll_err_handler:
    'intercept adding duplicates
    If Err.Number = 457 Then
        Err.Clear
        Resume Next
    Else
        MsgBox "Error number " & Err.Number & vbCrLf & Err.Description, _
vbInformation
    End If
End Function

posted @ martedì 2 agosto 2016 20:09

Print

Comments on this entry:

# re: La giusta forma per le stringhe

Left by Francesco C. at 08/08/2016 11:08
Gravatar
L'amico scossa suggerisce un paio di varianti:
- eliminare array v() in quanto duplicato di vars()
- spostare nel ciclo di popolamento della collection l'istruzione di replace dei placeholder eliminando il successivo ciclo


Your comment:



 (will not be displayed)


 
 
 
Please add 2 and 3 and type the answer here:
 

Live Comment Preview: