和風スパゲティのレシピ

日本語でコーディングするExcelVBA

Workbooks.Open中にShiftを押すとマクロが停止する

知らずに落ちると抜け出せなくなる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では再現しそうなので、記事は公開しておきます。

何か情報が分かる方がいらっしゃいましたら、ご連絡くださるとうれしいです。