- ベストアンサー
キーボードでScreenUpdatingの切り替え
Application.ScreenUpdating = True Application.ScreenUpdating = False の切り替えをキーボードからコントロールすることは可能 でしょうか?かなり長いマクロの処理があるのですが、 処理の途中で画面更新をON/OFFさせて進行状況を見たいのです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。#1のWendy02です。 3つの方法を紹介しておきます。 >こういった作業をマクロ内に記述するのではなく、 >キーボードでTrue/Falseを(任意のタイミングで)切り替えたい >と思っています。数秒のタイミングのずれは気にしません。 この方法は、あまり使われません。マクロの実行で割り込みを入れるというのは、マクロのリスクが多少大きくなるからです。また、必ず、最後までマクロを実行させなくてはなりません。 そして最後に、 Application.EnableCancelKey = xlInterrupt で、キーを戻しておきます。 '代表的な割り込みの方法(割り込みは、Escで行います。) '---------------------------------------------- Sub TestLoopSample1() Dim i As Long On Error GoTo StopMode Application.EnableCancelKey = xlErrorHandler Application.ScreenUpdating = False For i = 1 To 60000 Cells(i, 1).Select Next i Application.ScreenUpdating = True Application.EnableCancelKey = xlInterrupt Exit Sub StopMode: Application.ScreenUpdating = True Cells(i, 1).Activate MsgBox "ストップ!" Application.ScreenUpdating = False Resume End Sub '---------------------------------------------- '私が使う方法:とにかく目を使いたくないから音を使う Sub TestLoopSample2() Dim i As Long Application.ScreenUpdating = False For i = 1 To 60000 If i Mod 5000 = 0 Then Beep Cells(i, 1).Select Next i Application.ScreenUpdating = True Exit Sub End Sub '---------------------------------------------- 'ステータスバーを使う方法(この方法が好きな人がいる) '左下に実行状態が現れる Sub TestLoopSample3() 'オプションの表示で、ステータスバーにチェックが入っていること Dim i As Long Dim j As Long Application.ScreenUpdating = False For i = 1 To 60000 '5000の部分は、あまり小さな数にしないでください。 If i Mod 5000 = 0 Then j = j + 1: Application.StatusBar = String(j, "■") Cells(i, 1).Select Next i Application.ScreenUpdating = True Application.StatusBar = False End Sub '----------------------------------------------
その他の回答 (3)
- taocat
- ベストアンサー率61% (191/310)
こんばんは。 そういう場合一般的には、ScreenUpdatingでコントロールするのではなく、Userformにでも現在処理中のレコード番号等を表示して進行状況が目に見えるようにするのではないでしょうか。 例えば、UserformにLabelを二つ配置 Label1には、現在処理中のレコード番号を表示 Label2には、レコード総数を表示 ScreenUpdatingはfalseにしておく 以上です。
- imogasi
- ベストアンサー率27% (4737/17069)
難しく考えずとも、周期的に、ある条件を満たしたとき通るステップで(件数をカウントし、MOD関数で10000件ごとに) x = InputBox("今n件目、ScreenUpdatingは") If x = "y" Then Application.ScreenUpdating = False End If のようなのを入れればどうですか。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >キーボードでScreenUpdating 製作中でしたら、コードのどこかに Stopを起きます。 そうでないとしたら、ループ上にカウンタを取って、必要な回数で、Application.ScreenUpdating のFalse/True を書き込みます。マクロは、1000分数秒単位で変化しますから、人間の入力によるキーボードではタイミングが取れないはずです。 そうではなく、無限ループを作った場合は、.EnableCancelKey 擬似的にエラーを発生して止めます。ただし、これは、必ず、元に戻すようにしないと、手がつかなくなることがあります。
補足
Wendy02さん、回答ありがとうございます。 6万行ほどの処理をさせているマクロなのですが、 処理時間を短縮させるため基本的には Application.ScreenUpdating = False で処理を行い、 (でもそうすると、現在何行目まで処理されているのか? はたまた、ハングアップしているのかわからないので...) たまに、 Application.ScreenUpdating = True で、現在何行目を実行しているのか見て、また Application.ScreenUpdating = False に戻す。 こういった作業をマクロ内に記述するのではなく、 キーボードでTrue/Falseを(任意のタイミングで)切り替えたい と思っています。数秒のタイミングのずれは気にしません。
お礼
imogasiさん、taocatさん、Wendy02さん、 回答ありがとうございます。 単純にCtlt+● や Alt+● に割り当てられてるのでは? と思ったのですが、どうもそうじゃないようですね。 (もし、そうであれば、他人の作成したマクロに対しても 応用できるかなぁと思ったのですが...) 今回はtaocatさんの方法を使用して対応します。 ありがとうございました。