遊びでやってみたら何とビックリ、動いてしまったよ。と言っても文字列限定だけどね。フォーマットでのプレースホルダでは %s と %p しか使えません。
インターネットを彷徨ってみたら…、なんと わき道プログラミング torch 様のエントリ「VB6.0 で wvsprintf を使ってみる」にて %d を使用できるサンプルを発見。Double型は動かないようであるが、すげぇ!! なるほど〜、ParamArray型で Variant型配列を受け取り、そんでもってVarType関数でデータ型を判定して、各データ型に適した処理をすればいいのか〜。ちとメモ書きしておきませう。あたしって、API関数ばっかり追いかけているので、VBの組み込み関数を意外と知らないのよね。
'データ型を判定する関数 Public Function CheckVarType(ParamArray Arguments() As Variant) As String Dim v As Variant For Each v In Arguments Select Case VarType(v) Case vbString Case vbSingle Case vbDouble Case Else End Select Next v End Function ではどうぞ↓
Private Declare Sub wsprintf Lib "user32" Alias "wvsprintfA" (ByVal lpzBuffer As Long, ByVal lpFormat As String, ByVal args As Long)
'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ' 機 能:文字列をsprintfする(←超適当やな…) ' 引 数:(i)CFormat … フォーマット(%s と %p だけ使用可能) ' (i)StrArgs … %sに表示する文字列 ' 返り値:sprintfされた文字列 '=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Private Function Sprintf(ByVal CFormat As String, ByRef StrArgs() As String) If IsNull(StrArgs) Then Exit Function Dim Buffer As String Dim i As Long Dim VarArgs() As String Dim lpArgs() As Long '初期化 Buffer = String$(SPRINTF_MAX_SIZE, Chr$(0)) 'メモリ確保 ReDim VarArgs(UBound(StrArgs)) As String ReDim lpArgs(UBound(StrArgs)) As Long 'Unicode→ANSI化 For i = 0 To UBound(StrArgs) VarArgs(i) = StrConv(StrArgs(i), vbFromUnicode) lpArgs(i) = StrPtr(VarArgs(i)) Next i 'sprintfだ!! Call wsprintf(StrPtr(Buffer), CFormat, VarPtr(lpArgs(0))) '値を返却 Sprintf = StrNullCut(StrConv(Left$(Buffer, SPRINTF_MAX_SIZE), vbUnicode)) End Function '-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ' 機 能:文字列を Chr$(0)[=vbNullChar] まで取得する ' 引 数:(in)SrcStr … 対象文字列 ' 返り値:編集された文字列 '=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Private Function StrNullCut(ByVal SrcStr As String) As String Dim NullCharPos As Long NullCharPos = InStr(SrcStr, Chr$(0)) If NullCharPos = 0 Then StrNullCut = SrcStr Exit Function End If StrNullCut = Left$(SrcStr, NullCharPos - 1) End Function Private Sub CommandX_Click() Dim TestText() As String ReDim TestText(4) As String TestText(0) = "C言語の" TestText(1) = "VBで無理矢理" TestText(2) = "しています" TestText(3) = vbCrLf & "とりあえず文字列専用です。" TestText(4) = "白は半角スペースのことです。" Debug.Print Sprintf("ただいま%ssprintfを%s動かそうと%s。%s[備考]%s", TestText) ReDim TestText(0) As String TestText(0) = "11600" Debug.Print Sprintf("10桁:左0埋め:%010s", TestText) Debug.Print Sprintf("10桁:左白埋め:%10s", TestText) Debug.Print Sprintf("10桁:右0埋め:%-010s", TestText) Debug.Print Sprintf("10桁:右白埋め:%-10s", TestText) Debug.Print Sprintf("ポインタ表示:%p", TestText) End Sub [実行結果] ただいまC言語のsprintfをVBで無理矢理動かそうとしています。 とりあえず文字列専用です。[備考]白は半角スペースのことです。 10桁:左0埋め:0000011600 10桁:左白埋め: 11600 10桁:右0埋め:1160000000 10桁:右白埋め:11600 ポインタ表示:001D6194 |