Excel VBAを作るとき、コードの参考事例をネットで検索したのですが、なかなか正解にたどり着けなかったので、備忘録のために書いておきます。

取り急ぎ、マクロサンプル


 まずは、ズバリっ!サンプルマクロをお知らせしましょう。

 マクロ登録済みExcelブックはこちら。



 すっごくシンプルでなんてコトはないコードのようですが、正解にたどり着けなかったのは、つぎの2点です。

はい、いいえ、キャンセルの処理の書き方は?


 MsgBoxで示される3つのパターンを書かないといけないんですが、なかなかコレっ!という情報にヒットしませんでした(検索の方法が悪いのかな・・・)。

 IF Then Elseで、2つのボタンの処理を表したサンプルはすぐでてくるんですけどね。

 いろいろ探して Select を使えば良いってことがわかりました。

キャンセルのときの処理は?


 キャンセルのときの処理を具体的に書くと、「ブックを閉じるという処理をキャンセルする」ということで、結果「ブックを閉じないで開いたまま」にしたいのです。

 ところが、この「一度ブックを閉じようとする処理(Workbook_BeforeClose)を途中でやめて無かったことにする」という処理の方法が、なかなか見つかりませんでした。

 Cancel = True だけで良かったんですね。Private sub のところに、(Cancel As Boolean)と書いてあるので、Cancelは変数でBoolean型であることがわかります。Cancelという変数にTrueをセットすると「ブックを閉じる」という処理がキャンセルされて、結果「ブックを閉じないで開いたまま」になるようです。

補足(なぜ、このマクロが必要か?)


 このマクロが必要になったのは、「ブックを閉じるときに自動的にバックアップのブックを作る」という処理をしようとしたときでした。

 単純に(Workbook_BeforeClose)にバックアップのブックを作る処理を書いた場合、次のような不具合があります。

< 不具合例その1 >
 オリジナルのブックを上書き保存しなくても、そのままバックアップのブックを書き出して終了してしまいます。結果、次にオリジナルブックを開いたとき、前回の処理が反映されていないことになります(バックアップのブックだけが変更されている状態)。

< 不具合例その2 >
 では、オリジナルのブックを保存してから、バックアップのブックを保存する処理にすれば良さそうなものですが、この場合「ブックを開いて、ただ中身を確認するだけで閉じる」という操作をした場合でも、オリジナルのブックが書き換わってしまいます。「ただ中身を確認するだけ」なので書き換わらないだろ・・・と思われがちですが、意図しない変更(たとえば、キーボードにうっかり触れてしまって大事な式の上に"p"などの文字が入力されているなど)は良くあることです。

<不具合例その3>
 では、「保存するか」「保存しないか」の2択のボタンを作れば良さそうなものですが、この場合、処理をキャンセルすることができません(MsgBoxの右上の“☓”が押せません)。キャンセルする方法あるのかな・・・。

 以上のことから、(Workbook_BeforeClose)の処理で、ブックを閉じようとするときに、次のようにファイルの保存を明示的に操作するようにしたいと考えたのでした。
  • 「はいボタン」オリジナルブック、バックアップブック共に保存
  • 「いいえボタン」オリジナルブックを保存しないで、バックアップブックのみ保存(または、両方保存しない)
  • 「キャンセルボタン」ファイルを閉じる・・・という処理をキャンセル(結果、ファイルは閉じない)

まとめ


 わかればスッゴク単純なことだと思うんですけど、なかなか正解にたどり着けないコトってありますよね。

 今回の場合、「MsgBox yes no cancel」とか、「Workbook_BeforeClose 中断」とかのキーワードで調べたけど、MsgBoxに関する基本的な情報はヤマほどでてくるのに、調べたいことズバリの情報が見当たりませんでした。

 こういう情報がチャチャッと確認できる本があれば良いのにな・・・と思います。オススメがあれば、教えてください。


0 コメント :

コメントを投稿