Office Scriptsで学ぶ数式入力と再計算の基本!Excelセル操作を自動化しよう
生徒
「Excelで計算式を入れたり、合計を出したりする作業を自動でできるって聞いたんですが、本当ですか?」
先生
「できますよ。Office Scriptsを使うと、Excelのセルに数式を入力したり、計算結果を自動で更新したりできます。」
生徒
「計算って、SUMとかAVERAGEみたいな関数のことですか?」
先生
「その通りです。しかも、人がボタンを押さなくても、スクリプトが自動で再計算までやってくれます。」
生徒
「パソコンが苦手でも理解できますか?」
先生
「大丈夫です。Excelを操作する感覚で、一つずつ確認しながら説明します。」
1. Office Scriptsとは?
Office Scripts(オフィススクリプト)は、Excel Onlineやデスクトップ版Excelで利用できる最新の自動化ツールです。これまでExcelの自動化といえば「VBA(マクロ)」が主流でしたが、Office ScriptsはWeb環境との相性が良く、Microsoft 365(マイクロソフト365)の環境で非常に強力な力を発揮します。
最大の特徴は、TypeScript(タイプスクリプト)というプログラミング言語を採用している点です。TypeScriptは、世界中で広く使われているJavaScript(ジャバスクリプト)をベースに、よりエラーが起きにくく、書きやすく改良された言語です。プログラミングが初めてという方でも、Excelの「セルに値をいれる」「数式を書く」といった身近な動作から始めることで、無理なくスキルを身につけることができます。
2. セルへのアクセスと数式の入力方法
Excelでの作業の基本は「セル」に値を入力することですよね。Office Scriptsでは、まず「どのシートのどのセルを操作するか」をプログラムに教えてあげる必要があります。これを「セルの取得」と呼びます。セルを取得した後は、setFormula(セット・フォーミュラ)という命令を使って、四則演算(足し算や引き算)やExcel関数を入力していきます。
たとえば、A1セルとB1セルの合計をC1セルに出したい場合、手動では「=A1+B1」と打ち込みますが、これをコードで書くと次のようになります。プログラミングでは、文字や数式を扱うときに「"(ダブルクォーテーション)」で囲むのがルールです。この「"」は、パソコンに「ここは計算じゃなくて、そのままの文字だよ」と伝えるための印だと覚えておきましょう。
function main(workbook: ExcelScript.Workbook) {
// 今開いているシートを取得します
const sheet = workbook.getActiveWorksheet();
// A1セルに100、B1セルに200を入力します
sheet.getRange("A1").setValue(100);
sheet.getRange("B1").setValue(200);
// C1セルに足し算の数式を入力します
sheet.getRange("C1").setFormula("=A1+B1");
}
実行結果は以下の通りです。C1セルには「=A1+B1」という式が入り、Excelの機能によって自動的に「300」と表示されます。
A1セル: 100
B1セル: 200
C1セル: 300(数式:=A1+B1)
3. 変数を使ったデータの取得と計算
次に、セルにある値を「読み取って」から計算する方法を解説します。先ほどはセルに直接数式を書き込みましたが、プログラムの中で計算を行って、その結果だけをセルに書き込むことも可能です。ここで重要になるのが「変数(へんすう)」という考え方です。
変数とは、データを入れておくための「名前付きの箱」のようなものです。例えば、A1セルの値を「箱A」に入れ、B1セルの値を「箱B」に入れ、その二つを足した結果を「箱C」に入れる…といったイメージです。コードの中では const(コンスト)という言葉を使って変数を宣言(作成)します。
セルの値を取得するときは getValue(ゲット・バリュー)を使います。これを使うと、セルに書かれている数字を数値として取り出すことができ、プログラム内で自由に計算できるようになります。
function main(workbook: ExcelScript.Workbook) {
const sheet = workbook.getActiveWorksheet();
// セルの値を取得して変数(箱)に入れます
const price = sheet.getRange("A1").getValue() as number;
const count = sheet.getRange("B1").getValue() as number;
// 変数を使って掛け算(単価 × 個数)を行います
// プログラミングでは掛け算に「*」を使います
const total = price * count;
// 計算結果をC1セルに書き込みます
sheet.getRange("C1").setValue(total);
}
もしA1に「500」、B1に「3」が入っていたら、実行結果はこうなります。
A1セル: 500
B1セル: 3
C1セル: 1500(計算結果の数値のみ)
4. 再計算処理の制御(自動と手動の切り替え)
Excelには、セルの値が変わるたびにすべての数式を計算し直す「自動再計算」という機能があります。普段はとても便利な機能ですが、何千行、何万行という大量のデータをOffice Scriptsで一度に書き換えるときは、一回書き換えるごとに再計算が走ってしまうため、動作が非常に重くなってしまいます。パソコンが一生懸命計算しすぎて、フリーズしたような状態になるのを防ぐために、「再計算の制御」が必要です。
料理に例えると、具材を一つ切るたびにコンロの火をつけて鍋を温め直すのではなく、すべての具材を切り終えてから最後に一気に火を通す方が効率的ですよね。Office Scriptsでは、getApplication().setCalculationMode(セット・キャルキュレーション・モード)という命令で、計算のタイミングをコントロールできます。
設定できるモードは主に2つあります。
- Automatic(オートマチック):自動計算モード(標準)。値が変わると即座に再計算します。
- Manual(マニュアル):手動計算モード。命令するまで再計算しません。
function main(workbook: ExcelScript.Workbook) {
const app = workbook.getApplication();
// 1. まず、再計算を「手動」に設定して一時停止させます
app.setCalculationMode(ExcelScript.CalculationMode.manual);
const sheet = workbook.getActiveWorksheet();
// ここで大量のデータ処理や数式入力を一気に行います
for (let i = 1; i <= 100; i++) {
sheet.getRange(`A${i}`).setValue(i);
sheet.getRange(`B${i}`).setFormula(`=A${i} * 2`);
}
// 2. すべての処理が終わったら、再計算を「自動」に戻します
// この瞬間に一気に計算が実行されます
app.setCalculationMode(ExcelScript.CalculationMode.automatic);
}
5. 範囲(レンジ)を使った一括書き込み
一つ一つのセルに対して setValue を繰り返すと、プログラムの実行時間が長くなってしまいます。効率よくExcelを自動化するためには、複数のセルをひとかたまりの「範囲(レンジ)」として捉え、一気にデータを流し込むのがコツです。これを「配列(はいれつ)」を使った操作と呼びます。
配列とは、複数のデータを一列に並べたリストのようなものです。Office Scriptsでは、縦と横の広がりを持つ「二次元配列」を使って、Excelの表(テーブル)のような形式でデータを準備し、setValues(セット・バリュース:最後にsがつく!)を使って一気に書き込みます。これにより、通信の回数を減らし、爆速で処理を終わらせることができます。
function main(workbook: ExcelScript.Workbook) {
const sheet = workbook.getActiveWorksheet();
// 書き込みたいデータ(二次元配列)を準備します
// [ [1行目のA列, 1行目のB列], [2行目のA列, 2行目のB列] ] という構造です
const data = [
["商品名", "価格"],
["リンゴ", 150],
["バナナ", 100],
["メロン", 2000]
];
// A1からB4までの範囲を一括で取得し、データを書き込みます
// data.lengthは行数、data[0].lengthは列数を表します
const targetRange = sheet.getRangeByIndexes(0, 0, data.length, data[0].length);
targetRange.setValues(data);
}
実行結果は、一瞬で4行2列の綺麗な表が作成されます。一つずつ入力するよりもはるかに効率的です。
(出力結果)
A列 B列
商品名 価格
リンゴ 150
バナナ 100
メロン 2000
6. オブジェクトとメソッドを理解しよう
ここまで「sheet」や「range」といった言葉を使ってきましたが、これらはプログラミングの世界で「オブジェクト」と呼ばれます。オブジェクトとは、現実世界でいうところの「モノ」です。Excelという大きな建物(Workbookオブジェクト)の中に、部屋(Worksheetオブジェクト)があり、その中に机(Rangeオブジェクト)があるという構造になっています。
そして、そのオブジェクトに対して「値を入れろ!」「数式を書け!」と命じる動作を「メソッド」と呼びます。setValue() や getRange() がこれにあたります。オブジェクト名の後に「.(ドット)」を打つことで、そのオブジェクトが持っている機能(メソッド)を呼び出すことができます。これは、スマートフォンの設定画面を開いて「明るさを変える」ボタンを押すような操作に似ています。この「ドット」でつなげていく書き方をマスターすれば、Office Scriptsの習得はすぐそこです。
7. エラーを防ぐためのコツとデバッグ
プログラミングをしていると、必ずと言っていいほど「エラー」に遭遇します。エラーが出ると「自分には才能がないのかな」と落ち込んでしまうかもしれませんが、安心してください。プロのエンジニアも毎日エラーと戦っています。大切なのは、エラーが出たときにどう対処するか、つまり「デバッグ」の方法を知ることです。
Office Scriptsのエディタには、コードの横に赤い波線が出たり、実行後にエラーメッセージが表示されたりします。また、console.log() という命令を使うと、プログラムの途中で「今、変数の値はどうなっているかな?」という中身をログ(記録)として表示させることができます。これにより、どこで計算が狂ったのかを特定しやすくなります。
また、セルの指定ミスもよくあるエラーの原因です。「A1」と書くべきところを「A 1」とスペースを入れてしまったり、全角で入力してしまったりすると、プログラムは正しく動きません。半角英数字を正しく使うこと、そしてエラーメッセージをよく読むことが、自動化マスターへの第一歩です。
8. 実践的な応用:条件に応じた計算
最後に、少しだけ高度な「条件分岐(じょうけんぶんき)」を組み合わせた計算を紹介します。「もし~なら、こうする」という処理です。これを使えば、「在庫が10個以下なら『発注』と表示し、それ以外なら『OK』と表示する」といった、人間が判断していた作業を自動化できます。これには if(イフ)という構文を使います。
function main(workbook: ExcelScript.Workbook) {
const sheet = workbook.getActiveWorksheet();
// A1セルの在庫数を取得
const stock = sheet.getRange("A1").getValue() as number;
// 条件分岐(もし在庫が10未満だったら)
if (stock < 10) {
sheet.getRange("B1").setValue("要在庫確認!");
sheet.getRange("B1").getFormat().getFill().setColor("red"); // セルを赤く塗る
} else {
sheet.getRange("B1").setValue("在庫あり");
sheet.getRange("B1").getFormat().getFill().setColor("white");
}
}
このように、単なる計算だけでなく「書式(色や太字)」の変更も自動化に組み込むことができます。Office Scriptsを使いこなすことで、Excel作業の精度とスピードを劇的に向上させることが可能になります。まずは小さなコードから書き始めて、少しずつ複雑な処理に挑戦していきましょう!