Excelのマクロを外部に吸い出して保存するバッチ (WSH/JScriptで,VBAのソースコードだけを抜き取る)
Excelから,VBAのコードを吸い出すバッチ。
モジュールごとに,(モジュール名).bas の名前で保存される。
以下のスクリプトを実行すればよい。
vacuum_vba.js
/* Excelからマクロの全モジュールを外部に吸い出すバッチ */ // excelのファイル名と,モジュールの吸出し先パスを指定 var file_dir = "D:\\temp"; var file_name = "hoge.xls"; var file_path = file_dir + "\\" + file_name; var vacuum_dir = file_dir + "\\macros"; // ブックを開く var excel = WScript.CreateObject("Excel.Application"); excel.Visible = true; excel.Workbooks.Open( file_path ); var book = excel.Workbooks( excel.Workbooks.Count ); // JScript/WSH で,Excelファイルを読み書きしよう // http://language-and-engineering.hatenablog.jp/entry/20090717/p1 // ブック内のマクロの全モジュールをスキャンする var cnt_module = 0; var e = new Enumerator( book.VBProject.VBComponents ); for( ; ! e.atEnd() ; e.moveNext() ) { // モジュールを取得 var vba_module = e.item(); // このモジュールの名前を取得 var module_name = vba_module.Name; //WScript.Echo( module_name ); // このモジュールのエクスポート先パスを決定 var bas_path = vacuum_dir + "\\" + module_name + ".bas"; // このモジュールをエクスポート vba_module.Export( bas_path ); cnt_module ++; } // Excelを閉じて終了 excel.DisplayAlerts = false; excel.Quit(); excel = null; WScript.Echo( file_name + " から,全 " + cnt_module + " 個のモジュールを " + vacuum_dir + " 上に吸い出しました。" );
保存先フォルダはあらかじめ作っておくこと。
また,Excel上で,事前に下記の設定を行なっておくこと。
(Excel2003の場合)
ツール>マクロ>セキュリティ>信頼できる発行元>Visual Basic プロジェクトへのアクセスを信頼する をオン
(Excel2007の場合)
リボンの「開発」タブ>マクロのセキュリティ>VBAプロジェクトオブジェクトモデルへのアクセスを信頼する
http://support.microsoft.com/kb/282830/ja
※「プログラミングによるVisual Basicプロジェクトへのアクセスは信頼性に欠けます」というエラーメッセージが出ないようになる。
ソースコードの解説:
JScriptでのEnumeratorの使い方について
コレクション、Enumeratorオブジェクト(VBScriptのFor Eachのかわり)
http://www.imasy.or.jp/~hir/hir/tech/...
JScript 8.0 Enumerator オブジェクト
http://msdn.microsoft.com/ja-jp/libra...
マクロのエクスポートについて
モジュールやユーザーフォームをエクスポートするには?
http://excelfactory.net/excelvbatips/...
VBProject.VBComponentsの各要素をExportする
補足
下記のエントリでは,VBAのコードをSVNなどのバージョン管理ツールで管理しやすくするための一手法を述べた。
内容は,
- 外部コードをExcelに自動的に取り込む
という事に焦点をあてていた。
Excel VBAのマクロを,複数のブックから利用する方法 (標準モジュールをブックの外部で管理して,共通ライブラリとして読み込み)
http://language-and-engineering.hatenablog.jp/entry/20090731/p1
今回のエントリは,その逆だ。
- Excelから外部にコードを自動的に吸い出す
という事をやろうとしている。
これなら,既存のExcelファイルに手を加えることなく,別個の「監視対象」(管理対象)を設けることが可能になる。