標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

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 言語で作り直す

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