VBAの処理中にExcelがクラッシュするんだけど、どうやらファイルオープン処理で異常が発生しているみたい。
あー!私も昔、それで1日ハマって抜け出せなかった事があります。きっと同じ症状なので直ぐ解決しますよ!
どうもClimb(クライム)です。ファイル数が少ない時は処理できファイル数が多くなると処理できない。こんな現象に困っていませんか?
また、複数のExcelファイルに対して、繰返し処理(ループ処理)を実行すると、エラーが起きてしまうなど、「なんでココやねん!」みたいな事ってよくありますよね。
しかも、エラーと同時に、Excelが【応答なし】となりExcelを再起動・・・。まともにデバッグができません。応答なしになった瞬間、VBE(ソースコードを打つウィンドウ)も仲良く落ちる!
非常に困りますよね。私も同じ現象で1日無駄にした事があります。今回は、こんなファイルオープン処理で発生するエラーの対処方法をご紹介します。
そもそも、このエラー、原因を特定するまでに時間がかかるんです(汗)まさか、Workbook.Openが原因でExcelマクロがクラッシュするとかアマチュアプログラマーには、想像もできないですよね。
ファイル数が少ない時は処理できて、ファイル数が多くなると処理できない
こういう現象が起きている場合は、本記事の対処法を試してみてください。
DoEvents()のたった一行で解決!
それでは、対処方法をご紹介します。
DoEvents()
↑コイツを使ってあげてください。
理由は記事後半で紹介します。理由はどうでも良くて、兎にも角にも解決したい!というせっかちなお方は、以下のようにコードを埋め込んでみてください。
まずはファイルを開くとき。
Sub workbookOpen(filePath as String)
'ここ!!
DoEvents
'ファイルを開く
workbooks.Open(filePath)
End Sub
次にファイルを閉じるとき。
Sub workbookClose(wb as workbook)
'ここ!!
DoEvents
'ファイルを閉じる
wb.Close
end Sub
え。たったこれだけなの?
はい、たったこれだけです。
そうです、たったこれだけです。もはや、おまじないレベルですね。
OpenとCloseの直前に、DoEventsを入れる。これだけです。
ふざけるな!どんだけ簡単やねん!時間返せや~!と叫びたくなる気持ち凄くわかります。(苦笑)
以前はOpenとCloseの【直後】に、DoEventsを入れるように書いておりましたが、社畜様のコメントにより、【直前】に修正しています。社畜様、コメントありがとうございました。
※パソコンが使えるならブログで稼ごう。自宅で1日2時間のタイピング作業で月収10万円を目指す「完全無料オンライン副業講座」のご案内
>>PC1台で「舐めサラ」しよう!無料オンライン副業講座はこちら
DoEvents関数は・・・
という処理をしています。
※以下は、私の推測も含まれるため間違っている可能性があります。予めご了承ください。
ファイルを開く、(対象のファイル拡張子に紐づくアプリケーションを選択して
起動する)という処理は、OS(Windows)の仕事です。
「ファイルを開く」為に、DoEvents()でOSに制御を戻す事で処理が安定するんですね。ExcelマクロとOS(Windows)が次の様な対話をしていると考えると分かりやすいと思います。
太字の部分がDoEventsです。
Excelマクロ:Excelファイルを開いてください Excelマクロ:OSさんの処理を待ちますね OS(Windows):ファイルを開きました! Excelマクロ:では次の処理に進みます |
Excelマクロがファイルを開いていると考えていた方、間違ってるわけではないですが、本質的にはニュアンスが異なるので認識を正してくださいね。
なんとなく、ファイル数が少ない時は処理でき、ファイル数が多くなると処理できない理由が分かりましたか?
どんどん、マクロを駆使して、本業を効率化し余った時間は有意義に使いましょう!
Excelマクロでお小遣いを稼ぐ方法!VBAで月5万円以上の副収入を得よう Excelマクロの常識集!スキルアップの為に学ぶべき機能
Doeventsは、OpenやCloseの「直後」ではなく、「直前」に書くべきだと思います。
https://support.microsoft.com/ja-jp/help/2701220
このエラーは、OpenやClose実行中に、データ取得のウィンドウメッセージがExcelに送られると、Excelがエラーになってしまうというバグが原因です。
DoeventsをOpenおよびCloseの前に書き、Windowsに制御を戻してやることで、クリップボードの処理を終わらせれば、ウィンドウメッセージが送られなくなりますから、正常に動作すると思うのですが、どうでしょうか?
ご指摘ありがとうございます。恥ずかしながらその辺に詳しくなくて…。参考にさせて頂きます。
大量のcsvを一つのエクセルにまとめる処理(openしてシートコピー、close)を作っていたのですが9ファイル目ぐらいで死ぬ現象にずっと悩んでいたらここにたどり着きました。。。
7ループごとにmsgboxを出してOKを押させる処理を噛ましていたのですが、DoEventsで全部解決しました。(MsgboxもたぶんWindowsに制御を渡しているんですかね?)
同じ現象で死んでいましたが。
おかげ様で解決しました!!
ほんと時間返せや~ってぼやいてしまいました笑
コメントありがとうございます!お役に立てて光栄でふ!