• ベストアンサー

エクセルマクロの質問です

大量の計算をさせるときに「中断ボタン」等を表示することは可能でしょうか? 例えば下記のマクロで Sub tes() For i = 1 To 250 Step 1 For j = 1 To 65530 Step 1 Cells(j, i) = 1 Next j Next i End Sub ↑を実行すると作業に時間がかかりますが、その待ち時間中に「中断は下記をクリック(Msgbox的な表示)」のように表示したいです。 ちなみにエクセル2003です! アドバイスの程よろしくお願いいたします。

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

  • ベストアンサー
  • DreamyCat
  • ベストアンサー率56% (295/524)
回答No.3

ご提示のコードだとDoEventsが無いのでしばらくしたらフリーズしそうです。 2003版までだと大丈夫かもしれませんが2007や2010版では実行が完了できないのではないかと思います。 Doeventsを入れると当方の古いVista機では60分以上かかりそうです。 (最初の30秒ほどからの推測) また、この場合に限定ですが 表示方法などを多少工夫し事前に時間を知らせ、原則として中断しないで済むように考えてみました。 中断する場合はシートに配置したコマンドボタンで停止させます。 計算を優先し、10列分の計算終了ごとにストップするようにしています。 Option Explicit Public stp As Boolean Sub test() Dim tm As Single Dim i As Long Dim j As Long Dim k As Long Dim vl(1 To 65530, 0) As Long Rows("1:65530").ClearContents MsgBox "PCによってたぶん30~100秒ほどかかります" tm = Timer 'Application.ScreenUpdating = False For k = 0 To 24 For i = 1 To 10 Step 1 For j = 1 To 65530 Step 1 vl(j, 0) = k Next j Next i With Sheets("sheet1") .Range(.Cells(1, k * 10 + 1), .Cells(65530, (k + 1) * 10)).Value = vl End With DoEvents: DoEvents: DoEvents If stp = True Then stp = False: Exit For Next 'Application.ScreenUpdating = True MsgBox Timer - tm End Sub この場合だと当方の古いVista機、Excel2010で65秒かからずに済み、 ご提示のコードにDoEventsをいれたものより60倍くらい早く処理が終わります。

osarusan0214
質問者

お礼

ちゃんと確認していなかったのですが2003でもとまってしまいました^^; このソースで試したところちゃんと動作しました~^^ よくわからない表記があるので調べてみます! ありがとうございました~^^

その他の回答 (3)

  • gungnir7
  • ベストアンサー率43% (1124/2579)
回答No.4

ループ計算中は制御がプログラム側に独占されるため、 Doeventsで制御をOSに返してあげる必要があります。 文中の中断ボタンのXXXは適当な名前です。 必要なボタンを表示・非表示しています。 MsgBoxみたいにするにはダイアログを作成します。 ダイアログまで作成するとちょっと大変になります。 Sub tes() LoopFlg=True XXX.Visible = True For i = 1 To 250 Step 1   For j = 1 To 65530 Step 1     Cells(j, i) = 1     DoEvects     If LoopFlg = False Then Goto Syuryo   Next j Next i Syuryo:XXX.Visible = False End Sub 文中のLoopFlgはグローバル変数です。 XXX_Click()でLoopFlgをFalseにしてあげればいいです。 グローバル変数、ダイアログの説明は以下を参照して下さい。 http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/vb_e61.htm

osarusan0214
質問者

お礼

なるほど~ 他の方に比べてとても分かりやすい解説ありがとうございます! DoEventsの使い方を覚えないとならないですね^^ ありがとうございました!

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.2

一例です。 マクロ途中で中断はescキー押下ですのでこのキーが押下されたら、Msgboxで中断可否ボックスを表示してOKなら中断、NOなら継続としていますが如何でしょうか。 Sub tes() Application.EnableCancelKey = xlErrorHandler On Error GoTo MyError For i = 1 To 250 Step 1 For j = 1 To 65530 Step 1 Cells(j, i) = 1 Next j Next i Exit Sub MyError: If MsgBox("中断しますか?", vbQuestion + vbYesNo) = vbNo Then Resume End If End Sub

osarusan0214
質問者

お礼

escで抜けるのですね! 分かりやすいですが、できればマウスのみで操作したいです^^ でも、とても参考になりました!ありがとうございました。

  • kybo
  • ベストアンサー率53% (349/647)
回答No.1

ユーザーフォームにコマンドボタンを1つだけ配置します。 コマンドボタンには以下の様に記述 Private Sub CommandButton1_Click()   k = True End Sub 標準モジュールは以下の様に記述 Public k As Boolean Sub test() k = False UserForm1.Show False For i = 1 To 250 Step 1 For j = 1 To 65530 Step 1 Cells(j, i) = 1 DoEvents If k = True Then Exit Sub End If Next j Next i End Sub

osarusan0214
質問者

お礼

このソースで試したところちゃんと動作しました~^^ よくわからない表記があるので調べてみます! ありがとうございました~^^

関連するQ&A