知らずに落ちると抜け出せなくなるVBAの落とし穴です。
- Wrokbooks.Open 以降が実行されない。
にお悩みの方は、この落とし穴に落ちていないかご確認ください。
と、原因が分かればいいのですが、今回の罠は、
「どこで罠にかかったかわからない」という厄介な罠で、
Workbooks.Openが原因であることにも気づきにくいバグです。
- マクロが何のエラーメッセージも出さずに静かに止まる。
- ステップ実行で1行ずつ試すとうまくいくからどこが原因がわからない。
- Exitもなく、絶対実行されるはずの行が実行されない。
あたりにお悩みの方も、この落とし穴を疑いましょう。
発生原因
端的に、Excelのバグだそうです。
元々Excelには、
「Shiftキーを押しながらブックを開くと、Open時の実行マクロをスキップできる」
機能が備わっています。
これがマクロ実行中に登場する「Workbooks.Open」に対しても暴発してしまい、
実行中のマクロが停止してしまうという、Excelの不具合です。
この罠が厄介なのが、エラーメッセージなどは出ず、静かに止まるため、
原因の特定が困難なことです。
私の場合は「ショートカットキーに割り当てたマクロの実行時」に発生しました。
Ctrl + ○ はメジャーなショートカットが入っていたので、
Ctrl + Shift + ○ に割り当てて実行したのですが、
ショートカットから実行したときだけマクロが止まるのです。
より正確には、キーのタッチ具合で止まったり止まらなかったりしたため、
発生時は本当に意味が分かりませんでした。
- ステップ実行で1行ずつ実行するとうまくいく← Shiftキーを離しているから
- かといって、ショートカットで一括実行すると静かに止まるので、問題以前に、どこまで実行されたのかすらわからない。
ということで、困り果てた思い出があります。
最後はブレークポイントを全部の行に設定し、
実行できるたびに1個ずつ外して原因を特定したんじゃなかったかなw
解決策
以下のマクロを、Workbooks.Openの直前で呼び出してください。
' Shiftを離すまで待機 Declare Function GetKeyState Lib "User32" (ByVal vKey As Integer) As Integer Function Shiftキーが離されるまで待機する() Do While GetKeyState(16) < 0 DoEvents Loop End Function
このFunctionが実行されると、Shiftキーを離すまでWhile文を抜けません。
Call Shiftキーが離されるまで待機する Workbooks.Open(○○~~
↑のようにEnd Functionの直後にWorkbooks.Openを持ってくれば、
高橋名人級のShiftキー連打をしない限りは冒頭のバグは発生しません。
コードの内容は人に解説出来るほど知識がないので、
すみませんが使用・学習あわせて自己責任ということでお願いします。
解決済みのバグ?
このブログ記事を書いたときにテストしたところ、このPCではバグが再現しませんでした。
本バグに関するMicrosoftのサポートページも削除されているようです。
ということは、もう治ったのかな?
だとうれしいのだけれども。
修正アップデートがExcelだったのかWindowsだったのかわかりませんが、アップデートしていない古いPCでは再現しそうなので、記事は公開しておきます。
何か情報が分かる方がいらっしゃいましたら、ご連絡くださるとうれしいです。