_2008_09_03_
■[JScript][Excel]VBAをほぼ意識せずに使えるExcelクラスを作る
JScriptでExcelファイルを新しく作ってあれこれするクラス。
Excelがインストールされていることが必要。
JScriptの操作性でExcelにバッチ入力できる。(今はそれだけ)
情報処理(テキスト処理・計算・ループ・条件分岐など)はJScript上でやってしまった上でExcel上に書式付きで出力したい、というのがメインテーマ。
まあ、Perlのインストールが許されてればSpreadSheet::*Excelを使えよという話なんだけど。
目的
Excelでガントチャートを作るのを自動化する、の手始め
code
JScriptでExcelを起動して、新しいブックにいろいろデータ入力するのに使えるスケルトン(クラス)
明にExcel.dispose()しないとプロセスが残るので注意。(特にInvisibleな場合)
jsを実行するとExcelを表示してゆっくり文字を入れて勝手に終了する。
利点
new Excelするだけで雑多な初期設定を全部やってくれる
sampleCode(); //showExcelMethods(); // Excelクラスで外部から使えるメソッドを表示する(wsh) // throw/catch/disposeを使うにはxをグローバルにしないと… /* var x = new Excel(); try { something(2); } catch(e){ WScript.Echo(e.message); x.dispose(); } */ function showExcelMethods(){ var x = new Excel(true, true); // Excelウィンドウは出さない var tmp = ""; for(var i in x){ tmp += i + "\n"; } WScript.Echo(tmp); x.dispose(); } function something(plusDate){ var rowoffset = 3; var o_today = new Date; x.setRefMode('xlR1C1'); x.writeRange("A1", "2008/09/03"); // Error trap! for(var i=0; i<plusDate; i++){ } x.restore(); } function sampleCode(){ var x = new Excel(); // デフォルトはundefになるので結果的に表示される。 WScript.Sleep(1000); x.writeRange("C3", "月次報告書"); x.restore(); WScript.Sleep(1000); x.dispose(); } /* Excel Class本体 */ function Excel(isQuiet, isInvisible) { // コンストラクタ var x = init(); var book = x.Workbooks.Add(); var sheet = book.Worksheets(1); /* const */ var xlR1C1 = -4150; var xlA1 = 1; /* config */ x.ReferenceStyle = xlA1; // Excel起動時の初期化処理 function init(){ var x = new ActiveXObject('excel.application'); if(isInvisible == true){ x.Visible = false; // 処理中にExcelを出すかどうか } else { x.Visible = true; } if(isQuiet == true){ x.ScreenUpdating = false; // 処理中に描画しない } x.DisplayAlerts = false; // 保存時他の警告を表示しない return x; } // 処理結果を画面に反映 this.restore = function(){ x.ScreenUpdating = true; //x.DisplayAlerts = true; } // 後片付け 実行しないとExcelのプロセスが残る // デストラクタでなんとかできない? this.dispose = function(){ book.Close(); x.Quit(); } /* セル操作メソッド */ // A1形式のみ使用可能…に制限してある // 制限を有効にするにはtryでErrorをキャッチして…。 // (実はR1C1式に設定してあってもなぜかA1方式で書き込めてしまう) this.writeRange = function(rangeStr, value){ if(this.RefMode() == xlA1){ sheet.Range(rangeStr).Value = value; } else { throw(new Error("methodError\nwriteRange: A1形式でなければなりません")); this.dispose(); } } /* A1/R1C1参照形式を切り替えるメソッド */ this.setRefMode = function(typeStr){ /* buggy */ // Const xlR1C1 = -4150 // Const xlA1 = 1 if(typeStr == 'xlR1C1'){ return x.ReferenceStyle = xlR1C1; } else if(typeStr == 'xlA1'){ return x.ReferenceStyle = xlA1; } else { return false; } } this.RefMode = function(){ return x.ReferenceStyle; } } //----------------------------------------
トラックバック - http://d.hatena.ne.jp/clock9/20080903/1220433850



