スポンサーリンク

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ファイルに手を加えることなく,別個の「監視対象」(管理対象)を設けることが可能になる。