うま味Synth このページをアンテナに追加 RSSフィード

_2008_09_03_

[][]VBAをほぼ意識せずに使えるExcelクラスを作る

JScriptでExcelファイルを新しく作ってあれこれするクラス。

Excelがインストールされていることが必要。

JScriptの操作性でExcelにバッチ入力できる。(今はそれだけ)

情報処理(テキスト処理・計算・ループ・条件分岐など)はJScript上でやってしまった上でExcel上に書式付きで出力したい、というのがメインテーマ。

まあ、Perlのインストールが許されてればSpreadSheet::*Excelを使えよという話なんだけど。

ExcelとWSH以外にランタイムが必要ないのがポイント。

目的

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
Twitter ブログパーツ
この日記のはてなブックマーク数