t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA InputBoxを使ってマクロの誤実行を防ぐ

よろしいですか?
はい

本当によろしいですか?
はい

本当に本当によろしいですか?
はい

いくら重要な処理であっても、ここまで確認されるのは鬱陶しい。
まあ、先日の航空券では、これくらい聞いて欲しかったけど。(以下参照)

さて、今回は誤って意図しない処理を実行してしまわないためのちょっとした配慮について。

ソフトウェアで、利用者がうっかり間違った処理をしてしまわないための仕組みを「フールプルーフ」という。

重要な処理の手前で、実行してよいか聞いてくれるダイアログもそのひとつ。
たとえば、職場のOutlookではメールを発信する直前に本当に発信してよいかを訪ねるVBAプログラムが組まれている。どうやらうちの会社の先輩が作ったようである。
(初期設定では、送信ボタン押したらスルっと送られてしまうので怖い)

だいたいどのようなプログラムでも、重要な処理の前には確認のダイアログが表示されるが、それでもうっかり反射的に「はい」を押してしまって後悔することがある。

もう少し安全にできないかと考えたのがこちらのコード。

Sub Sample1()
    If "READY" = InputBox("続行してよろしいですか?" & vbNewLine & _
        "よろしければ「READY」と入力してください。") Then
        MsgBox "処理しました。"
    Else
        MsgBox "キャンセルしました。"
    End If
End Sub

これなら、半角大文字で「READY」と入力するあいだに間違いに気づくかもしれない。

もっとやりたければ、文字列の内容を毎回ランダムにして入力させるという方法もある。

Formを使うとなればさらに色々できる。たとえば、よろしいですか?はい。のあとに「10秒後に実施します」と表示されたカウントダウンフォームを出して、キャンセルボタンを置いておくとか。チェックボックスをクリックしてから「はい」を押せるフォームにしておくとか。

ただし、間違えても簡単にリカバリできるような処理にまで確認を入れるとそれはそれでうっとうしい。たとえばCtrl+Cを押すたびに、「コピーします。本当によろしいですか?」などと聞かれたらたまらない。

それと、マクロ終了時に「○○を実行しました!」といったメッセージボックスを出すケースも多いが、あれも場合によってはお節介になるので、たとえばステータスバーに数秒間出すとか、タイマーで閉じる小さいフォームを角の方に出すとか、ユーザーの作業を妨げない工夫はいろいろある。完了メッセージを見逃した場合に備えて、操作ログをテキストファイルに出力しておけばより安全だ。

重要なのは、「場合による」ということ。
テンポよく何十件もさばくタイプの作業なのか、慎重に1ステップずつすすめる作業なのか、失敗した場合のリスクはどれほどなのか等によってバランスよく通知手段・確認手段を選択したい。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。