VB Loopを一時停止し再開あるいはキャンセル

このQ&Aのポイント
  • VB Loopを一時停止し再開あるいはキャンセルする方法を教えてください。
  • Loopで処理を回していますが、途中で一時停止し、DataGridViewに表示されている処理結果を確認したりコピーしたりしたいです。
  • MessageBoxを使用すると一時停止できますが、DataGridView上の処理結果が扱えません。停止・再開・キャンセルする方法を教えてください。
回答を見る
  • ベストアンサー

VB Loopを一時停止し再開あるいはキャンセル

Loopで処理を回しています。処理件数が多く、処理の途中で一時停止させ、DataGridViewに表示されている処理結果を目で確認ないしマウスでコピーしてから、処理を再開ないしキャンセルして終了させる仕様を作成中です。 MessageBoxを使用すれば、Loopは一時停止出来たのですが、MessageBoxだとDataGridView上の処理結果をマウスでコピーなど出来ません。 そこで、MessageBoxを使用せずに、以下のコマンドを書いてみたのですが、最初のStopFlag=Trueが効くだけで次のコマンドは一瞬で処理されLoopが続いてしまいます。いかにすればLoopを一時停止できるか教えてください。 <変数宣言> Public StopFlag As Boolean Public CancelFlag As Boolean <前処理> TextBox1.Text = "処理待ち" 'テキストボックスに処理ステータスを表しています。 TextBox1.Refresh() <処理> Do Me.Cursor = Cursors.WaitCursor '砂時計開始 TextBox1.Text = "処理中" ’ステータスを処理中として表示 TextBox1.Refresh() ~ Application.DoEvents() 'ストップボタンを押下したらここでDoEventsさせます。 If StopFlag = True Then ’ここでLoopを一時停止させておきたいのです。 Me.Cursor = Cursors.Default '一旦砂時計を止めます TextBox1.Text = "処理一時停止" TextBox1.Refresh() If StopFlag = False Then ’再開ボタンが押下されたらここで再開させたい。 TextBox1.Text = "処理中" ’処理中と表示させます TextBox1.Refresh() Me.Cursor = Cursors.WaitCursor '砂時計再開です ElseIf CancelFlag = True Then ’キャンセルボタンが押下されれば、処理はLoopを抜けます。 TextBox1.Text = "キャンセル" TextBox1.Refresh() Exit Do End If Loop '----------ストップボタン---------- Private Sub Button2_Click~ StopFlag = True End Sub '----------再開ボタン---------- Private Sub Button3_Click~ StopFlag = False End Sub '----------キャンセルボタン---------- Private Sub Button4_Click~ CancelFlag = True End Sub この質問に補足する

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

  • ベストアンサー
  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.2

失礼、コルーチンを使うべきらしい。 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=44349&forum=7

tsutomu0111
質問者

お礼

ありがとうございました。 掲載されていたIdleというわけにはいきませんでしたが、 If StopFlag = True Then の後、StopFlag=FalseになるまでLoopというコマンドにしました。 また掲載されていた、Button1.Enabled = Falseなど役立ちました。

tsutomu0111
質問者

補足

ありがとうございます。 今読んで、早速試しているところです。 結果踏まえて、また連絡差し上げます。

その他の回答 (1)

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.1

関連するQ&A

  • VB 処理中にプログレス数を表示するには?

    VBでの処理数が多く、また時間もかかる事からプログレスバーを用いて処理を見ているのですが、プログレスバー以外にプログレス数を見たいと思っています。 どのようにすれば実現できるか教えてください。 詳細は省きますが、現在はこんなコマンドで、処理中に処理総数と処理経過数を出力しようとしていますが、全処理が終了した時点ででしか出力されません。 Private Sub Button1_Click ~ ’スタートボタンを押下 TotalProcess = 1000000 '例えば100万件の処理総数があったとして TextBox1.Text = TotalProcess Do Until ~    ~    Processing = Processing + 1    TextBox2.Text = Processing Loop テキストボックスのプロパティーをいじれば、出来るのかな?など考えておりますが、わかりませんので、ご存知の方教えてください。

  • VBでこんなことできますか??

    例えば、テキストボックスが縦に100個並んでいるとします。あるボタンを押すと、textbox1~textbox100までの値(.text)を、順番にmsgboxで出していくとしたら・・・。 Sub bottun1_click msgbox textbox1.text msgbox textbox2.text msgbox textbox3.text ・ ・ msgbox textbox100.text End Sub じゃ無いと無理でしょうか? 何とかループ文でできないでしょうか? 知りたいことは、 オブジェクト名「textbox1」を何とか"textbox" & "1" のように表現できないものでしょうか?? これが表現できれば、変数の値を1~100回ループすれば たったの1文でできるような気がします。 どなたかご教授下さい。

  • VBマクロ 経過時間の表示

    こんにちは。VB勉強中の初心者です。 時間を計ろうと[start][stop]ボタンと [スタート時刻][ストップ時刻][経過時間]を表示するテキストボックスを作り、 WEB検索やテキストなどから引用し、以下のようなコードを書き込みました。 Private Sub CommandButton1_Click() StartTime = Time TextBox1.Text = StartTime TextBox2.Text = "" TextBox3.Text = "" CommandButton1.Enabled = False CommandButton2.Enabled = True End Sub Private Sub CommandButton2_Click() StopTime = Time t = (StopTime, StartTime)*24*3600 TextBox1.Text = StartTime TextBox2.Text = StopTime TextBox3.Text = t CommandButton1.Enabled = True CommandButton2.Enabled = False End Sub ですが、これでは[経過時間]の表示が秒単位の整数です。 表示方法を[時刻]と同様に「h:mm:ss」とすることは可能でしょうか? また、可能であれば、どのように加工したらよいでしょうか? よろしくお願いいたします。

  • VBでデバックするとエラーになる。

    VBでデバックすると下のようなエラーがでます ArgumentNullExceptionはハンドルされませんでした。 値を Null にすることはできません。 パラメーター名: activationContext VBを初めて日が浅いのでヘルプを読んでも意味が理解できませんでした。 なので、易しく回答してもらえると嬉しいです コードは下です Public Class Form1 'TextBox2に入力したURLをWebBrowser1で表示する Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click WebBrowser1.Navigate(TextBox2.Text) End Sub 'ブラウザ→戻るでWebBrowser1を処理する Private Sub 戻るToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 戻るToolStripMenuItem.Click WebBrowser1.GoBack() End Sub 'ブラウザ→進むでWebBrowser1を処理する Private Sub 進むToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 進むToolStripMenuItem.Click WebBrowser1.GoForward() End Sub 'ブラウザ→テキストボックスにURLを入力した時の処理 Private Sub ToolStripTextBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripTextBox1.Click WebBrowser1.Navigate(ToolStripTextBox1.Text) End Sub 'TextPageのタブをクリックした時のイベント Private Sub TabPage1_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabPage1.Enter TextBox2.Visible = False Button1.Visible = False ブラウザToolStripMenuItem.Enabled = False 書式ToolStripMenuItem.Enabled = True ToolStripMenuItem1.Enabled = True End Sub 'BrowserPageのタブをクリックした時のイベント Private Sub TabPage2_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabPage2.Enter TextBox2.Visible = True Button1.Visible = True ブラウザToolStripMenuItem.Enabled = True 書式ToolStripMenuItem.Enabled = False ToolStripMenuItem1.Enabled = False End Sub Private Sub 新規ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 新規ToolStripMenuItem.Click TextBox1.Text = ("") End Sub Private Sub 開くToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 開くToolStripMenuItem.Click Dim selectButton As DialogResult Dim filename As String selectButton = OpenFileDialog1.ShowDialog() filename = OpenFileDialog1.FileName If selectButton = DialogResult.OK Then Try TextBox1.Text = _ My.Computer.FileSystem.ReadAllText(filename, System.Text.Encoding.Default) Me.Text = "Visual Text" & filename Catch ex As Exception End Try End If End Sub Private Sub 保存ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 保存ToolStripMenuItem.Click Dim selectButton As DialogResult Dim filename As String selectButton = SaveFileDialog1.ShowDialog() filename = SaveFileDialog1.FileName If selectButton = DialogResult.OK Then Try My.Computer.FileSystem.WriteAllText(filename, TextBox1.Text, False, System.Text.Encoding.Default) Me.Text = "Visual Text" & filename Catch ex As Exception End Try End If End Sub Private Sub フォントToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles フォントToolStripMenuItem.Click Dim fd As New FontDialog() fd.Font = TextBox1.Font fd.Color = TextBox1.ForeColor fd.MaxSize = 19 fd.MinSize = 8 fd.FontMustExist = True fd.AllowVerticalFonts = False fd.ShowColor = True fd.ShowEffects = True fd.FixedPitchOnly = False fd.AllowVectorFonts = True If fd.ShowDialog() <> DialogResult.Cancel Then 'TextBox1のフォントと色を変える TextBox1.Font = fd.Font TextBox1.ForeColor = fd.Color End If End Sub End Class

  • VB添削

    このプログラムは 例えば3 3 4とテキストボックスに数字が打ち込まれると 3×3行列が4個分 のテキストボックスがでてきます。 ここに数字を打ち込んでいき、ボタン2を押すと3×3のテキスト トボックスが出てくると同時に足し算した結果が出てくるようにしたいです。 以下のプログラムはできたところまで作成しています。 どこを直せばよいのでしょうか。 Public Class Form1 Private number As Integer Private rows As Integer Private columns As Integer Private Sub Form11_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load For i As Integer = 1 To 3 AddHandler Me.Controls("TextBox" & i).TextChanged, AddressOf TextBox_TextChanged Next End Sub Private Sub TextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) If System.Text.RegularExpressions.Regex.IsMatch(CType(sender, TextBox).Text, "[^0-9]") Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) With CType(sender, TextBox) .Text = .Text.Substring(0, .Text.Length - 1) .SelectionStart = .Text.Length End With End If Dim cnt1 As Integer Dim cnt2 As Integer Dim cnt3 As Integer If Integer.TryParse(TextBox1.Text, cnt1) And Integer.TryParse(TextBox2.Text, cnt2) And Integer.TryParse(TextBox3.Text, cnt3) Then For k = 1 To cnt3 For i = 1 To cnt1 For j = 1 To cnt2 Dim tb As TextBox = New TextBox() tb.Name = "tb" + i.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 28 + 55 tb.Left = (j - 1) * 30 + 40 * (cnt2 * (k - 1)) + 10 tb.Width = 25 Next Next Next End If End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Bounds = New Rectangle(10, 10, 1350, 800) Me.AutoScroll = True End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim sum As Double Dim cnt As Integer = 0 For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() cnt += 1 : If cnt > rows * columns Then cnt = 1 tb.Name = "tb" + cnt.ToString Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + (80 + 40 * rows) tb.Left = (j - 1) * 60 + 10 tb.Width = 40 sum = 0 For k As Integer = 1 To number sum += Double.Parse(CType(Me.Controls("tb" + (cnt + (rows * columns * (k - 1))).ToString()), TextBox).Text) Next tb.Text = sum.ToString() Next Next End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged End Sub Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged End Sub Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged End Sub End Class

  • VBAの計算について教えてください。

    お世話になります。 VBA超初心者です。 教えて頂けると助かります。 ユーザーフォームにテキストボックス1、2、3を作成し、それらを計算させて テキストボックス4に表示をさせたいと考えています。 テキストボックスに入力するパターンは以下の2種類です。 (1)すべてのテキストボックスに数値が入る (2)テキストボックス3のみに数値が入る 行いたい計算は、“(テキストボックス1 × テキストボックス2) + テキストボックス3”です。 曲りなりに作成してみましたが、テキストボックス3の数値を変えた時や削除した時などに、 テキストボックス4に入っている数値が残っていたりと、思うようにできません。 作成したものを掲載しておきます。 何卒よろしくお願いします。 テキストボックス1を変更したとき 1、3に数値が入っていれば、以下の計算を。 それ以外は“0”をテキストボックス4へ Private Sub TextBox1_Change() If TextBox1.Value = True And TextBox3.Value = True Then TextBox4 = Val(TextBox1.Text) * Val(TextBox2.Text) + Val(TextBox3.Text) Else TextBox4 = 0 End If End Sub テキストボックス2を変更したとき 2、3に数値が入っていれば、以下の計算を。 それ以外は“0”をテキストボックス4へ Private Sub TextBox2_Change() If TextBox2.Value = True And TextBox3.Value = True Then TextBox4 = Val(TextBox1.Text) * Val(TextBox2.Text) + Val(TextBox3.Text) Else TextBox4 = 0 End If End Sub テキストボックス3を変更したとき 1、2、3に数値が入っていれば、以下の計算を。 1か2に数値がなく、3に数値があれば、3の数値をテキストボックス4へ。 それ以外は“0”をテキストボックス4へ Private Sub TextBox3_Change() If TextBox1.Value = True And TextBox2.Value = True And TextBox3.Value = True Then TextBox4 = Val(TextBox1.Text) * Val(TextBox2.Text) + Val(TextBox3.Text) ElseIf TextBox1.Value = False or TextBox2.Value = False And TextBox3.Value = True Then TextBox4 = Val(TextBox3.Text) Else texbox24 = 0 End If End SubEnd Sub

  • VB2005でで正しい計算結果が出ません。

    VB2005でで正しい計算結果が出ません。 こんにちわ。プログラミング初心者です。どうかよろしくお願いします。 緯度経度を変換する計算式をプログラムしたのですが、計算結果が間違って出力されます。 下にプログラムを書くのでどこがおかしいのか、またどうすれば正しい計算結果が求められるのかを教えてください。お願いします。 ちなみにTextBox22には 3601.4589 、 TextBox23には 13942.9930 のような数字が入っています。 Private Sub seriWork() Dim buffer, buffer2() As String Dim di1, di2, dk1, dk2 As Double '~通信に関するところなので中略します~ '~ここから先が計算です~ 'Dの緯度百分率変換表示 TextBox22.Text = dN di1 = Double.Parse(Mid(TextBox22.Text, 1, 2)) di2 = Double.Parse(Mid(TextBox22.Text, 3, 7)) TextBox14.Text = di1 + (di2 / 60).ToString() 'Dの経度百分率変換表示 TextBox23.Text = dE dk1 = Double.Parse(Mid(TextBox23.Text, 1, 3)) dk2 = Double.Parse(Mid(TextBox23.Text, 4, 7)) TextBox15.Text = dk1 + (dk2 / 60).ToString() Me.Invoke(New ReDelgate(AddressOf completed)) End If Loop Catch ex As Exception MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error) Finally If SerialPort1.IsOpen = True Then SerialPort1.Close() End Try End If この計算の意図は、GPSレシーバーから受信される「3601.4589」のような形の座標形式を googl mapで表示できる座標に変換するものです。 たとえば、シリアルポートでGPSから受信した緯度が3601.4589 の場合は、「=36 + (1.4589 / 60)」と計算すると 36.024315 のような形になります。 あと、3601.4589 を 36と1.4589で分割するためにMidを使用しています。 /60は公式です。 上記プログラムだと 62.3333333 のような誤解答が出てきます。 どうか教えてください。お願いします。

  • エクセル VBAのチェックボックスについて

    お読みくださり、ありがとうございます。 エクセル初心者でございます。 エクセルのマクロなのですが、 お詳しい方、是非教えて欲しいです!汗 調子に乗って入力フォームなるものを作りました。 入力フォームの中にて、チェックボックスで「ある」「なし」の項目を入れてみたのですが、チェックしていないのに、値が入る現象が起きています汗 以下、素人が書いたコードを恥を承知で記載させていただきます。 Private Sub CheckBox1_Click() If CheckBox1.Value = True Then OK = "○" End If End Sub Private Sub CheckBox2_Click() If CheckBox2.Value = True Then NO = "×" End If End Sub Private Sub UserForm_Click() End Sub '以下のコードは、登録ボタンがクリックされたときの処理! Private Sub 登録ボタン_Click() If TextBox1.Text = "" Then MsgBox "グッズ名を入力してください。" Exit Sub End If If TextBox2.Text = "" Then MsgBox "アプローチ先を入力してください。" Exit Sub End If With Worksheets("協賛グッズ") With Cells(Rows.Count, 2).End(xlUp) .Offset(1, 0).Value = TextBox1.Text .Offset(1, 1).Value = mori .Offset(1, 2).Value = mori2 .Offset(1, 3).Value = TextBox2.Text .Offset(1, 5).Value = TextBox3.Text .Offset(1, 6).Value = TextBox4.Text .Offset(1, 7).Value = TextBox5.Text .Offset(1, 8).Value = TextBox6.Text End With End With TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" TextBox6.Text = "" CheckBox1.Value = False CheckBox2.Value = False End Sub 以上です。 おかしなところ満載かと思いますが、 チェックを入れた項目だけ値を入れたいと考えております。 おわかりになるかたおりましたら何卒お助けください汗 よろしくお願いいたします。

  • ExcelVBAで計算機(エクセル2000)

    エクセルVBAで計算機を作成してます。先程も質問させて頂いたのですが、また新たな壁にぶつかってしまいました。 クリアボタンについて、"0"を表示させる事はできたのですが、クリアボタンを押下した後、再度計算する際、直前の演算結果がメモリ上残っていて演算結果を 初期化したいのですが、上手くできません。 メモリ上の値を初期化する方法どうか教えてください。上手く説明できているかわかりませんが、お願いします。 Private Sub Clear_Click() If blnBtC = False Then        ’演算ボタンが押下される前の値 a = Val(Trim(TextBox1.Value))  TextBox1.Text = "0" Else       ’演算ボタンが押下された後の値       b = Val(Trim(TextBox1.Value)) TextBox1.Value = a TextBox1.Text = "0" End If TextBox1.Text = "0" blnBtC = True End Sub

  • VB TEXT読み取りについて

    このコードでのデバックは成功したのですが、TEXTBOX1にファイルネーム C:\Users\???\Documents\???と入力しても’パスが拒否されました’と出てしまいます。 どう解決したらよいのでしょうか、宜しくお願いします。 Public Class Form1 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim sr As System.IO.StreamReader = Nothing Try Dim file As String = TextBox1.Text sr = New System.IO.StreamReader(file, System.Text.Encoding.GetEncoding("shift_jis")) Dim doc As String = "" Do Until sr.EndOfStream doc &= sr.ReadLine & vdcrlf() Loop TextBox2.Text = doc Catch ex As Exception MessageBox.Show(ex.Message, "read") Finally If sr IsNot Nothing Then sr.Close() sr.Dispose() End If End Try End Sub Private Function vdcrlf() As String Throw New NotImplementedException End Function End Class

専門家に質問してみよう