テキストボックスへ文字列を連続で追加する処理って結構遅いんだよね。
テキストボックスへ文字列を追加するには、
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倍ほど速さが違うと思います。追加されつつスクロールするので見栄えもよろしいのでは。 |