• ベストアンサー

キーボードでScreenUpdatingの切り替え

Application.ScreenUpdating = True Application.ScreenUpdating = False の切り替えをキーボードからコントロールすることは可能 でしょうか?かなり長いマクロの処理があるのですが、 処理の途中で画面更新をON/OFFさせて進行状況を見たいのです。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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 '----------------------------------------------

copycopycopy
質問者

お礼

imogasiさん、taocatさん、Wendy02さん、 回答ありがとうございます。 単純にCtlt+● や Alt+● に割り当てられてるのでは? と思ったのですが、どうもそうじゃないようですね。 (もし、そうであれば、他人の作成したマクロに対しても 応用できるかなぁと思ったのですが...) 今回はtaocatさんの方法を使用して対応します。 ありがとうございました。

その他の回答 (3)

  • taocat
  • ベストアンサー率61% (191/310)
回答No.3

こんばんは。 そういう場合一般的には、ScreenUpdatingでコントロールするのではなく、Userformにでも現在処理中のレコード番号等を表示して進行状況が目に見えるようにするのではないでしょうか。 例えば、UserformにLabelを二つ配置 Label1には、現在処理中のレコード番号を表示 Label2には、レコード総数を表示 ScreenUpdatingはfalseにしておく   以上です。  

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

難しく考えずとも、周期的に、ある条件を満たしたとき通るステップで(件数をカウントし、MOD関数で10000件ごとに) x = InputBox("今n件目、ScreenUpdatingは") If x = "y" Then Application.ScreenUpdating = False End If のようなのを入れればどうですか。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 >キーボードでScreenUpdating 製作中でしたら、コードのどこかに Stopを起きます。 そうでないとしたら、ループ上にカウンタを取って、必要な回数で、Application.ScreenUpdating のFalse/True を書き込みます。マクロは、1000分数秒単位で変化しますから、人間の入力によるキーボードではタイミングが取れないはずです。 そうではなく、無限ループを作った場合は、.EnableCancelKey 擬似的にエラーを発生して止めます。ただし、これは、必ず、元に戻すようにしないと、手がつかなくなることがあります。

copycopycopy
質問者

補足

Wendy02さん、回答ありがとうございます。 6万行ほどの処理をさせているマクロなのですが、 処理時間を短縮させるため基本的には Application.ScreenUpdating = False で処理を行い、 (でもそうすると、現在何行目まで処理されているのか? はたまた、ハングアップしているのかわからないので...) たまに、 Application.ScreenUpdating = True で、現在何行目を実行しているのか見て、また Application.ScreenUpdating = False に戻す。 こういった作業をマクロ内に記述するのではなく、 キーボードでTrue/Falseを(任意のタイミングで)切り替えたい と思っています。数秒のタイミングのずれは気にしません。

関連するQ&A