La giusta forma per le stringhe, reloaded

Quasi un anno fa proponevo (clicca qui per leggere il post) una semplice soluzione per simulare il comportamento di certe funzioni di output di altri linguaggi, le quali permettono di inserire dei segnaposto nella stringa di input che vengono riempiti (per posizione o per nome) dal contenuto delle variabili passate in argomento. Suggerisco qui alcune modifiche a quella funzioncina per superare alcuni limiti. Ora si possono usare segnaposto vuoti, che vengono riempiti in automatico, e si può forzare l'ordine di presentazione dei parametri passati alla funzione indicandoli nei segnaposto numerici. Ad esempio:
print_format("{} {} {}", "a", "b", "c") ---> "a b c"
print_format("{2} {1} {0}", "a", "b", "c") ---> "c b a"
La limitazione introdotta è che non si possono mescolare segnaposto vuoti e segnaposto indicizzati:
print_format("{} {1} {2}", "a", "b", "c") ---> Errore
Ma bando alle ciance, ed ecco il codice :) Sviluppi futuri? Chissà!
Option Explicit

'PRINT_FORMAT
'simula la funzione format di python in VBA
'consente di utilizzare placeholders {0}..{n} con n solo numerico
'in una stringa di formato e passando poi gli argomenti da stampare
'i placeholders possono essere vuoti: {} e devono essere coerenti
'con il numero di variabili passate nel secondo argomento
'
'es. print_format("{0} <{1}> *{2}", "a", "b", "c") ---> "a <b> *c"
'    print_format("{} {} {}", "a", "b", "c") ---> "a b c"
'    print_format("Test {0} {1} {3} {0} {2}.", "a", "b", "c", "d", "f")
'          -> "Test a b d a c."     ("f" non è rappresentato)
'    print_format("{} {0}", "a", "b") ---> errore
'
'miglioramento: l'uso di placeholders vuoti
'miglioramento: utilizzando indici numerici (campi manuali) si può
'               forzare l'ordine di output degli elementi
'modifica: gli indici possono essere SOLO numerici
'modifica: non si possono mescolare campi numerati e campi vuoti

' v. 1.1, 26 maggio 2017

Function print_format(stri As String, ParamArray vars() As Variant) As String
Dim itm As Variant, i As Integer, m As String, s As String
Dim regex As Object, placeholders As Object, placeholder As Object
Dim unique_placeholders As Collection
Dim lastindex As Long

Const ERR_ILLEGAL As String = "Illegal non-numeric placeholder in "
Const ERR_INCONSISTENT As String = "Inconsistent number of variables and " & _
                                   "number of uniques placeholders."
Const ERR_MIXED As String = "Cannot switch from manual field specification" & _
                                   " to automatic field numbering"
Const ERR_OUTOFRANGE As String = "Index out of range (items starts with 0)"

    On Error GoTo err_handler

    Set regex = CreateObject("VBScript.RegExp")
    With regex
        .Global = True
        .MultiLine = False
        .IgnoreCase = True
        
        'test for mixing numbered and automatic fields
        .Pattern = "{\d+}"
        If .Test(stri) And InStr(stri, "{}") Then
            'automatic with manual (numbered) fields found
            Err.Raise vbObjectError + 513, Description:=ERR_MIXED
        End If
                
        'examine numeric placeholders for retrieve last numbered index
        'necessary for avoiding illegal numbered fields
        .Pattern = "{\d+}"
        lastindex = 0
        If .Test(stri) Then
            Set placeholders = .Execute(stri)
            For Each placeholder In placeholders
                i = Val(Mid(placeholder, 2))
                If i > lastindex Then lastindex = i
            Next
        End If
        
        'replace any manual field {} with appropriate numbered fields
        Do
            'error if lastindex is greater than items (base zero)
            If lastindex > UBound(vars) Then
                Err.Raise vbObjectError + 513, Description:=ERR_OUTOFRANGE
            End If
            
            stri = Replace(stri, "{}", "{" & lastindex & "}", , 1)
            lastindex = lastindex + 1
        Loop Until InStr(stri, "{}") = 0
        
        'test if any non-digit in {}
        .Pattern = "{\D+}"
        If .Test(stri) Then
            Set placeholders = .Execute(stri)
            Err.Raise vbObjectError + 513, Description:=ERR_ILLEGAL & "'" & _
                                                        placeholders(0) & "'"
        End If
                        
        'finally prepare for match manual or automatic fields
        .Pattern = "({\d+}|{})"
    End With
    
    m = Trim(stri)
    lastindex = lastindex + 1
        
    Set placeholders = regex.Execute(stri)
    Set unique_placeholders = New Collection
    On Error Resume Next
    For Each placeholder In placeholders
        unique_placeholders.Add placeholder, placeholder
        If Err.Number = 0 Then
            i = Val(Mid(placeholder, 2))
            m = Replace(Expression:=m, Find:=placeholder, Replace:=vars(i))
        End If
        Err.Clear
    Next
    
    If UBound(vars) + 1 < unique_placeholders.Count Then
        Err.Raise vbObjectError + 513, Description:=ERR_INCONSISTENT
    End If
    
    print_format = m

err_handler:
    If Err.Number <> 0 Then
        MsgBox "Errore: " & vbCrLf & Err.Description, vbInformation, Err.Source
        print_format = ""
    End If
    Set unique_placeholders = Nothing
    Set regex = Nothing

End Function