• 締切済み

VB6 DoEventsの代わりは?

お世話になります。 progressbarを表示するために、 重たい処理のループの中ではDoEventsを入れることで表示ができているのですが、 ループとループの間でprogressbarを更新するには、どのようにしたらよろしいでしょうか? ***** 現状 for i =1 to 9999 重い処理 Frm_ProgressBar.ProgressBar1.value = 進捗数 DoEvents next i ***** やりたいこと for i =1 to 9999 重い処理A next i Frm_ProgressBar.ProgressBar1.value = 進捗数 DoEvents for i =1 to 9999 重い処理B next i

みんなの回答

  • uruz
  • ベストアンサー率49% (417/840)
回答No.3

No.2です。 ProgressBarは本来DoEvents()やRefreshで更新しなくてもValueの値を更新すると表示も更新される作りになっています、表示が更新されないのは「進捗数」が変化していないことが考えられます、そのあたりの確認をしてみてください。

  • uruz
  • ベストアンサー率49% (417/840)
回答No.2

Refreshメソッド Frm_ProgressBar.ProgressBar1.value = 進捗数 Frm_ProgressBar.ProgressBar1.Refresh

usami33
質問者

補足

回答ありがとうございます でも、ダメでした Refreshメソッドで表示が反映される前に、次のループに入ってしまい、 結果、描画は更新されませんでした。

回答No.1

Q、VB6 DoEventsの代わりは? A、やはり、DoEvents。 Frm_ProgressBar.ProgressBar1.value = 進捗数 For i =1 To 9999  重い処理B If Frm_ProgressBar.ProgressBar1.value <> 進捗数 Then    DoEvents End If Next i と、普通はこんな感じです。が、何となく違和感を感じます。 もしかしたら、要求されているのは、次のようなコードなんでしょうか? Frm_ProgressBar.ProgressBar1.value = 進捗数 Do  DoEvents Loop Until Frm_ProgressBar.ProgressBar1.value = 進捗数 For i =1 To 9999  重い処理B Next i いずれにしろ、次のコードですと問題が解決されます。 Frm_ProgressBar.ProgressBar1.value = 進捗数 For i =1 To 9999  重い処理B  DoEvents Next i

関連するQ&A

  • DoEvents関数って何?

    こんにちは。 VBAやプログラミングに詳しい皆様に 教えていただきたい質問があります。 cells(1,1)からcells(5000,1)までの値を消去するときに 処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。 そこで下記のようなコードを入力しました。 userform1.show for i =1 to 5000 cells(i,1)="" userform1.progressbar1.value=i/5000*100 next i unload userform1 しかしこれだとuserformの背景が真っ白になってしまい ラベルの文字も消えてしまいます。 そこで「EXCEL VBA パーフェクトマスター」という本を見たら for i =1 to 5000 cells(i,1)="" userform1.progressbar1.value=i/5000*100 DoEvents next i unload userform1 と入力すれば解決することがわかりました。 しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、 「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」 と書いてあるのですが正直、書いてあることがよくわかりません。 どなたかDoEvents関数について、 もう少しわかりやすく教えていただけませんか。 それから、最初に書いたコードで実行すると ユーザーフォームの背景が真っ白になってしまう原因も 教えていただけませんか? よろしくお願いいたします。

  • [VB6]プログレスバーコントロールの使用法について

    環境:VB6.0+SP5, DB: Adaptive Server AnyWhere こんにちは。 プログレスバーコントロールの使い方について質問させていただきます。 データベースにクエリを投げて、レコードセットを取得する関数myFunctionを次のように書きました。 ここで処理の進捗に合わせてプログレスバーを表示する機能を追加したいと思います。 参考書を調べた結果、↓のようなもの組み込めば良いのだろうと考えましたが、 繰り返し文の中身をどう記述して良いものかわかりません。 申し訳ありませんがお力を貸して頂けないでしょうか? また、もっとスマートな方法があれば、そちらも教えていただけると助かります。 ///////////////////////////////////////////////////// 'プログレスバーコントロールを設置したフォームを呼び出す frm_progressBar.Show frm_progressBar.ProgressBar1.Visible = True frm_progressBar.ProgressBar1.Max = q_rs!rNum For i = 1 To q_rs!rNum frm_progressBar.ProgressBar1.Value = i 'レコード取得 Next i ////////////////////////////////////////////////////// Public Function myFunction(query As String) As Recordset Dim p_rs As Recordset 'DBから取得したレコードセット Set p_rs = New ADODB.Recordset Dim q_rs As Recordset 'レコード件数を格納 Set q_rs = New ADODB.Recordset Dim i As Integer ' 'テーブルのレコード件数を取得 Set q_rs = con.Execute("SELECT COUNT(*) as rNum FROM AppEnd_Logs", , adCmdText) p_rs.CursorLocation = adUseClient p_rs.Open query, con, adOpenStatic Set myFuncsion = p_rs q_rs.Close Set q_rs = Nothing End Function

  • ループの後に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」をループ中に表示させたいのですが、できません。 どこかコードが間違っているのでしょうか。

  • Excel VBA で処理中断(DoEvents)ができなくて困ってい

    Excel VBA で処理中断(DoEvents)ができなくて困っています。 まず、CommandButton1ボタンでSampleをコールし、Sample処理の中でループを廻し、途中でCommand1ボタンをクリックして、処理中断(DoEventsによって)をいれたいと思っています。 しかし、Command1ボタンをクリックしても処理中断がきかないのです。 グローバル変数fStopにはCommand1ボタンをクリックしたときにTrueが入っていることは、MsgBoxで確認していますが、Sample処理の方に値がつたわっていないようで、ループが最後まで止まりません。 コードが悪いのでしょうか、それとも、DoEventsの使い方が悪いのでしょうか。 もし、DoEventsが使えないのであれば、代替手段はありますでしょうか。 (長時間の印刷中の処理中断に応用したいと思っています) 環境はExcel 2002 SP3 , VB 6.0 , Windows XPです。 なお、DoEventsのコードは以下のURLを参考にして作成しました。 http://officetanaka.net/excel/vba/function/DoEvents.htm コードは以下のとおりです。 '********* Dim fStop As Boolean 'グローバル変数を宣言 '********* Sub Sample() Dim i As Long fStop = False For i = 1 To 1000000 DoEvents If fStop = True Then MsgBox "処理が中断されました" Exit For End If Next i End Sub '******** Private Sub CommandButton1_Click() Call Sample End Sub '******** Private Sub Command1_Click() fStop = True MsgBox "fStop=" & fStop End Sub

  • ループ中にフォームを閉じると、様々な例外が出てしまう・・

    お世話になっております。 VB2005を勉強しております。現在、フォームが一枚だけのシンプルなプログラムを作っています。For~Nextのループ内にApplication.DoEvents()と記述して他の操作を受けられるようにしておりますが、その状態でループ中にフォームを閉じると例外が出てしまいます。それにフォームは消えまても、デバッグ中断ボタンを押すまでプログラム自体はは起動したままです。強制定期にループを破棄する方法をご教授ください。または、ループ中でも正常にプログラムを閉じる方法でも結構です。 ループ内の処理によってエラー内容は違いますが、現在はAccess.Violation.Exceptionという例外がでます。下記のように、なんの処理もしないループを作ってみましたが、やはりこれでも違う例外が出ました。 ・その1 For i As Integer = 0 To 1000000000   Application.DoEvents() Next ・その2 For i As Integer = 0 To 1000000000   Application.DoEvents()   System.Threading.Thread.Sleep(100) Next ちなみに、フォームのClosingイベントでフラグを立てて、 For i As Integer = 0 To maxInt   If flag_closing = True Then     Exit For   End If   Application.DoEvents() Next などとやってみましたが効果がありませんでした。 よろしくお願いいたします。

  • VB6)「DoEvents」について。(処理を抜けるために?

    どうもこんにちは。よろしくお願いします。 ログイン画面が表示され、IDとパスを入力し、ログインする~画面があるのですが、ログイン後の画面に更新がある場合、ログイン画面に赤い文字で点滅~という処理を行っています。 しかし、その点滅の最中にログインの処理が行われてしまうと、ログイン後の画面は普通に出てくるが、ログイン画面が再び表示されてしまう。ということが。。。 Do NextTime = GetTickCount i = i + 1 If i Mod 2 = 0 Then lblBBS.ForeColor = vbRed j = j + 1 ElseIf i Mod 2 = 1 Then lblBBS.ForeColor = &H8000000F End If '200ミリ秒のウェイト NextTime = NextTime + 400 If i = 10000 Then Exit Do 'i = 0 If NextTime = 10000 Then Exit Do 'NextTime = 0 If j = 5 Then Exit Do Do DoEvents Loop While GetTickCount < NextTime Loop 該当のところは、一番したあたりだと思うのですが、 DoEventsがヘルプを読んでもイマイチどのような物かわからず、どうすればいいのかもわからず。。。 「ログインボタンが押されたらDoExit」みたいな感じで。。。 回避できるでしょうかね??? アドバイスよろしくお願いします。

  • VB2008 ProgressBar について

    VB2008 ProgressBar について教えてください。 pictureboxの走査プログラムを作成しているのですが。 走査を行いHITした結果を四角で囲むというプログラムを作成しています。 ですが、実行するとどうしてもprogressbarが最後まで進んでから四角の描画処理をしてしまいます。以下にソースを書きますので、間違っている場所を教えてください。 よろしくお願いします。 (Textbox1を閾値としてsikiiに代入し、二次元配列Cor(,)と比較して判断します。)ProgressBarの最大値とSTEP値はFormLordで指定しています。 Dim sikii = Val(TextBox1.Text) Dim g As Graphics g = PictureBox3.CreateGraphics() Dim i, j As Integer For i = 0 To PictureBox3.width For j = 0 To PictureBox3.Height If Cor(i, j) >= sikii Then g.DrawRectangle(Pens.Black,i,j,16,16) End If ProgressBar1.PerformStep() Next j Next i MsgBox("完了しました。", , "通知")

  • VBAのDoEventsが上手く動きません

    お世話になります。 ExcelのVBAで印刷処理をしているのですが、印刷枚数が多いのでDoEventsイベントを入れ、印刷中断処理を行いたいのですが、上手くできません。 印刷中ダイアログが表示されるのが原因なのでしょうか?それともコードの書き方が悪いのでしょうか?よろしくお願いします。 コードは以下のとおりです。 ************************************************ Public Can_flg As Boolean ************************************************ Private Sub CommandButton1_Click()   Can_flg = True End Sub ************************************************ Private Sub UserForm_Activate()   Dim ms As String   Dim j As integer   Can_flg = False   For j = 1 To 31    DoEvents    If Can_flg = True Then      ms = MsgBox("印刷を中止します。", vbOKCancel)        If ms = vbOK Then         Exit For        Else         Can_flg = False        End If    End If    Me.Label1.Caption = "印刷中です… (" & j & "/" & i & "ページ)"    Sheets("テスト").PrintOut   Next j   Unload Me End Sub

  • ステータスバーを一定時間後に更新する

    office365 一定時間後(10[S]毎)にステータスバーの進捗状態を更新させたい 下記は、iを1ずつカウントしたらステータスバーを1%~100%まで表示するマクロです。 Sub sample() ' Dim i As Long Dim num As Long UserForm5.Show vbModeless UserForm5.StartUpPosition = 0 UserForm5.Top = 0 UserForm5.Left = 0 i = 1 num = 100 For  i = 1 To  num With UserForm5 .ProgressBar1.Value = i .パーセント.Caption = Int(i / num * 100) & "%" .Repaint End With Next End Sub 上記マクロに、10[s]毎にステータスバーの進捗状態を更新するマクロとしたいのですが、その方法がわからずべたのマクロで教えていただきたく。 10[S]たったら1% 20[S]たったら2% … 1000[s]たったら100% のステータスバーを表示する構成にしたいのです。

  • VBでModule1からForm1のコントロールを操作したい

    VB.NETでForm1のProgressBarをForm1.VBからではなく外部Module1.vbのサブルーチンから操作する方法はありませんか。"Dim Form1 as New Form1"などとするともうひとつフォームが開いたりしてうまくいきません。現在、下記の様にしてもうひとつ別のForm2を開いてプログレスバーを表示しております。 できるなら、Form1だけで済ませたいと思っております。 勉強不足でわかりません。どなたか教えてください。 Form2.Show() Form2.ProgressBar1.Minimum = 0 Form2.ProgressBar1.Maximum = 学習回数 Form2.ProgressBar1.Visible = True For 繰り返し = 1 To 学習回数 Form2.ProgressBar1.Value = 繰り返し Form2.lbl解析中.Text = 繰り返し Form2.Label1.Update() Form2.lbl解析中.Update()      ****処理**** Next