● VBでsprintfを使用して文字列を編集する ●

遊びでやってみたら何とビックリ、動いてしまったよ。と言っても文字列限定だけどね。フォーマットでのプレースホルダでは %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)
Private Const SPRINTF_MAX_SIZE As Long = 1024

'-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
' 機  能:文字列を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

戻る