• ベストアンサー

ループの後にTrueになる不思議

下記のコードを実行してみます。 Private Sub Command1_Click() ProgressBar1.Visible = True Label1.Visible = True ProgressBar1.Max = Val(Text1.Text) For i = 1 To Val(Text1.Text) Text1.Text = i ProgressBar1.Value = i Next i MsgBox "終了しました。" ProgressBar1.Visible = False Label1.Visible = False End Sub 「ProgressBar1」はループに入る前に「Visible = True」になります。 「Label1」はループ終了後に「Visible = True」になります。 「Text1.Text = i」はループ終了後に表示されます。 本来は、「Label1」はループに入る前に「Visible = True」にして、「Text1.Text = i」をループ中に表示させたいのですが、できません。 どこかコードが間違っているのでしょうか。

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

  • ベストアンサー
  • ykkw_2001
  • ベストアンサー率26% (267/1014)
回答No.1

ループ内に doevents をいれてみたら、どうでしょか?

xiaolong_goo
質問者

お礼

できました。 有り難うございます。

その他の回答 (1)

  • kougasha
  • ベストアンサー率32% (34/105)
回答No.2

Windowsのプログラムというのは、OSからイベントで駆動され、プログラムでの処理が終わってからOSに制御を返します。 そのため、基本的にはひとつのイベント内で、他のイベントが発生するような処理は思うように行かないことがあるのです。 (ここでは詳しくは説明しきれませんが...) ykkw_2001さんのおっしゃる「DoEvent」ステートメントは、このひとつのイベント内での連続処理中に、一度、プログラムが制御を手放してWindowsに処理をするタイミングを与えるための命令です。 お試しください。

xiaolong_goo
質問者

お礼

>他のイベントが発生するような処理は思うように行かないことがあるのです。 ...どうも、そのようですね。 しかしながら、 「ProgressBar1」がループ前に「Visible = True」 「Label1」がループ終了後に「Visible = Truue」 同じループに入る前なのに・・・・って思ってしまうのは素人考えでしょうか。 昔のBASICは必ず行の上から実行されていたので、なんとなく不思議でした。 これが、VBのバグなのか、WinOS自体の仕様なのかとの疑問もありましたが「DoEvents」が用意されているということは、WinOS自体の仕様なのでしょうね。 よくわかりました。 有り難うございました。

関連するQ&A

専門家に質問してみよう