- そのアプリは 開いただけで自動的に VBA が自動的に起動してしまう
- xlt ファイルなので、名前を変えないまま保存できず、毎回自分自身を選択しなくてはいけない
こういう場合、Ariawase という Windows Scripting Host のツールで VBA のソースをエクスポート / インポートするのが定石です。が、ちょっと User Interface が好みではない。
ということで、同ツールのソースから必要最小限の部分をパクって 参考にして 、エクスポートするコードを JScript で書いてみました
(本当は Go でいきなり書きたかったけど、COM の構成を理解するために、まず JScript でプロトタイプを書いた)
exportvba.js
var args = WScript.Arguments; if( args.length < 1 ){ WScript.Echo( "cscript exportvbs.js XLSNAME" ); WScript.Quit(); } var fsObj = new ActiveXObject("Scripting.FileSystemObject"); var excel = new ActiveXObject("Excel.Application"); try{ excel.Visible = true; var targetPath = fsObj.GetAbsolutePathName(args(0)); WScript.Echo( "extract: " + targetPath ); var book = excel.WorkBooks.Open(targetPath); for( var p = new Enumerator(book.VBProject.VBComponents) ; ! p.atEnd() ; p.moveNext() ){ var obj = p.item(); var name = obj.Name; switch( obj.Type ){ case 1: name += ".bas"; break; case 2: name += ".cls"; break; case 3: name += ".frm"; break; case 100: name += ".dcm";break; } var fullpath = fsObj.GetAbsolutePathName( name ); WScript.Echo( fullpath ); obj.Export( fullpath ); } }finally{ if ( excel != null ){ excel.Quit(); } }
cscript exportvba.js foo.xls
とすると、カレントディレクトリに foo.xls 内の VBA ソースを展開するという本当にシンプルな動作です。
さて、次のステップは
- インポート版を作る
- Go 言語で作り直す
かな。これ、いつになったら出来るかな!?