• ベストアンサー

ループの後に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

  • VB初心者です

    計算結果が"7"の時に限り、「当たり!」と表示される、ちょっと意味不明な計算機を作っています。 現在、下記のように書いてますが、何故かうまくいきません。(当たりが表示されない 何故でしょうか?お助けください。。m(_ _)m Private Sub Command1_Click() Label1.Caption = Str(Val(Text1.Text) + Val(Text2.Text)) Label3.Caption = "+" Label4.Visible = False '画像を隠す。 'いずれかの数字が「7」のとき、メッセージを表示する。 If Label1.Caption = "7" Then Label4.Visible = True End If End Sub Private Sub Command2_Click() End End Sub Private Sub Command3_Click() Label1.Caption = Str(Val(Text1.Text) * Val(Text2.Text)) Label3.Caption = "*" End Sub Private Sub Command4_Click() Label1.Caption = Str(Val(Text1.Text) - Val(Text2.Text)) Label3.Caption = "-" End Sub Private Sub Command5_Click() Label1.Caption = Str(Val(Text1.Text) / Val(Text2.Text)) Label3.Caption = "/" End Sub

  • プログレスバーでの経過状況表示

    vb.netでのtimerのようなものをやりたくてvbaでプログレスバーを使用して経過状況を表示するプログラムを作りました。プログレスバー自体での視覚的な経過状況表示はできたのですが、現在のパーセンテージをlabelに表示することができません。 Private Sub CommandButton4_Click() Dim i As Long Application.Visible = False i = 1 For i = i To 1000000 UserForm1.ProgressBar1.Value = i / 1000000*100 UserForm1.Label1.Caption =UserForm1.ProgressBar1.Value i = i + 1E-44 Next Application.Visible = True End Sub 上記のようにするとプログラム終了時にlabel1に現在のプログレスバーの値が表示されますが、進行中には表示されないのです。これを進行中も表示させるにはどうしたら良いのでしょうか?

  • 単純な質問で恐縮です。

    単純な質問で恐縮です。 コマンドボタン1を押したら、ラベル1が消えて、ラベル2が表示させるようにしたいのですが動きません。 Private Sub CommandButton1_Click() Label1.Visible = False Label2.Visible = True end sub どうしてでしょうか?

  • VBAでUserFormでProgressBarとLabelを同時表示できない理由は?

    VBAでUserFormをつかってProgressBarとLabelを同時に表示させる。つもりでしたが、ProgressBarが満たされた後Labelが表示されます。その理由と対策を教えて下さい。そのコードを以下に示します。 Sub a() With UserForm1 .Show vbModeless .Label1 = "始めのテキスト" End With s = 1 e = 20000 For i = s To e UserForm1.Label1 = "始めのテキスト" UserForm1.ProgressBar1.Value = i / e * 1000 Next i End Sub お願いします。

  • VB 繰り返し(ループ)について教えてください

    私は最近プログラムを書く仕事に就いたのですがまったくの初心者でなかなか課題が先に進めずに困っています。もしわかる方いましたら是非教えていただけるとうれしいです。 今わからないのが、繰り返し(ループ)です。 何とか一桁目は完成しましたがこの先がどうやってもうまくいきません。左にTextBox、真ん中にCommand、左にLabelがあり左に整数を入れて真ん中を押すと左に漢数字で表示されるという形で5桁まで出来るようにしたいのです。 今出来ているものをとりあえずはりますので是非教えてください。 Option Explicit Private Sub Command1_Click() Dim a As Integer Dim b As String a = Val(Text1.Text) If a = 0 Then b = "0" ElseIf a = 1 Then b = "一" ElseIf a = 2 Then b = "二" ElseIf a = 3 Then b = "三" ElseIf a = 4 Then b = "四" ElseIf a = 5 Then b = "五" ElseIf a = 6 Then b = "六" ElseIf a = 7 Then b = "七" ElseIf a = 8 Then b = "八" Else b = "九" Label1.Caption = b End Sub

  • タイマーがうまく動かない

    VB6.0(SP5)で、バッチファイルを実行後、5秒待つようにしたいのですが、うまく動きません。 Dim ping_count As Long Private Sub Command1_Click() Shell ("executeping.bat") Timer1.Interval = 1000 Timer1.Enabled = True Do Text1.Text = "ただいま実行中" Timer1_Timer Loop Until ping_count = 5 Text1.Text = "終了" Timer1.Enabled = False End Sub Private Sub Timer1_Timer() ping_count = ping_count + 1 Text1.Text = "ただいま実行中" End Sub デバックで動かすと、ちゃんとループを5回繰り返してテキストボックスに「終了」と表示するのですが、実行するといきなり「終了」を表示してしまいます。 ループの中のTimer1_Timerをコメントにすると、デバックでは延々ループを続け、実行するとフリーズしてしまいます。 そもそもタイマーの使い方が間違っているのでしょうか? 教えてください。よろしくお願いします。

  • Excel VBAにて2つの処理を同時実行可能?

    是非お力をお貸し下さい。 よろしくお願いします。 Windows XP Excel2003 (VB6.0) メイン処理が非常に時間がかかるため、フォームを表示させ 文字(Label)を点滅させて「動いている(ハングアップしていない)」ことを 使用者に伝えようとしています。 --- Form1内のコード(メイン) --- Sub Main() Form2.Show vbModeless [ ~メイン処理~ ] End Sub --- Form2内のコード --- Sub UserForm_Initialize() Call Blink End Sub --- 標準モジュール内のコード --- Sub Blink() If Form2.Label1.Visible = True Then Form2.Label1.Visible = False Else Form2.Label1.Visible = True End If Form2.Repaint DoEvents Application.OnTime Now + TimeValue("00:00:01"), "Blink" End Sub これを実行すると、メイン処理が終了した後にForm2内の文字が 点滅します。 実現したいのは「使用者が動いていることを(ハングアップしていない ことを)確認出来る」という点です。 どうぞ よろしくお願いします。

  • Excel2003で簡単な図形の表示と非表示のプログラムを作成したので

    Excel2003で簡単な図形の表示と非表示のプログラムを作成したのですが上手く出来ません UserForm1に Private Sub OptionButton1 Click() ActiveSheet.Shapes("Oval 1").Visible=True 'ワークシート1に楕円の図形1表示 ActiveSheet.Shapes("Oval 2").Visible=False 'ワークシート1に楕円の図形2非表示 End Sub Private Sub OptionButton2 Click() ActiveSheet.Shapes("Oval 1").Visible=False 'ワークシート1に楕円の図形1非表示 ActiveSheet.Shapes("Oval 2").Visible=True 'ワークシート1に楕円の図形2表示 End Sub 上記の記述では上手くいくのですが、下記の様に ワークシート2の図形3と4も同様に表示・非表示したいため追加するとエラーになります。 UserForm1に Private Sub OptionButton1 Click() ActiveSheet.Shapes("Oval 1").Visible=True 'ワークシート1の楕円図形1表示 ActiveSheet.Shapes("Oval 2").Visible=False 'ワークシート1の楕円図形2非表示 ActiveSheet.Shapes("Oval 3").Visible=True 'ワークシート2の楕円図形3表示 ActiveSheet.Shapes("Oval 4").Visible=False 'ワークシート2の楕円図形4非表示 End Sub Private Sub OptionButton2 Click() ActiveSheet.Shapes("Oval 1").Visible=False 'ワークシート1の楕円図形1非表示 ActiveSheet.Shapes("Oval 2").Visible=True 'ワークシート1の楕円図形2表示 ActiveSheet.Shapes("Oval 3").Visible=False 'ワークシート2の楕円図形3非表示 ActiveSheet.Shapes("Oval 4").Visible=True 'ワークシート2の楕円図形4表示 End Sub VBAの勉強中の初心者です。教えて頂けないでしょうか。

  • フォームを正しく最前面にする方法は?

    VB6(SP4)をWin2000で使用しています。(下記問題はWinMeでも生じます) フォームを一度消した後、処理をして、処理の終了後、再度表示すると最前面にならずに、タスクバー上のボタンやフォームのタイトルバーが点滅するだけになってしまいます。どのようにすれば、ちゃんと最前面になるのでしょうか? プログラムの内容は Private Sub Command1_Click()   Me.Visible = False   ※処理(他のAPを起動し、そのAPが終了するまで待機する)   Me.Visible = True   Me.SetFocus End Sub よろしくお願いします。

  • MDIParent1に、ToolStripButton1とLabel1

    MDIParent1に、ToolStripButton1とLabel1、Label2を 配置しています。 やりたいことは  (1)ToolStripButton1をクリックしてForm1を表示させる。  (2)Label1をクリックしてForm1のTextをLabel1のTextに変更する。  (3)Label2をクリックしてForm1のTextをLabel2のTextに変更する。 最初に表示させたForm1のTextのみを変更させる。 現在下記のプログラムを実行したのですが Label1をクリックすると新たにForm1が表示されてしまいます。 (Form1のTextはLabel1のTextに変更されている) Label2をクリックすると新たにForm1が表示されてしまいます。 (Form1のTextはLabel2のTextに変更されている) クリックする毎にForm1がふえていきます。 対策方法を教えてください。 Public Class MDIParent1 Dim F1 As Form1  Private Sub ToolStripButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton1.Click Dim frm As New Form1 frm.MdiParent = Me frm.Show() End Sub   Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click F1 = New Form1 F1.Visible = True F1.Text = Label1.Text Label1.BorderStyle = BorderStyle.Fixed3D Label2.BorderStyle = BorderStyle.None End Sub   Private Sub Label2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label2.Click F1 = New Form1 F1.Visible = True F1.Text = Label2.Text Label2.BorderStyle = BorderStyle.Fixed3D Label1.BorderStyle = BorderStyle.None End Sub End Class