ExcelVBA のソースを .xls ファイルから抽出する JScript を書いた

Excel VBA の保守をしなければいけないんだけども…

  • そのアプリは 開いただけで自動的に 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 言語で作り直す

かな。これ、いつになったら出来るかな!?