ExcelVBAの構造上の欠点の一つとして、成果物だけ欲しいのだけど、マクロ有効ブック(.xlsm)で保存してしまうと、VBAのコードまで保存されてしまうことがあります。勿論、保存する際にマクロ有効ブック(.xlsm)の形式ではなく、通常のExcelブック(.xlsx)で保存すれば問題ないように見えるのですが、シートにボタン等が含まれているマクロブックだと作業用の不要なシートも保存してしまうので、保存するブックに必要なシートだけを残し、元のマクロブックは変更を加えずに閉じるという単純な作業を実現するコードを作りました。VBAコードの最後に付け加えるだけでOKです。
くどいようですが、要件を整理します。
ここからマクロを起動し、元のブックは保存せず終了。「データ」シートのみを残します。
それでは、VBAコードを示します。
<コードの前提>
・元のマクロ.xlsm :起動したマクロファイルです。
・「データ」 :加工後のデータが残るシートです。
Sub 元のマクロは変更せず閉じ、必要なシートだけ残す()
'出来上がったデータシートをコピーしておく
Sheets("データ").Copy
'アラートが出ないようにする
Application.DisplayAlerts = False
'元のマクロブックを閉じる
Workbooks("元のマクロ.xlsm").Close
'アラートが出るように戻す
Application.DisplayAlerts = True End Sub
<コードの説明>
・Sheets("データ").Copy :シートをコピーして新しいブックを立ち上げている処理
・Workbooks("元のマクロ.xlsm").Close :が元のマクロブックを閉じる処理
アラートが出ないようにしているのは、Excelマクロブックを閉じる際に、「変更内容を保存しますか」と出てくるアラート(メッセージ画面)を飛ばして、あくまでもVBAで処理するためです。このコードは結構頻繁に使用するコードで、Application.DisplayAlerts を「False」としておくと、「True」に変更するまで、あらゆるアラートが出てこなくなります。よって、コードの最後で「True」に戻しておきます。
今回コードの考え方は非常に単純で、通常のExcelにおいてシートをコピーする際にする処理をそのまま表現しただけのものです。具体的に言うと、シートのタブの箇所で右クリックすると出てくる「移動またはコピー(M)」を選択、立ち上がる「シートの移動またはコピー」という処理ボックスで、一番上にあるリストボックスから「(新しいブック)」を選び、チェックボックスの「コピーを作成する」にチェックを入れてOKボタンを押す処理です。
これまでも、同一のブック上に「Sheet1(2)」のような形でシートをコピーする方法はよく知られているのですが、同一のブック上ではなく、別の新しいブックとしてシートをコピーする処理方法を知りませんでした。部署が異動になった際にこの処理を同僚から教えてもらい、コロンブスの卵というか、目から鱗でした。その後、プロセスを一つ省略できるなあと思い、せっせとこれまで作成したマクロにこの処理を追加しました。まあ、私はものぐさ野郎なのです。社会保険庁職員ではありませんが、仕事でのPCにおけるキータッチ数を制限することができ、この上ない喜びを感じています。