● テキストボックスに高速に文字列を追加する ●

テキストボックスへ文字列を連続で追加する処理って結構遅いんだよね。

テキストボックスへ文字列を追加するには、

    Text1.Text = Text1.Text & "文字列"

とすればいいんだけど、これって文字列が増えてくると、重たくなるんだよね。そこで、以下の関数が必要になってくる。あくびなどしている暇をなくしてくれます。

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Const EM_REPLACESEL = &HC2 '選択文字列を指定文字列で置換する

'-------------------------------------------------------------------
' 関数名 : AddStringToTextbox
' 機能   : テキストボックスの最後尾に文字列を追加する
' 引数   : (in) txthWnd  … テキストボックスのハンドル
'           (in) AddString  … 追加する文字列
' 返り値 : なし
'-------------------------------------------------------------------
Public Sub AddStringToTextbox(ByVal txthWnd As Long, ByVal AddString As String)

    '文字列追加
    Call SendMessage(txthWnd, EM_REPLACESEL, 0, ByVal AddString)

End Sub

フォームにテキストボックス(MultiLine = True、ScrollBars = 2 - 垂直)、コマンドボタン2つ用意し、以下のコードをお試しあれ。

Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Sub Command1_Click()

    Dim i As Integer
    Dim StratTime As Long

    StratTime = GetTickCount

    Text1.Text = ""

    For i = 0 To 30
        DoEvents
        Call AddStringToTextbox(Text1.hwnd, "あいうえおかきくけこ" & vbCrLf)
        Call AddStringToTextbox(Text1.hwnd, "さしすせそたちつてと" & vbCrLf)
        Call AddStringToTextbox(Text1.hwnd, "なにぬねのはひふへほ" & vbCrLf)
        Call AddStringToTextbox(Text1.hwnd, "まみむめもらりるれろ" & i & vbCrLf)
    Next i

    Debug.Print GetTickCount - StratTime

End Sub

Private Sub Command2_Click()

    Dim i As Integer
    Dim StratTime As Long

    StratTime = GetTickCount

    Text1.Text = ""

    For i = 0 To 30
        DoEvents
        Text1.Text = Text1.Text & "あいうえおかきくけこ" & vbCrLf
        Text1.Text = Text1.Text & "さしすせそたちつてと" & vbCrLf
        Text1.Text = Text1.Text & "なにぬねのはひふへほ" & vbCrLf
        Text1.Text = Text1.Text & "まみむめもらりるれろ" & i & vbCrLf
    Next i

    Debug.Print GetTickCount - StratTime

End Sub

どうです?環境にもよると思いますが、2〜3倍ほど速さが違うと思います。追加されつつスクロールするので見栄えもよろしいのでは。


戻る