• ベストアンサー

テキストボックスの表示について

いつもお世話になります。VBAで質問があるのですが、ユーザーフォームを作り、コマンドボタンとテキストボックスを配置します。 Private Sub CommandButton1_Click() Dim i As Long  For i = 1 To 30   TextBox1.Text = i & "を入力しました"   Worksheets("Sheet1").Range("A1").Value = i & "回目です"  Next i End Sub と入力して実行すると、セルには1~30回まで順に書き込みがありますが、テキストボックスには最後の「30を入力しました」しか表示されません。 これを「1を入力しました」、「2を入力しました」、「3を・・・」というようにテキストボックスに順に表示させるにはどのようにしたらよいのでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.2

単純に Worksheets("Sheet1").Range("A1").Value = i & "回目です" の下に DoEvents を入れるだけで良いと思います。 それでも速すぎるなら、Timer を使って下記のようにするとか。 Private Sub CommandButton1_Click() Dim i As Long, st, pt  pt = 0.01   '1/100秒止める  For i = 1 To 30   TextBox1.Text = i & "を入力しました"   Worksheets("Sheet1").Range("A1").Value = i & "回目です"   st = Timer   Do While Timer < st + pt     DoEvents   Loop  Next i End Sub

suffre
質問者

お礼

ありがとうございます!DoEventsを入れるだけでTextBoxにも毎回表示されるようになりました! 私のPCは遅いのでこれで十分です。 助かりました~。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

GetTickCountなど、いろいろ試してみましたが、私の環境ですと、やっぱりSleepに落ち着いてしまいますね。Sleepメモリの占有率が低いのです。 '<モジュールの先頭に置く> Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) Private Sub CommandButton1_Click()  Dim myWaitTime As Long  Dim i As Integer   myWaitTime = 500 '1/1000 秒  i = 1 '初期値  Do   Sleep myWaitTime   DoEvents   TextBox1.Value = i & " を入力しました。"   Worksheets("Sheet1").Range("a1").Value = i & " 回目です。"   i = i + 1  Loop Until i > 30  Beep End Sub

suffre
質問者

お礼

いつもお世話になっておりますm(_ _)m ちょっと難しい方法ですね・・・。参考にさせていただきます!

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.3

こんな感じで如何でしょうか。 Private Sub CommandButton1_Click() Dim i As Long For i = 1 To 30   Me.TextBox1.Value = i & "を入力しました"   Worksheets("Sheet1").Range("A1").Value = i & "回目です"   Me.Repaint   Application.Wait (Now + TimeValue("0:00:01")) Next i End Sub

suffre
質問者

お礼

ありがとうございます。 アプリケーションにウエイトを入れられるのですね。 #3の方のやり方とあまり変わらない速度で実行できました。 参考になりました。

  • rio_d
  • ベストアンサー率47% (71/149)
回答No.1

おはようございます。 たぶん、ちゃんとテキストボックスには30回表示されていると思います。 ただ、処理が早すぎて目に見えないだけだと思います。 これだとFor~Nextループは一瞬で終わってしまいますよ。 下記をNext iの直前に入れると、1秒ずつ待ってくれます。 newHour = Hour(Now()) newMinute = Minute(Now()) newSecond = Second(Now()) + 1 waitTime = TimeSerial(newHour, newMinute, newSecond) Application.Wait waitTime

suffre
質問者

お礼

お返事ありがとうございます。 私のPCはPenIIIの1GHzなので一瞬で終わらず30を繰り返すだけでも1秒以上かかってしまいます。 実際はFor~Nextの中身はもっと複雑な処理をしているのですが、Textに改行を入れて表示させると やはり処理の最後にズラっと 1を入力しました 2を入力しました ・・・ 30を入力しました と表示されてしまいます。

関連するQ&A

専門家に質問してみよう