UsedRangeで大雑把なデータの範囲が得られる。
//エクセルファイルを開く
var book = EXCEL.Workbooks.Open("abc.xls");
//最初のシートを選ぶ
var sheet = book.Worksheets(1)
try {
echo(sheet.name);
//使用した行範囲を得る
var rows = sheet.UsedRange.Rows;
echo("rows:"+rows.count);
//使用した最小行を得る
var rowmin = rows(1).row;
echo("rows(min):"+rowmin);
//使用した最大行を得る
var rowmax = rows(rows.count).row;
echo("rows(max):"+rows(rows.count).row);
//使用した列範囲を得る
var cols = sheet.UsedRange.columns;
echo("cols:"+cols.count);
//使用した最小列を得る
var colmin = cols(1).column;
echo("cols(min):"+colmin);
//使用した最大列を得る
var colmax = cols(rows.count).column;
echo("cols(max):"+cols(cols.count).column);
実行してみると、チャンとデータのある範囲を表示する。
rows:7
rows(min):2
rows(max):8
cols:3
cols(min):2
cols(max):4
ではJScriptでEXCELにシートのデータをクリップボードで送らせてみよう。
sheet.Range(sheet.Cells(rowmin,colmin), sheet.Cells(rowmax, colmax)).Copy();
} catch(e){
var i, ary = [];
for (i in e) { ary.push(i + ":" + e[i]); }
echo("例外処理:" + ary.join(", "));
} finally {
if (book != null){
book.Close(false);
}
}
なぜかWindows 8.x 64bit版+MS Office 365 Solo では、クリップボードにコピーしてくれないから・・・
//sheet.Range(sheet.Cells(rowmin,colmin), sheet.Cells(rowmax, colmax)).Copy();
var text="";
for(var row=rowmin; row<=rowmax;row++) {
var colText=[];
for(var col=colmin; col<=colmax;col++) {
colText.push(sheet.Cells(row,col).Text);
}
text += colText.join("\t") + "\r\n";
}
} catch(e){
var i, ary = [];
for (i in e) { ary.push(i + ":" + e[i]); }
echo("例外処理:" + ary.join(", "));
} finally {
if (book != null){
book.Close(false);
}
}
自力でクリップボードもどきのデータを作らないといけないらしい。
ちなみに、例外処理を入れてあるのは、
book.Close(false);
しないとEXCELプロセスが起動する度に残ってしまうから・・・
例外処理が起きた場合は・・・
例外処理:name:TypeError, message:'aaa' は宣言されていません。, number:-2146823279, description:'aaa' は宣言されていません。
の様な感じで出る。
try catch で括ってしまうと、拡張機能のlinenumberが無いから、
文法エラーの場所が判らなくなってしまうので本末転倒な作りになっている。
非常に面倒。
aaa ならまだマシ、
インテリセンスなエディタは 変数Stと変数rtを宣言したソースの Start を ’St’ + space + ‘a’ + space + ‘rt’ に変化(へんげ)させてしまうことがママあるが・・・
そんな時は・・・
‘a’ は宣言されていません。
と表示するハズ。
インテリセンスなエディタの半角スペースは幅が狭く(1ドットぐらい) 目視で見つけることはまず無理。
やはりMSは人の邪魔しかしない。