- Код: Выделить всё
'Форматирование текста
Function FirstInStr(ByVal Start As Long, ByVal Text As String, ParamArray Chars() As Variant) As Long
Dim I As Long, P As Long, PMin As Long
PMin = 0&
For I = LBound(Chars) To UBound(Chars)
P = InStr(Start, Text, Chars(I), vbBinaryCompare)
If P > 0 And (P < PMin Or PMin = 0) Then PMin = P
Next I
FirstInStr = PMin
End Function
Function FormatText(ByVal FormatString As String, ParamArray Args() As Variant) As String
Const TagEscape As String = "\", TagOpen As String = "{", TagClose As String = "}"
Const TagPrefix As String = "#", TagSeparator As String = ";", TagQuote As String = "'"
Dim res As String, I0 As Long, I As Long, N As Long, fTagOpen As Boolean, TagValue As Variant, TagFormat As String
I0 = 1
res = vbNullString
Do Until I0 > Len(FormatString)
If fTagOpen Then
I = FirstInStr(I0, FormatString, TagClose)
If I = 0 Then I = Len(FormatString) + 1
TagValue = Mid$(FormatString, I0 + Len(TagOpen), I - I0 - 1)
fTagOpen = False
I = I + 1
N = InStr(TagValue, TagSeparator)
If N > 0 Then
TagFormat = Mid$(TagValue, N + Len(TagSeparator))
TagValue = Left$(TagValue, N - 1)
End If
If Left$(TagValue, Len(TagPrefix)) = TagPrefix Then
TagValue = Args(Val(Mid$(TagValue, Len(TagPrefix) + 1)) - 1 + LBound(Args))
Else
TagValue = Null
End If
If Left$(TagFormat, Len(TagQuote)) = TagQuote And Right$(TagFormat, Len(TagQuote)) = TagQuote Then
TagFormat = Mid$(TagFormat, Len(TagQuote) + 1, Len(TagFormat) - 2 * Len(TagQuote))
Else
TagFormat = vbNullString
End If
res = res & Format$(TagValue, TagFormat)
Else
I = FirstInStr(I0, FormatString, TagEscape, TagOpen)
If I = 0 Then I = Len(FormatString) + 1
res = res & Mid$(FormatString, I0, I - I0)
If Mid$(FormatString, I, Len(TagEscape)) = TagEscape Then
res = res & Mid$(FormatString, I + 1, 1)
I = I + 2
ElseIf Mid$(FormatString, I, Len(TagOpen)) = TagOpen Then
TagFormat = vbNullString
fTagOpen = True
End If
End If
I0 = I
Loop
FormatText = res
End Function
Пример использования:
- Код: Выделить всё
?FormatText("\{ Page -{#1}- from -{#2;'000'}- \}", 1, 15)
Вернет:
- Код: Выделить всё
{ Page -1- from -015- }
Краткое описание спец.символов:
\ - escape-символ. Следующий за ним символ будет подставлен без интерпретации.
{, } - поле параметра. Состоит из порядкового номера параметра, предваряемого символом '#' и необязательной строки формата, отделенной точкой с запятой. Оба аргумента передаются в функцию Format(), поэтому и интерпретация их такая же, как у этой функции.