プロが教える店舗&オフィスのセキュリティ対策術

大量のデータを参照して出力する際に、処理を高速化するために、次のスクリーンアップデートと自動計算をOFFにして、処理後にONにすることを教わりました。実際にやってみたら確かに速くなりました。

Application.ScreenUpdating →OFF→ON
Application.Calculationl→OFF→ON

ここで、マクロを実行後、これらをOFFにしたあとに、何らかのエラーが起こって、プログラムが止まってしまったとします。そうすると、上記の2つはOFFになったままになってしまうと思います。

その後、エクセルのデータ入力などの作業をすると、そのOFFが問題になることはないでしょうか?
問題になるとしたら、何か解決策はあるでしょうか。
よろしくお願いいたします。

質問者からの補足コメント

  • つらい・・・

    for文中のエラーを想定していますので、
    On Error Resume Next
    for文
    On Error GoTo 0

    みたいな記述をすればいいと、ネットの記事で書いてありました。
    ただし、ちょっと理解ができません…

      補足日時:2016/10/10 10:42
  • つらい・・・

    失礼しました。次の記述で何とかなりそうです。

    Sub sample()
    On Error GoTo myError
    for 文
    Exit Sub
    myError
    エラーしたときの処理(ONの処理)
    MsgBox "予期しないエラーが発生しました"
    End Sub

      補足日時:2016/10/10 11:15

A 回答 (2件)

>>その後、エクセルのデータ入力などの作業をすると、そのOFFが問題になることはないでしょうか?



問題になるでしょう。

>>問題になるとしたら、何か解決策はあるでしょうか。

プログラムが止まったってことは、使っている方には明確に分かりますよね?
だから、エラーと判れば、手作業でOFFをONに変更する命令を実行します。

あるいは、エラー処理の中にOFF->ONを入れておきます。
    • good
    • 0
この回答へのお礼

ありがとうございます。使う人はエクセルに詳しくない人を想定していますので、エラー処理中にOFF→ONにするしかありません。予期しない(できない)エラーが発生した場合、OFF→ONにする記述はできるのでしょうか。

お礼日時:2016/10/10 10:28

まず第一に重要なことは、エラーが起きないように作るってこと。


起きそうなエラーを想定し、そうならないような処理を入れておく。
for の中に次々に投入される入力値を逐次チェックし、期待外の値だった場合はループを中断して抜けて何らかのメッセージを出して終了するとか、その回だけスキップしてループを継続するとか。
そもそもループに入る前にチェックできるのであれば事前に確認するとか。
そうやって可能性をどんどんつぶしていって、安全に処理できるプログラムを目指す。

そこまでやっても想定外のエラーが出る場合がある。
そういう場合はエラートラップを使用する。
VBA だと On Error について調べればよいと思う。
On Error GoTo LabelName
でエラートラップを掛けておき、エラー発生時に飛ぶ LabelName のところで ScreenUpdating を解除するとか。
    • good
    • 0
この回答へのお礼

投稿ありがとうございます。ご指摘通りがんばります。

お礼日時:2016/10/10 13:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!