Excel for Macではマクロの中断はできません。
今まではある種の都市伝説だと思うようにしていましたが、ついに向き合う覚悟を決めました。Excel2011 for Macまで使用できていた*ESCまたはCommand+.でマクロを中断する機能はExcel2016以降では実装されていないようです。つまり止まらない。
基本のひとつなのに・・・。
VBAを含むプログラムでは当たり前のようにループ文が存在します。このループ文の制御をミスった時用(いわゆる無限ループ)や処理が重たく時間が掛かり過ぎているのプログラム中断操作が多くの開発環境では実装されています。
Excelの開発環境であるVBEではESC(Macでは2回押し)やCtrl+Break(MacではCommand+.)でマクロの停止をさせることができました。それでも操作を受け付けないときはCtrl+Alt+Delete(MacではCommand+Option+Esc)でExcel自体を強制終了(保存できない)する方法を取っていました。
ただし、Excel2016 for Mac以降では使用できなくなっています。Microsoftのホームページでも紹介されていません。AppleScriptTaskを使用した場合、タスクバーに歯車が表示されるのでそれをクリックして個々のAppleScriptを止める事はできますが、ショートカットキーは効きません。
何故今さら?
正直言えば、無限ループや処理のかかるプログラムなどを選別できるようになり、マクロの中断機能を利用することが極端に少くなっていたためです。
これは僕のようなセンスがない人でも長く続ければ自然と身につくものですし、近年のコーディングではある意味で型が決まっています。かつてのCPU演算のバグを利用して飛行船を浮いているように見せる神業コードが顔を覗かせる機会は少ないのです。
今回、本腰を入れて調べて確信し、その対処法を編み出してみることにしました。
対処法
単刀直入にいうとAppleScriptを使います。以下のコードを実行すると他のマクロが実行中でも、保存確認ダイアログが表示されExcelファイルを閉じることでマクロを中断しています。
tell Application "Microsoft Excel"
quit
end tell
このコードではExcelファイルが一つしか開いていない状態で実行することを想定しています。ファイルを閉じるので強制終了と何が違うのかと言われれば、ファイルの保存確認ダイアログが表示されることです。これにより現状を保存する選択ができます。(勿論、処理によっては保存できないかもしれませんが。)
このスクリプトをApp形式などでクリックと同時に実行できる環境にしておけば、ESCと変わらない中断操作が可能になります。
これからExcel for MacでVBAの学習をしようとしている方にとってマクロの中断が出来ないのはかなりストレスになると思うので、もしよければ試してみてください。尚、App形式にしたこの中断コードをFormeExcelQuit.appとして配布しています。こちらもご自由にお使いください。
![](/note/forme_blog.png)
個人的に意外だったのはAppleScriptはかなり低次元の権限を持っていることでした。