Excel-VBA-Collection
243 строки · 7.9 Кб
1Attribute VB_Name = "Printf"
2Option Explicit
3Option Compare Binary 'BINARY!!!
4Option Base 0 'ParamArray!!!
5DefLng A-Z
6
7Dim simple As Boolean, realign As Boolean
8Dim width As String, PART As String, before As Boolean, argc As Long
9
10Public Function Bsprintf(FormatStr As String, ParamArray Args() As Variant) As String
11Bsprintf = Bvsprintf(FormatStr, CVar(Args))
12End Function
13
14Public Function Bvsprintf(FormatStr As String, Args As Variant) As String
15'like the C function vsprintf()
16'required to investigate user32.wvsprintfA()!
17Dim n1 As Long, n2 As Long, C As String, s As String
18Bvsprintf = vbNullString
19n1 = 1
20Do
21n2 = InStr(n1, FormatStr, "\")
22If n2 = 0 Then
23Bvsprintf = Bvsprintf & Mid(FormatStr, n1)
24Exit Do
25Else
26Bvsprintf = Bvsprintf & Mid(FormatStr, n1, n2 - n1)
27End If
28C = Mid(FormatStr, n2 + 1, 1)
29Select Case C
30Case "\":
31Bvsprintf = Bvsprintf & "\"
32Case "'":
33Bvsprintf = Bvsprintf & """" 'like C \"
34Case "a":
35Beep
36Case "b":
37Bvsprintf = Left(Bvsprintf, Len(Bvsprintf) - 1) '''''''''''''''''need to be last
38Case "n":
39Bvsprintf = Bvsprintf & vbCrLf
40'Case "r":
41' Bvsprintf = Bvsprintf & vbLf 'UNIX
42Case "t":
43Bvsprintf = Bvsprintf & vbTab
44Case "0":
45Bvsprintf = Bvsprintf & vbNullChar
46Case Else
47Bvsprintf = Bvsprintf & C
48End Select
49n1 = n2 + 2: n2 = n1
50Loop
51
52argc = LBound(Args)
53n1 = 1
54FormatStr = Bvsprintf
55Bvsprintf = vbNullString
56Do
57simple = True
58realign = False
59width = vbNullString
60PART = vbNullString
61before = True
62n2 = InStr(n1, FormatStr, "%")
63If n2 = 0 Then
64Bvsprintf = Bvsprintf & Mid(FormatStr, n1)
65Exit Do
66Else
67Bvsprintf = Bvsprintf & Mid(FormatStr, n1, n2 - n1)
68End If
69Do
70n2 = n2 + 1
71C = Mid(FormatStr, n2, 1)
72Select Case C
73Case "%":
74Bvsprintf = Bvsprintf & "%"
75Exit Do
76Case "c":
77Bvsprintf = Bvsprintf & Chr(Args(argc))
78argc = argc + 1
79Exit Do
80Case "d":
81Bvsprintf = Bvsprintf & DFormat(Args(argc))
82argc = argc + 1
83Exit Do
84Case "s":
85Bvsprintf = Bvsprintf & SFormat(Args(argc))
86argc = argc + 1
87Exit Do
88
89'Changed behavior!
90Case "f":
91Bvsprintf = Bvsprintf & FFormat(Args(argc))
92argc = argc + 1
93Exit Do
94Case "F":
95Bvsprintf = Bvsprintf & PFormat(Args(argc))
96argc = argc + 1
97Exit Do
98Case "x":
99Bvsprintf = Bvsprintf & DFormat(LCase(To36(Args(argc))))
100argc = argc + 1
101Exit Do
102Case "X":
103Bvsprintf = Bvsprintf & DFormat(UCase(To36(Args(argc))))
104argc = argc + 1
105Exit Do
106
107'Extra formats!!!
108Case "n":
109Bvsprintf = Bvsprintf & Format(Args(argc), "dd.MM.yyyy") 'DtoC
110argc = argc + 1
111Exit Do
112Case "N":
113Bvsprintf = Bvsprintf & DtoS(Args(argc)) 'yyyymmdd DtoS
114argc = argc + 1
115Exit Do
116Case "m":
117Bvsprintf = Bvsprintf & Format(Args(argc), "yyyy-MM-dd") 'XML
118argc = argc + 1
119Exit Do
120Case "M":
121Bvsprintf = Bvsprintf & Format(Args(argc), "yyyy-MM-ddTHH:mm:ss") 'XML
122argc = argc + 1
123Exit Do
124Case "t":
125Bvsprintf = Bvsprintf & Format(Args(argc), "HH:mm")
126argc = argc + 1
127Exit Do
128Case "T":
129Bvsprintf = Bvsprintf & Format(Args(argc), "dd.MM.yyyy HH:mm")
130argc = argc + 1
131Exit Do
132
133'Digital preprocessing
134Case "0":
135simple = False
136If Len(width) = 0 Then width = "0"
137If before Then
138width = width & C
139Else
140PART = PART & C
141End If
142Case "1" To "9":
143simple = False
144If Len(width) = 0 Then width = " "
145If before Then
146width = width & C
147Else
148PART = PART & C
149End If
150Case "-":
151simple = False
152realign = True
153Case "*":
154simple = False
155If Len(width) = 0 Then width = " "
156If before Then
157width = width & CStr(Args(argc))
158Else
159PART = CStr(Args(argc))
160End If
161argc = argc + 1
162Case ".":
163simple = False
164before = False
165If Len(width) = 0 Then width = " "
166
167'Something goes wrong...
168Case Else
169Bvsprintf = Bvsprintf & C
170Exit Do
171End Select
172Loop
173n1 = n2 + 1
174Loop
175End Function
176
177Public Function DFormat(v As Variant) As String
178Dim s As String
179s = CStr(v)
180If Not simple Then
181If realign Then 'align to left
182s = PadR(s, Val(width), Left(width, 1))
183If Len(PART) > 0 Then s = Right(s, Val(PART))
184Else 'align to right
185s = PadL(s, Val(width), Left(width, 1))
186If Len(PART) > 0 Then s = Left(s, Val(PART))
187End If
188End If
189DFormat = s
190End Function
191
192Public Function FFormat(v As Variant, Optional Delim As String = ".") As String
193Dim s As String
194If simple Then
195s = Format(v, "#,0.00")
196Mid(s, Len(s) - 2, 1) = Delim
197Else
198s = Format(v, "#,0." & String(Val(PART), "0"))
199Mid(s, Len(s) - Val(PART), 1) = Delim
200If realign Then 'align to left
201s = PadR(s, Val(width), Left(width, 1))
202Else 'align to right
203s = PadL(s, Val(width), Left(width, 1))
204End If
205End If
206FFormat = s
207End Function
208
209Public Function PFormat(v As Variant, Optional Delim As String = "-") As String
210Dim s As String
211If simple Then
212s = Format(v, "0.00")
213Mid(s, Len(s) - 2, 1) = Delim
214Else
215s = Format(v, "0." & String(Val(PART), "0"))
216Mid(s, Len(s) - Val(PART), 1) = Delim
217If realign Then 'align to left
218s = PadR(s, Val(width), Left(width, 1))
219Else 'align to right
220s = PadL(s, Val(width), Left(width, 1))
221End If
222End If
223PFormat = s
224End Function
225
226Public Function SumFormat(v As Variant) As String
227SumFormat = Format(v, "0.00")
228End Function
229
230Public Function SFormat(v As Variant) As String
231Dim s As String
232s = CStr(v)
233If Not simple Then
234If realign Then 'align to right
235s = PadL(s, Val(width), Left(width, 1))
236If Len(PART) > 0 Then s = Right(s, Val(PART))
237Else 'align to left
238s = PadR(s, Val(width), Left(width, 1))
239If Len(PART) > 0 Then s = Left(s, Val(PART))
240End If
241End If
242SFormat = s
243End Function
244