見出し画像

Excel VBAしか知らない私が、Excel Scriptを独学(4)

Microsoftには VBScriptと言うスクリプト言語がありますが、 Officeスクリプトが採用したのは JavaScriptベースの言語でした。
主流のブラウザが VBScriptをサポートしていないため仕方がないのかも知れませんが、Visual Basic をベースにした VBScriptが採用されていたら、私のようなOfficeユーザーは、もっと覚えやすかっただろうと思う今日この頃なのです。

入力数値から、該当の単語を表示

準備したサンプルは、A列に入力した数値1~4に対応し、配列に設定した単語("Excel","Word","Powerpoint","Outlook")をB列に表示すると言うものです。

画像1

1次配列(let 配列 = [引数0,引数1...])

//配列の設定
let word = ["","Excel","Word","Powerpoint","Outlook"];

配列 wordに "","Excel","Word","Powerpoint","Outlook" を設定します。
この場合、word[0]が空、word[1]はExcel、word[2]はWord、word[3]はPowerpoint、word[4]にはOutlookが設定されます。

VBAのように Array の記述はなく、[ ]で囲うだけで良いみたいです。

Math.abs(セル.getValue() as  number) 

//配列の設定
let word = ["","Excel","Word","Powerpoint","Outlook"];

let WS = workbook.getActiveWorksheet();
let i = 4;

//セルA4の値を取得
let buf = Math.abs(WS.getCell(i-1, 0).getValue() as number);

//セルB4に配列の値をセット
WS.getCell(i-1, 1).setValue(word[buf]);

セルA4の値を整数絶対値で取得し変数bufに代入します。この変数bufをword[buf]と配列の引数に入れて配列の値を取得し、セルB4に入れます。
※ セルの行数をi - 1としているのは、4行目のRow値が3になるためです。

let word = ["", "Excel", "Word", "Powerpoint", "Outlook"];
let WS = workbook.getActiveWorksheet();

for (let i=4;i<=8;i++){
    //セルA4の値を取得
    let buf = Math.abs(WS.getCell(i-1, 0).getValue() as number);

    //セルB4に配列の値をセット
    WS.getCell(i-1, 1).setValue(word[buf]);
}

for で8行目まで繰り返せば、セルB4~B8まで処理完了です。

最終行の取得

let WS = workbook.getActiveWorksheet();
let rows = WS.getRange("A:A").getUsedRange().getRowCount();

getRange("A:A")「A列」の getUsedRange「使用範囲」の getRowCount「行数」を返します。例えばセルA1とA8に値が入っている場合は 8 、セルA2とA8に値が入っている場合は 7 が帰り値となりますので、工夫次第で最終行を取得できます。

VBAの=Cells(Rows.Count,1).End(xlUp).Row のような考え方は難しそうです。

また、今回の例文でbufが0~4以外の場合、word[buf]は空の値を返します。
空値ではなく、処理を行わないようにしたい場合は、次のコードのように if で条件分岐させる必要があります。

function main(workbook: ExcelScript.Workbook) {
   let WS = workbook.getActiveWorksheet();
   let word = ["","Excel","Word","Powerpoint","Outlook"];

   //A列の使用範囲の行数をカウント
   let rows = WS.getRange("A:A").getUsedRange().getRowCount();

   for (let i=1;i<rows;i++){
       let buf = Math.abs(WS.getCell(i, 0).getValue() as number);
       if (buf < word.length){
           WS.getCell(i, 1).setValue(word[buf]);
       }
   }

}

あとがき

今回スクリプト、処理が止まることはないのですがログには次のような問題が表示されていました。

問題点

ワークシート上で繰り返し処理を行うとパフォーマンスが低下すると言うものです。スクリプト内で全ての処理が終わってからワークシートに出力するものと思っていたのですがVBAと同じなんだね。

この記事が気に入ったらサポートをしてみませんか?