
Option Explicit
'simulare la funzione format di python in VBA
'VF 2016
'consente di utilizzare placeholders {0}..{n}
'in una stringa di formato passando poi gli argomenti da stampare
'i placeholders sono indici alfanumerici e
'devono essere coerenti con il numero di variabili
'passate nel secondo argomento
'es. print_using("{0} <{1}> *{2}", "a", "b", "c") ---> "a *c"
'es. print_using("{0} <{1}> *{0}", "a", "b") ---> "a *a"
'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
|
| scossa's web site |
| Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw) |
'simulare la funzione format di python in VBA
'VF 2016
'consente di utilizzare placeholders {0}..{n}
'in una stringa di formato passando poi gli argomenti da stampare
'i placeholders sono indici alfanumerici e
'devono essere coerenti con il numero di variabili
'passate nel secondo argomento
'es. print_using("{0} <{1}> *{2}", "a", "b", "c") ---> "a *c"
'es. print_using("{0} <{1}> *{0}", "a", "b") ---> "a *a"
'es. print_using("Ecco qui {0} e {1}. Questo non conta: {} ma questi sì {pippo} e {0abc}.", "a", "b", "c", "d", "e") -> Error
'
'variante scossa:
'eliminato array v() in quanto era un duplicato di vars()
'spostato nel ciclo di popolamento della collection l'istruzione di replace dei placeholder,
'eliminando il successivo ciclo
Function print_using(stri As String, ParamArray vars() As Variant) As String
Dim itm As Variant, i As Integer, m As String
Dim regex As Object, placeholders As Object, placeholder As Object
Dim unique_placeholders As Collection
Const sErr As String = "Inconsistent number of variables and number of uniques placeholders."
Set regex = CreateObject("VBScript.RegExp")
With regex
.Global = True
.MultiLine = False
.IgnoreCase = True
.Pattern = "({w+})" 'match '{0}' but not '{}'
End With
m = Trim(stri)
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
m = Replace(m, placeholder.Value, vars(i))
i = i + 1
End If
Err.Clear
Next
On Error GoTo coll_err_handler
If UBound(vars) + 1 < unique_placeholders.Count Then 'nb collection base is 0
print_using = sErr
Err.Raise vbObjectError + 513, Description:=sErr
End If
print_using = m
coll_err_handler:
If Err.Number <> 0 Then
MsgBox "Error " & Err.Description, vbInformation
End If
Set unique_placeholders = Nothing
Set regex = Nothing
End Function
|
| scossa's web site |
| Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw) |
| scossa's web site |
| Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw) |
