「Officeスクリプトで繰り返し処理はどうやってしたらいいの??」
このような悩みを持ったことはありませんか?
・繰り返し処理をしてみたいけど、どのようにしたらいいの?
・大量のデータに対して同じ操作を効率的に適用したい!
その場合は、Officeスクリプトの「for文」を
使用すると解決します!
この記事では、Officeスクリプトの「for文」を使用した繰り返し処理の方法について解説します。
Excelで大量のデータや複数のセルに対して同じ操作を繰り返し行いたい場合、繰り返し処理(ループ処理)を使うと非常に便利です。
Officeスクリプトの「for文」を使用することで、指定した範囲内のセルに対して繰り返し処理を適用できます。
サンプルコードを交えて、実際にどのように利用するかを具体的に学んでいきましょう。
【 この記事の概要 】
よく使う度 | |
難しさ | |
覚えておくと安心度 |
この記事を読むと「できるようになる」こと
この記事を読むことで、次のことができるようになります。
- Officeスクリプトのfor文の基礎を習得する
- for文のインクリメントやデクリメントについて学習する
- for文と合わせて使用される機能「break」「continue」「最終行」を学習する
- for文の注意ポイントを確認し実践で使用できるようになる
- for文の実際の使用例を習得する
Officeスクリプト for文でできる処理例|繰り返し処理の活用法
Officeスクリプトのfor文を活用することで、「Excel上の大量のデータ」や「複数のセルに対する処理」を効率的に自動化できます。
for文を使うことで、次のようなさまざまな処理が実現できます。
以下に、for文で行える代表的な処理内容を紹介します。
繰り返し処理で出来ること
- 同じ操作を複数のセルに繰り返し適用する
- for文を使うと、Excelシートの範囲内で同じ操作を複数のセルに適用できます。
例えば、「A列の全セルに一括で数値を入力する」や、「B列のデータに同じ数を足す」といった処理が簡単に行えます。
- for文を使うと、Excelシートの範囲内で同じ操作を複数のセルに適用できます。
- 特定の条件に応じて処理を繰り返し実行する
- for文を活用すれば、条件付きでデータを処理することも可能です。
たとえば、特定の数値が含まれているセルのみをカウントしたり、指定した範囲内のセルの合計を求めたりすることができます。
- for文を活用すれば、条件付きでデータを処理することも可能です。
- 複数のセルや行にわたるデータの集計処理
- for文は、複数の行や列にまたがるデータの集計や条件別の処理にも役立ちます。
大量のデータを扱う場面でfor文を使うことで、特定条件に基づいた合計値の取得や平均値の計算を簡単に自動化できます。
- for文は、複数の行や列にまたがるデータの集計や条件別の処理にも役立ちます。
for文を使うと、このようなExcel上での繰り返し処理が手軽にできるようになり、特定の範囲や条件に応じた自動化が実現します。
Officeスクリプトの繰り返し処理の種類をご紹介
Officeスクリプトでは、繰り返し処理を行うためのさまざまな方法が用意されています。
その中でも「for文」は、決められた回数だけ処理を繰り返す際にとても便利です。
for文を理解しておくことで、Excel上で大量のデータを簡単に操作できるようになります。
以下に、Officeスクリプトで使える繰り返し処理の種類と、その特徴をまとめました。
それぞれのループの特徴を知っておくと、シーンに合わせて最適なループを選べるようになります。
Officeスクリプトの繰り返し処理の種類
繰り返し処理 の種類 | 特徴と使い方 | 主な用途 |
---|---|---|
for文 | 事前に決めた回数だけ処理を繰り返す | 固定回数の繰り返しが必要な時 |
forEach文 | 配列やリスト内の各要素に順番に処理を行う | 配列やリスト全体に操作をしたい時 |
map | 配列の各要素を変換し、新しい配列を作成 | 配列内のデータを変換したい時 |
filter | 条件に合った配列の要素を抽出し、新しい配列を作成 | 条件に合う要素だけを抽出したい時 |
while文 | 特定の条件がtrueである間、処理を繰り返す | 条件に基づく動的な繰り返しが必要な時 |
do…while文 | 少なくとも1回は処理を行い、条件に基づき繰り返す | 条件次第で複数回処理する時 |
Officeスクリプトのfor文の基本構文と流れ
for文の構成と設定方法
- let i = 0 ; (必須)
- ループのカウンターの初期値を設定します。
事前に変数「i」を宣言しなくても、for分の中で宣言することができます。
- ループのカウンターの初期値を設定します。
- i < 条件 ; (必須)
- ループを継続する条件を設定します。
条件が満たされている間、ループが実行されます。
- ループを継続する条件を設定します。
- i++ ; (必須)
- ループのカウンターを、どのように増加させるか?を設定します。
ここでは「1」ずつ増加するよう設定しています。
例えば「i += 2」とすれば「2」ずつ増やすことも可能です。
- ループのカウンターを、どのように増加させるか?を設定します。
for文の簡単な宣言例
以下は、基本のfor文を使った繰り返し処理の簡単な例です。
// A1からA10に1~10の数値を入力するfor文
function main(workbook: ExcelScript.Workbook) {
// アクティブなシートを取得
let sheet: ExcelScript.Worksheet = workbook.getActiveWorksheet();
// 0から9までのカウンター変数iを使ってループを実行
for (let i: number = 0; i < 10; i++) {
sheet.getRange(`A${i + 1}`).setValue(i + 1); // A1からA10に1, 2, 3...の数値を入力
}
}
この構文を使えば、Excelシート上で簡単に繰り返し処理が実行できるようになります。
Officeスクリプトのfor文|インクリメント・デクリメント演算子の使い方
for文では、カウンターの数値を「1」ずつ増減させるために「インクリメント演算子」(i++
)や「デクリメント演算子」(i--
)を使用します。
この演算子を使うことで、カウンターを効率的に操作でき、繰り返し処理を簡単に行うことができます。
インクリメント演算子 (i++)|1ずつ増加する方法
「i++
」は「インクリメント演算子」と呼ばれ、変数「i」の値を「1」ずつ増やします。
これは「i = i + 1
」と同じ意味を持ち、ループ処理で頻繁に使用される便利な書き方です。
コード例
次のfor文は、カウンター「i」の値を1ずつ増加させながら、「A1」から「A10」までのセルに数値を入力します。
function main(workbook: ExcelScript.Workbook) {
// アクティブなシートを取得
let sheet: ExcelScript.Worksheet = workbook.getActiveWorksheet();
// 0から9までのカウンター変数iを使ってループを実行
for (let i: number = 0; i < 10; i++) {
sheet.getRange(`A${i + 1}`).setValue(i + 1); // A1からA10に1, 2, 3...と順番に入力
}
}
デクリメント演算子 (i–)|1ずつ減少する方法
逆に、「i--
」はデクリメント演算子と呼ばれ、変数「i」の値を「1」ずつ減少させます。
この演算子は、ループの逆方向(上から下へ、または右から左へ)に進む場合に役立ちます。
コード例
次のfor文は、デクリメント演算子を使って、「A10」から「A1」までのセルに10から1までの数値を入力するコードです。
function main(workbook: ExcelScript.Workbook) {
// アクティブなシートを取得
let sheet: ExcelScript.Worksheet = workbook.getActiveWorksheet();
// カウンター変数iを使って逆方向にループを実行
for (let i: number = 9; i >= 0; i--) {
sheet.getRange(`A${i + 1}`).setValue(i + 1); // A10からA1に10, 9, 8...と順番に入力
}
}
2ずつ増加させる場合の設定方法
カウンターを「1ずつ」ではなく、「2ずつ」増やしたい場合は、増加部分を「i += 2
」にするだけで実現できます。
これは、インクリメント演算子(i++)と同じようにループ内で頻繁に使われる設定です。
コード例
「A1」から「A10」までのセルに「2ずつ」増加した数値(2, 4, 6…)を入力する「for文」の例です。
function main(workbook: ExcelScript.Workbook) {
// アクティブなシートを取得
let sheet: ExcelScript.Worksheet = workbook.getActiveWorksheet();
// カウンター変数iを使って2ずつ増加させながらループを実行
for (let i: number = 0; i < 10; i += 2) {
sheet.getRange(`A${i / 2 + 1}`).setValue(i + 2); // A1に2, A2に4...と2ずつ増加
}
}
このコードでは、「i += 2
」を使ってカウンターが「2ずつ」増加し、セル「A1」には2、「A2」には「4」といった具合に値が入力されます。
また、他にも「i += 3
」や「i += 5
」など、for文の最後の増加部分は自由に設定可能です。
Officeスクリプト for文を合わせて使用したい|break・continue・最終行までの使い方
Officeスクリプトのfor文には、ループを中断するbreak
や、特定の条件で処理をスキップするcontinue
といった便利な機能があり、効率的な繰り返し処理が実現できます。
また、Excelシートの「最終行」までfor文を繰り返す方法もよく使われます。
ここでは、それぞれの使い方について解説します。
breakでループを途中で終了する方法|Officeスクリプト for文での中断処理
break
は、for文内で特定の条件が満たされたときにループを強制的に終了させる処理です。
例えば、ある条件が成立したらそれ以降の処理を行わずにループを抜けたい場合に便利です。
コード例:特定の条件でループを終了する
function main(workbook: ExcelScript.Workbook) {
// アクティブなシートを取得
let sheet: ExcelScript.Worksheet = workbook.getActiveWorksheet();
// 1から10までループし、条件に応じてセルに値を入力
for (let i: number = 1; i <= 10; i++) {
if (i === 5) break; // iが5のときにループを終了
sheet.getRange(`A${i}`).setValue(i); // A1からA4に1, 2, 3, 4が入力されます
}
}
このコードでは、変数i
が「5」になった時点でループが終了し、セル「A1」から「A4」までに数値が入力されます。
continueで特定の処理をスキップする方法|Officeスクリプト for文のスキップ処理
continue
は、for文内で特定の条件を満たした際に、そのループの処理をスキップし、次の繰り返しに進むための命令です。
指定した条件を除外したい場合に役立ちます。
コード例:特定の条件で処理をスキップ
function main(workbook: ExcelScript.Workbook) {
// アクティブなシートを取得
let sheet: ExcelScript.Worksheet = workbook.getActiveWorksheet();
// 1から10までのループで、奇数の値をセルに入力
for (let i: number = 1; i <= 10; i++) {
if (i % 2 === 0) continue; // 偶数の場合はスキップ
sheet.getRange(`A${i}`).setValue(i); // A1, A3, A5...に奇数が入力されます
}
}
この例では、i
が偶数のときにcontinue
で処理をスキップし、奇数のみがセルに入力されます。
たとえば、セル「A1」に1、「A3」に3、「A5」に5が入力されるようになります。
最終行までfor文を実行する方法|Officeスクリプト for文での範囲指定
Excelシートの「最終行」まで繰り返し処理を行いたい場合、for文にセル範囲の最終行を指定することで、シートの内容が変わっても動的に最終行まで処理を実行できます。
特に、データの位置が変更されるシートにおいては、この方法が便利です。
コード例:最終行までfor文を繰り返す
function main(workbook: ExcelScript.Workbook) {
// アクティブなシートを取得
let sheet: ExcelScript.Worksheet = workbook.getActiveWorksheet();
// 最終行の取得
let lastRow: number = sheet.getUsedRange().getRowCount();
// 最終行までループし、A列に数値を入力
for (let i: number = 1; i <= lastRow; i++) {
sheet.getRange(`A${i}`).setValue(i); // A列に1から最終行まで順番に数値を入力
}
}
このコードでは、lastRow
で最終行を取得し、その行までfor文で処理が繰り返されます。
これにより、Excelシートのデータ量に応じて柔軟に範囲指定が可能になります。
getUsedRange() メソッドの注意ポイント
しかし、getUsedRange()
メソッドは「書式設定されたセル」や「空白スペースの入力されたセル」も「使用されているセル」として認識して最終行を取得します。
データが入力されている実際のセル範囲のみ処理したい場合は、次のカスタム関数を使用しましょう。
コード例:カスタム関数getLastDataRow
を使って最終行を取得する
このgetLastDataRow
関数を呼び出すことで、「書式設定されたセル」や「空白スペース」を除く、シートの最終行を取得し、for文のループ条件に組み込んで繰り返し処理を行うことができます。
function main(workbook: ExcelScript.Workbook) {
// アクティブなシートを取得
let sheet: ExcelScript.Worksheet = workbook.getActiveWorksheet();
// 最終行を取得する
let lastRow: number = getLastDataRow(sheet);
// 最終行までループし、A列に数値を入力
for (let i: number = 1; i <= lastRow; i++) {
sheet.getRange(`A${i}`).setValue(i); // A列に1から最終行まで順番に数値を入力
}
}
// ↓ 空白スペースと書式を無視して正確に最終行を求める関数
function getLastDataRow(sheet: ExcelScript.Worksheet): number {
let usedRange: ExcelScript.Range = sheet.getUsedRange();
if (!usedRange) return 0;
let startRow: number = usedRange.getRowIndex();
let rowCount: number = usedRange.getRowCount();
let columnCount: number = usedRange.getColumnCount();
for (let i: number = rowCount - 1; i >= 0; i--) {
let rowIndex: number = startRow + i;
let range: ExcelScript.Range = sheet.getRangeByIndexes(rowIndex, 0, 1, columnCount);
let values = range.getValues()[0];
// 行内の各セルをチェック
if (values.some(cell => {
if (cell === null || cell === undefined) {
return 0;
}
if (typeof cell === 'string') {
return cell.trim() !== "";
}
return true; // 数値やブール値など、非文字列型はデータありと判断
})) {
return rowIndex + 1;
}
}
return 0;
}
この最終行・最終列の取得方法について、別記事で解説を行っていますので、興味のある方はぜひご覧ください。
Officeスクリプトのfor文で注意すべきポイント
for文を使用する際に留意すべき点をいくつか紹介します。
カウンターの範囲設定に注意|無限ループ防止の対策
for文では、「開始値」と「終了条件」を正しく設定することが重要です。
たとえば、終了条件が満たされない場合、ループが止まらず無限ループが発生する可能性があります。
無限ループはExcelやブラウザの動作に影響を与えるため、必ずカウンターの範囲を確認しましょう。
無限ループのコード例
for (let i: number = 0; i >= 0; i++) {
// この条件では「i」が常に「0以上」であるため無限ループになります。
}
無限ループ防止の対策コード
// カウンターが10で終了する設定を追加
for (let i: number = 0; i < 10; i++) {
if (i === 5) break; // 必要に応じて break でループを抜ける
console.log(i); // 0から4まで出力
}
break
を使うと、特定の条件でループを強制的に終了でき、無限ループを防止することができます。
無限ループが発生した場合の強制停止方法
もしfor文の設定ミスなどで無限ループが発生してしまった場合、Officeスクリプトの処理を強制的に停止する方法を覚えておきましょう。
Officeスクリプトを実行中にブラウザやExcelが反応しなくなった場合でも、次の方法で強制停止が可能です。
- Excel OnlineやWebブラウザの場合
- ブラウザのタブを閉じるか、
F5
キーでページをリロードすることでスクリプトが停止します。
- ブラウザのタブを閉じるか、
- Excelデスクトップ版を使用している場合
Ctrl
+Alt
+Delete
キーを押してタスクマネージャーを開き、Excelを選択して「タスクの終了」を選びます。
これによりExcelのすべての動作が停止するため、保存されていないデータが失われる可能性がある点には注意してください。
配列やセル範囲のインデックス範囲に注意|範囲外アクセスの防止対策
配列やセル範囲を扱う際には、インデックスが範囲外にならないようにすることが重要です。
存在しないセルや配列要素にアクセスしようとするとエラーが発生します。
たとえば、存在しないセルや配列の要素にアクセスするとエラーが発生します。
配列やセルの長さを確認し、範囲外のアクセスがないようにしましょう。
範囲外アクセスのコード例
let array: number[] = [1, 2, 3]; // 配列の型をnumber[]と指定
for (let i: number = 0; i <= array.length; i++) { // 変数iにnumber型を指定
console.log(array[i]); // 最後のループで範囲外のアクセスをし、エラーが発生します。
}
範囲外アクセス防止の対策コード
i < array.length
として配列の範囲内のみにアクセス
let array = [1, 2, 3];
for (let i = 0; i < array.length; i++) { // i < array.length として範囲内のみにアクセス
console.log(array[i]); // 各要素を順番に出力
}
また、特定の条件でスキップしたい場合はcontinue
を使用し、無駄なアクセスを避けることができます。
continue
を使用して無駄なアクセスを避ける
let array: number[] = [1, 2, 3]; // 配列にnumber[]型を指定
for (let i: number = 0; i < array.length; i++) { // 変数iにnumber型を指定
if (array[i] < 2) continue; // 値が2未満の要素はスキップ
console.log(array[i]); // 2以上の要素のみ出力
}
Officeスクリプトのfor文の使用例をご紹介
それでは、OfficeスクリプトのFor分を使用した使用例を紹介します。
以下に紹介する使用例は、すべてコピペしてすぐに実行できるコードです。
気になる例は、ぜひご覧いただき、実際に実行してみてください。
Officeスクリプトの基礎から応用までを効率よくしっかり学習したい方には、UdemyのOfficeスクリプト講座もおすすめです。
特に自己学習で進める場合、ビデオや実践例があると理解が進みやすくなります。
使用例1: 順方向にループを行う
この例では、Officeスクリプトのfor文を使って、Excelシート上でセル範囲「A1」から「A10」までに数値を順番に入力する方法を紹介します。
for文を利用することで、範囲内の各セルに1から10までの値を効率よく設定できます。
コード例 | for文による順方向ループ
function main(workbook: ExcelScript.Workbook) {
// アクティブなシートを取得
let sheet: ExcelScript.Worksheet = workbook.getActiveWorksheet();
// セル範囲「A1:A10」を取得
let range: ExcelScript.Range = sheet.getRange("A1:A10");
// ループを使用して各セルに1から10までの値を入力
for (let i: number = 0; i < 10; i++) {
range.getCell(i, 0).setValue(i + 1);
}
}
処理結果
コードの動作概要
workbook.getActiveWorksheet()
メソッドを使用して、現在アクティブなシートを取得します。
このシートはsheet
という変数に格納され、ExcelScript.Worksheet
型で定義されています。
この変数で指定したシート範囲にアクセスする準備が整います。
sheet.getRange("A1:A10")
メソッドで、セル範囲「A1」から「A10」を取得します。
この範囲はrange
という変数に格納され、ExcelScript.Range
型で定義されています。
これにより、次のステップでfor文を用いて範囲内の各セルに順次アクセスできるようになります。
for (let i: number = 0; i < 10; i++)
で、10回繰り返しのループを設定します。
ここでカウンターi
はnumber
型で定義され、「0」から「9」までの間、1ずつ増加しながらループが実行されます。
このカウンターにより、範囲「A1」の各セルが順に処理されます。
range.getCell(i, 0).setValue(i + 1)
で範囲内の各セルを順に取得し、i + 1
の値を設定します。
たとえば、最初のループでは「A1」に1が設定され、2回目のループで「A2」に2が入力されるという形で進みます。
最終的に、セル「A1」から「A10」にかけて1から10までの値が順に入力されます。
このコードで使用している機能
- let (変数)
let
は変数を宣言するためのキーワードです。
- getActiveWorksheet() (アクティブなシートの取得)
workbook.getActiveWorksheet()
メソッドは、Excelで現在アクティブなシートを取得します。
- getCell(行, 列) (セルの取得)
range.getCell(i, 0)
は、指定した範囲range
の中で、i
行目、0列目(A列)のセルを取得するメソッドです。
- setValue() (セルへの値の設定)
- 取得したセルに数値を入力するためのメソッドです。
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- function main(workbook: ExcelScript.Workbook)
- Officeスクリプトのメイン関数「main」を定義しています。
workbookパラメータが渡され、Excelのワークブック全体を操作できるようになります。
このパラメータは「ExcelScript.Workbook型」で定義されており、これにより関数内でワークブック操作が可能です。
- Officeスクリプトのメイン関数「main」を定義しています。
- let sheet: ExcelScript.Worksheet = workbook.getActiveWorksheet();
- この行では、現在アクティブなシートを取得しています。
「ExcelScript.Worksheet型」で宣言された「sheet」変数に格納することで、以降のコードでこのシートを対象とした操作を行います。
- この行では、現在アクティブなシートを取得しています。
- let range: ExcelScript.Range = sheet.getRange(“A1:A10”);
- getRange(“A1:A10”)メソッドを使用して、セル範囲「A1」から「A10」までの範囲を取得し、この範囲を「ExcelScript.Range型」の変数「range」に格納します。
これにより、指定した範囲内でのセル操作が可能になります。
- getRange(“A1:A10”)メソッドを使用して、セル範囲「A1」から「A10」までの範囲を取得し、この範囲を「ExcelScript.Range型」の変数「range」に格納します。
- for (let i: number = 0; i < 10; i++)
- 「i」というカウンター変数を「number型」で定義し、「0」から始まる「10回」の繰り返し処理を設定します。
このループが実行されるたびに「i」の値が「1」ずつ増加し、各セルに対して順次処理が適用されます。
- 「i」というカウンター変数を「number型」で定義し、「0」から始まる「10回」の繰り返し処理を設定します。
- range.getCell(i, 0).setValue(i + 1);
- 「range.getCell(i, 0)」で範囲「A1」の各セルを「1行ずつ」取得し、「setValue(i + 1)」でそのセルに「i + 1」の値を設定します。
たとえば、1回目のループで「A1」に「1」が設定され、2回目のループで「A2」に「2」が設定されるように処理が進みます。
- 「range.getCell(i, 0)」で範囲「A1」の各セルを「1行ずつ」取得し、「setValue(i + 1)」でそのセルに「i + 1」の値を設定します。
- }
- 関数「main」の終了を示しています。
このコードによって、セル「A1」から「A10」までに1から10の連続した数値が入力され、for文が終了します。
- 関数「main」の終了を示しています。
総括・ポイント
このコード例では、for文を使ってExcelシート上の範囲内に繰り返し処理を行い、各セルに順番に数値を入力する手順が示されています。
for文によるループ処理を活用すると、大量のデータ操作や規則的な処理を効率的に行うことができ、Officeスクリプトの自動化がより効果的に行えるようになります。
使用例2: 逆方向にループを行う
この例では、for文を使用してセル「A10」から「A1」までのセルに数値を逆順に入力する方法を紹介します。
デクリメント演算子i--
を使用することで、ループが逆方向に進み、各セルに10から1までの値が順次設定されます。
コード例 | for文による逆方向ループ
function main(workbook: ExcelScript.Workbook) {
// アクティブなシートを取得
let sheet: ExcelScript.Worksheet = workbook.getActiveWorksheet();
// セル範囲「A1:A10」を取得
let range: ExcelScript.Range = sheet.getRange("A1:A10");
// デクリメントを使って逆方向に値を入力
for (let i: number = 9; i >= 0; i--) {
range.getCell(i, 0).setValue(10 - i);
}
}
処理結果
コードの動作概要
workbook.getActiveWorksheet()
メソッドを使用して、現在アクティブなシートを取得します。
このシートはsheet
という変数に格納され、以降のコードで対象のシート操作が可能になります。
sheet.getRange("A1:A10")
メソッドで、シート上のセル範囲「A1」から「A10」を取得します。
この範囲はrange
という変数に格納され、範囲内の各セルに対する処理が行いやすくなります。
for (let i: number = 9; i >= 0; i--)
を使用して、i
を「9」から「0」まで1ずつ減らしながらループを行います。
この逆方向ループにより、セル「A10」から「A1」までの範囲を順次処理できます。
range.getCell(i, 0).setValue(10 - i)
で範囲内の各セルを1行ずつ取得し、10から1までの値を逆順に設定します。
具体的には、最初のループで「A10」に10が設定され、次のループで「A9」に9が設定される、といった形で処理が進みます。
このコードで使用している機能
- let (変数)
let
は変数を宣言するためのキーワードです。
- getActiveWorksheet() (アクティブなシートの取得)
workbook.getActiveWorksheet()
メソッドは、Excelで現在アクティブなシートを取得します。
- getCell(行, 列) (セルの取得)
range.getCell(i, 0)
は、指定範囲range
の中で、i
行目、0列目(A列)のセルを取得するメソッドです。
- setValue() (セルへの値の設定)
- 取得したセルに数値を入力するためのメソッドです。
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- function main(workbook: ExcelScript.Workbook)
- Officeスクリプトのメイン関数「main」を定義しています。
この関数は、Excelワークブックを操作するためのパラメータ「workbook」を受け取ります。「ExcelScript.Workbook型」として指定されており、Excelの機能を活用したスクリプト操作が可能です。
- Officeスクリプトのメイン関数「main」を定義しています。
- let sheet: ExcelScript.Worksheet = workbook.getActiveWorksheet();
- getActiveWorksheet()メソッドで現在アクティブなシートを取得し、それを「ExcelScript.Worksheet型」の「sheet」という変数に格納します。
このシートがfor文の対象となります。
- getActiveWorksheet()メソッドで現在アクティブなシートを取得し、それを「ExcelScript.Worksheet型」の「sheet」という変数に格納します。
- let range: ExcelScript.Range = sheet.getRange(“A1:A10”);
- getRange(“A1:A10”)でシートの「A1」から「A10」までのセル範囲を取得し、「ExcelScript.Range型」の変数「range」に格納します。
この範囲は次のステップで繰り返し処理に使用されます。
- getRange(“A1:A10”)でシートの「A1」から「A10」までのセル範囲を取得し、「ExcelScript.Range型」の変数「range」に格納します。
- for (let i: number = 9; i >= 0; i–)
- カウンター「i」を「number型」で定義し、「9」から「0」までの範囲でループを設定します。
「i–」により、変数「i」はループごとに「1ずつ」減少し、セル範囲を逆方向で処理できます。
- カウンター「i」を「number型」で定義し、「9」から「0」までの範囲でループを設定します。
- range.getCell(i, 0).setValue(10 – i);
- 「range.getCell(i, 0)」で「i行目」のセルを取得し、「setValue(10 – i)」で各セルに「10」から「1」までの数値を設定します。
たとえば、最初のループでは「A10」に「10」が設定され、次のループで「A9」に「9」が設定される形で処理が進行します。
- 「range.getCell(i, 0)」で「i行目」のセルを取得し、「setValue(10 – i)」で各セルに「10」から「1」までの数値を設定します。
- }
- 関数「main」の終了を示します。
コードが実行されると、セル範囲「A1」から「A10」に10から1までの値が入力され、for文が終了します。
- 関数「main」の終了を示します。
総括・ポイント
このコードでは、for文のデクリメント演算子i--
を使用して逆方向に繰り返し処理を行い、Excelシート上のセルに対して「10」から「1」までの値を入力しています。
デクリメントを使用することで、シート上の範囲を逆順に処理することが可能です。
このような処理は、データが最下行から入力されている場合や逆方向に操作が必要な場面で役立ちます。
使用例3: for文をネストして2重ループを行う
この例では、for文をネスト(入れ子)して使用し、セル「A1」から「C3」までの範囲に掛け算の結果を順次入力する方法を紹介します。
2重ループにより、行と列の両方に対して繰り返し処理を実行することで、Excelシートの2次元範囲に値を効率よく入力できます。
コード例 | ネストされたfor文による2重ループ
function main(workbook: ExcelScript.Workbook) {
// アクティブなシートを取得
let sheet: ExcelScript.Worksheet = workbook.getActiveWorksheet();
// セル範囲「A1:C3」を取得
let range: ExcelScript.Range = sheet.getRange("A1:C3");
// ネストされたループを使用して、2次元のセル範囲に値を入力
for (let i: number = 0; i < 3; i++) { // 行に対するループ
for (let j: number = 0; j < 3; j++) { // 列に対するループ
range.getCell(i, j).setValue((i + 1) * (j + 1)); // iとjの値を掛け合わせてセルに入力
}
}
}
処理結果
コードの動作概要
workbook.getActiveWorksheet()
メソッドを使用して、現在アクティブなシートを取得します。
このシートはsheet
という変数に格納され、以降のコードで対象となるシート操作が可能になります。
sheet.getRange("A1:C3")
メソッドで、セル範囲「A1」から「C3」を取得します。
この範囲がrange
という変数に格納され、後の処理で範囲内の各セルに対して操作を行います。
外側のfor文for (let i: number = 0; i < 3; i++)
で、行方向のループ処理を行います。i
は0から2までの範囲で増加し、セル範囲の各行に対して順次処理を進めます。
内側のfor文for (let j: number = 0; j < 3; j++)
で、列方向のループ処理を行います。j
は0から2までの範囲で増加し、各行の中で列に対する処理を順に進めます。
range.getCell(i, j).setValue((i + 1) * (j + 1))
で、各セルに(i + 1) * (j + 1)
の掛け算の結果を設定します。
たとえば、セル「A1」には「1 * 1 = 1」が設定され、「A2」には「1 * 2 = 2」が設定される、という形で処理が進行します。
このコードで使用している機能
- let (変数)
let
は変数を宣言するためのキーワードです。
- getActiveWorksheet() (アクティブなシートの取得)
workbook.getActiveWorksheet()
メソッドは、Excelで現在アクティブなシートを取得します。
- getCell(行, 列) (セルの取得)
range.getCell(i, 0)
は、指定範囲range
の中で、i
行目、0列目(A列)のセルを取得するメソッドです。
- setValue() (セルへの値の設定)
- 取得したセルに数値を入力するためのメソッドです。
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- function main(workbook: ExcelScript.Workbook)
- Officeスクリプトのメイン関数「main」を定義しています。
この関数は、Excelワークブックを操作するための「workbookパラメータ」を受け取ります。「ExcelScript.Workbook型」で定義されており、ワークブック全体を操作できます。
- Officeスクリプトのメイン関数「main」を定義しています。
- let sheet: ExcelScript.Worksheet = workbook.getActiveWorksheet();
- 「getActiveWorksheet()メソッド」で現在アクティブなシートを取得し、「sheet」という「ExcelScript.Worksheet型」の変数に格納します。
これにより、以降の処理でシート上のセル範囲にアクセスできます。
- 「getActiveWorksheet()メソッド」で現在アクティブなシートを取得し、「sheet」という「ExcelScript.Worksheet型」の変数に格納します。
- let range: ExcelScript.Range = sheet.getRange(“A1:C3”);
- 「getRange(“A1:C3”)」で、シート上の「A1」から「C3」までの範囲を取得し、「ExcelScript.Range型」の変数「range」に格納します。
この範囲に対して2重ループを使用して値を設定します。
- 「getRange(“A1:C3”)」で、シート上の「A1」から「C3」までの範囲を取得し、「ExcelScript.Range型」の変数「range」に格納します。
- for (let i: number = 0; i < 3; i++)
- 外側のfor文で、行方向に対するループを実行します。
変数「i」は「number型」で定義され、「i = 0」から始まり「3未満」の間、「i++」で「1」ずつ増加します。
このループで行の処理が順次実行されます。
- 外側のfor文で、行方向に対するループを実行します。
- for (let j: number = 0; j < 3; j++)
- 内側のfor文で、列方向に対するループを実行します。
変数「j」は「number型」で定義され、「j = 0」から始まり「3未満」の間、「j++」で「1」ずつ増加します。
このループで列の処理が順次実行され、行ごとの各セルにアクセスできます。
- 内側のfor文で、列方向に対するループを実行します。
- range.getCell(i, j).setValue((i + 1) * (j + 1));
- 「range.getCell(i, j)」で「i行」「j列」のセルを取得し、「setValue((i + 1) * (j + 1))」で各セルに計算結果を設定します。
たとえば、セル「A1」には「1 * 1 = 1」が、セル「B2」には「2 * 2 = 4」が設定されます。
結果的に、「A1」から「C3」までの範囲に掛け算の結果が順に入力されます。
- 「range.getCell(i, j)」で「i行」「j列」のセルを取得し、「setValue((i + 1) * (j + 1))」で各セルに計算結果を設定します。
- }
- 関数「main」の終了を示します。
すべての処理が完了すると、セル「A1」から「C3」までの範囲に掛け算の結果が入力され、for文が終了します。
- 関数「main」の終了を示します。
総括・ポイント
このコードでは、for文のネストによる2重ループを使用して、Excelシート上の2次元範囲に値を入力しています。
行方向と列方向のループを組み合わせることで、複数のセルに対する複雑な処理が簡単に実現できます。
このような2重ループは、テーブル形式のデータ入力や、複数条件での処理が必要な場合に非常に便利です。
使用例4: for文で2つずつカウントする
この例では、for文を使って、カウンターを「2つずつ」増加させながらセルに数値を入力する方法を紹介します。
カウンター変数を2ずつ増加させることで、通常の1ずつ増加するループと異なる間隔での繰り返し処理を実現できます。
コード例 | for文による2つずつカウント
function main(workbook: ExcelScript.Workbook) {
// アクティブなシートを取得
let sheet: ExcelScript.Worksheet = workbook.getActiveWorksheet();
// セル範囲「A1:A10」を取得
let range: ExcelScript.Range = sheet.getRange("A1:A10");
// 2つずつ増加させながらセルに値を入力
for (let i: number = 0; i < 10; i += 2) {
range.getCell(i, 0).setValue(i + 2); // i + 2の値を設定
}
}
処理結果
コードの動作概要
workbook.getActiveWorksheet()
メソッドを使用して、現在アクティブなシートを取得します。
このシートはsheet
という変数に格納され、以降のコードで対象となるシートに対して操作を行う準備が整います。
sheet.getRange("A1:A10")
メソッドで、セル範囲「A1」から「A10」を取得します。
この範囲はrange
という変数に格納され、後の処理で繰り返しアクセスされます。
for文for (let i: number = 0; i < 10; i += 2)
を使用して、i
が「0」から「10未満」の範囲で2つずつ増加しながらループが実行されます。
この設定により、通常の1ずつではなく、2つずつ間隔を空けて処理が進行します。
range.getCell(i, 0).setValue(i + 2)
で、各セルにi + 2
の値を設定します。
たとえば、最初のループでは「A1」に2が設定され、次のループで「A3」に4が設定される、といった形で処理が進みます。
このコードで使用している機能
- let (変数)
let
は変数を宣言するためのキーワードです。
- getActiveWorksheet() (アクティブなシートの取得)
workbook.getActiveWorksheet()
メソッドは、Excelで現在アクティブなシートを取得します。
- getCell(行, 列) (セルの取得)
range.getCell(i, 0)
は、指定範囲range
の中で、i
行目、0列目(A列)のセルを取得するメソッドです。
- setValue() (セルへの値の設定)
- 取得したセルに数値を入力するためのメソッドです。
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- function main(workbook: ExcelScript.Workbook)
- Officeスクリプトのメイン関数「main」を定義しています。
「workbookパラメータ」はExcelワークブック全体を操作するためのもので、型は「ExcelScript.Workbook型」で定義されています。
- Officeスクリプトのメイン関数「main」を定義しています。
- let sheet: ExcelScript.Worksheet = workbook.getActiveWorksheet();
- 「getActiveWorksheet()メソッド」で現在アクティブなシートを取得し、「sheet」という変数に格納します。
「ExcelScript.Worksheet型」として定義されており、この変数を通じてシートに対する操作が行われます。
- 「getActiveWorksheet()メソッド」で現在アクティブなシートを取得し、「sheet」という変数に格納します。
- let range: ExcelScript.Range = sheet.getRange(“A1:A10”);
- 「getRange(“A1:A10”)」で、シート上のセル範囲「A1」から「A10」を取得します。
この範囲は「range」という変数に格納され、「2つずつ」カウントするループの対象範囲となります。
- 「getRange(“A1:A10”)」で、シート上のセル範囲「A1」から「A10」を取得します。
- for (let i: number = 0; i < 10; i += 2)
- カウンター変数「i」を「number型」で定義し、「i = 0」から始まり、「10未満」の間「2ずつ」増加しながらループが進みます。
これにより、「1つ」ずつではなく、「2つ」ずつ間隔を空けて処理が行われます。
- カウンター変数「i」を「number型」で定義し、「i = 0」から始まり、「10未満」の間「2ずつ」増加しながらループが進みます。
- range.getCell(i, 0).setValue(i + 2);
- 「range.getCell(i, 0)」で範囲内の「i」行目のセルを取得し、「setValue(i + 2)」でそのセルに「i + 2」の値を設定します。
たとえば、最初のループでは「A1」に「2」が設定され、次のループでは「A3」に「4」が設定される、という形で進行します。
- 「range.getCell(i, 0)」で範囲内の「i」行目のセルを取得し、「setValue(i + 2)」でそのセルに「i + 2」の値を設定します。
- }
- 関数「main」の終了を示します。
for文がすべて実行されると、セル範囲「A1」から「A10」にかけて2ずつ増加した数値が設定され、処理が完了します。
- 関数「main」の終了を示します。
総括・ポイント
このコードでは、for文を用いてカウンターを2ずつ増加させることで、指定範囲のセルに2つおきに値を入力しています。
i += 2
の設定により、通常の1ずつのループとは異なるカウントが可能になり、一定間隔での処理やデータ配置が必要な場面で便利です。
この方法を応用することで、Excelシート上の繰り返し処理がさらに柔軟に実現できます。
使用例5: 最終行までループして処理を行う
この例では、for文を使用してExcelシート上の「最終行」まで繰り返し処理を行う方法を紹介します。
シートの最終行を取得するために、getLastDataRow
関数を使用してデータが存在する最後の行を取得し、その行までfor文で処理を実行します。
コード例 | for文による最終行までのループ
function main(workbook: ExcelScript.Workbook) {
// アクティブなシートを取得
let sheet: ExcelScript.Worksheet = workbook.getActiveWorksheet();
// 最終行を取得する
let lastRow: number = getLastDataRow(sheet);
// 最終行までループしてA列に値を入力
for (let i: number = 1; i < lastRow; i++) {
sheet.getRange(`A${i}`).setValue(i); // A列に1から最終行までの値を順に設定
}
}
// ↓ 空白スペースと書式を無視して正確に最終行を求める関数
function getLastDataRow(sheet: ExcelScript.Worksheet): number {
let usedRange: ExcelScript.Range = sheet.getUsedRange();
if (!usedRange) return 0;
let startRow: number = usedRange.getRowIndex();
let rowCount: number = usedRange.getRowCount();
let columnCount: number = usedRange.getColumnCount();
for (let i: number = rowCount - 1; i >= 0; i--) {
let rowIndex: number = startRow + i;
let range: ExcelScript.Range = sheet.getRangeByIndexes(rowIndex, 0, 1, columnCount);
let values = range.getValues()[0];
// 行内の各セルをチェック
if (values.some(cell => {
if (cell === null || cell === undefined) {
return 0;
}
if (typeof cell === 'string') {
return cell.trim() !== "";
}
return true; // 数値やブール値など、非文字列型はデータありと判断
})) {
return rowIndex + 1;
}
}
return 0;
}
処理結果
コードの動作概要
workbook.getActiveWorksheet()
メソッドで、現在アクティブなシートを取得します。
取得されたシートはsheet
という変数に格納され、以降の処理でfor文による繰り返しの対象となります。
getLastDataRow(sheet)
関数を使用して、データが存在する最終行の行番号を取得します。
これにより、シートの内容に応じた最終行を動的に判断でき、範囲の柔軟な指定が可能です。
カウンター i
を「1」から lastRow
まで増加させながらループを実行し、A列にカウンターの値を順に設定します。
最初のループでは「A1」に1が入力され、次のループで「A2」に2が入力される、といった形で進行します。
このコードで使用している機能
- let (変数)
let
は変数を宣言するためのキーワードです。
- getActiveWorksheet() (アクティブなシートの取得)
workbook.getActiveWorksheet()
メソッドは、Excelで現在アクティブなシートを取得します。
- getCell(行, 列) (セルの取得)
range.getCell(i, 0)
は、指定範囲range
の中で、i
行目、0列目(A列)のセルを取得するメソッドです。
- setValue() (セルへの値の設定)
- 取得したセルに数値を入力するためのメソッドです。
- if (条件分岐)
- 指定した条件で処理結果を分岐させます。
- getLastDataRow() (最終行の取得)
- 指定したシート内で最終行にデータがある行番号を取得する関数です。
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- function main(workbook: ExcelScript.Workbook)
- Officeスクリプトのメイン関数「main」を宣言しています。
この関数が呼び出されると、Excelのブック(workbook)全体を操作できます。
- Officeスクリプトのメイン関数「main」を宣言しています。
- let sheet: ExcelScript.Worksheet = workbook.getActiveWorksheet();
- getActiveWorksheet() メソッドで現在アクティブなシートを取得し、変数「sheet」に格納しています。
今後の操作の対象として、Excelのシートが設定されました。
- getActiveWorksheet() メソッドで現在アクティブなシートを取得し、変数「sheet」に格納しています。
- let lastRow: number = getLastDataRow(sheet);
- 自作の関数「getLastDataRow(sheet)」を呼び出して、指定したシートの最終行を取得し、その行番号を変数「lastRow」に格納しています。
これで、最終行がいくつかが分かり、ループを適切な範囲で実行できます。
- 自作の関数「getLastDataRow(sheet)」を呼び出して、指定したシートの最終行を取得し、その行番号を変数「lastRow」に格納しています。
- for (let i: number = 1; i < lastRow; i++)
- ここで forループを開始しています。
カウンター 「i」 は「1」から始まり、「lastRow(最終行)」まで「1」ずつ増えていきます。
これにより、最終行まで繰り返し処理が行われます。
- ここで forループを開始しています。
- sheet.getRange(A${i}).setValue(i);
- getRange メソッドでA列の「i」行目のセルを取得し、setValue(i) メソッドでそのセルに数値「i」を設定しています。
最初のループでは「A1」に「1」が入力され、次に「A2」に「2」が設定される形で、最終行まで処理が進行します。
- getRange メソッドでA列の「i」行目のセルを取得し、setValue(i) メソッドでそのセルに数値「i」を設定しています。
- }
- for ループの終了を示します。
全ての行に値が設定されたら、このカッコで for ループを完了します。
- for ループの終了を示します。
■ getLastRow関数
- function getLastDataRow(sheet: ExcelScript.Worksheet): number
- この行で、新しい関数「getLastDataRow」を定義しています。
引数としてシート (sheet) を受け取り、そのシートでデータが入力されている最終行の行番号を取得して返す処理です。
- この行で、新しい関数「getLastDataRow」を定義しています。
- let usedRange: ExcelScript.Range = sheet.getUsedRange();
- getUsedRange() メソッドで、指定したシートの「使用中の範囲」を取得し、それを変数 「usedRange」に格納しています。
この範囲には、データが入力されたすべてのセルが含まれます。
- getUsedRange() メソッドで、指定したシートの「使用中の範囲」を取得し、それを変数 「usedRange」に格納しています。
- if (!usedRange) return 0;
- if 文を使って、「usedRange」が空(null)かどうかを確認します。
もしデータが存在しない場合、この行で最終行を「0」として返します。
- if 文を使って、「usedRange」が空(null)かどうかを確認します。
- let startRow: number = usedRange.getRowIndex();
- 変数「startRow」を宣言し、「usedRange.getRowIndex()」で「使用中の範囲の開始行」を取得して格納します。
この範囲は0ベースで指定されます。
- 変数「startRow」を宣言し、「usedRange.getRowIndex()」で「使用中の範囲の開始行」を取得して格納します。
- let rowCount: number = usedRange.getRowCount();
- 使用中の範囲に含まれる行数を取得し、変数「rowCount」に格納しています。
これで、データが入力された行の数がわかります。
- 使用中の範囲に含まれる行数を取得し、変数「rowCount」に格納しています。
- let columnCount: number = usedRange.getColumnCount();
- 使用中の範囲に含まれる列数を取得し、変数「columnCount」に格納します。
後で行全体を確認するために使います。
- 使用中の範囲に含まれる列数を取得し、変数「columnCount」に格納します。
- for (let i: number = rowCount – 1; i >= 0; i–) {
- for ループで「i」を「rowCount – 1(最終行)」から「0」まで順番に減らしながらループを行います。
こうすることで、下から上に向かってデータの有無を確認できます。
- for ループで「i」を「rowCount – 1(最終行)」から「0」まで順番に減らしながらループを行います。
- let rowIndex: number = startRow + i;
- 変数「rowIndex」を宣言し、「startRow + i」によりシート上での行インデックスを計算しています。
変数「startRow」は「0」ベースなので、全体のインデックスとして正確な行番号を取得できます。
- 変数「rowIndex」を宣言し、「startRow + i」によりシート上での行インデックスを計算しています。
- let range: ExcelScript.Range = sheet.getRangeByIndexes(rowIndex, 0, 1, columnCount);
- getRangeByIndexes メソッドを使って、指定した行全体のセル範囲を取得し、「range」に格納しています。
「rowIndex 行目」から「columnCount 列分」の範囲を取得します。
- getRangeByIndexes メソッドを使って、指定した行全体のセル範囲を取得し、「range」に格納しています。
- let values = range.getValues()[0];
- 取得した範囲「range」内のすべてのセル値をgetValues() メソッドで2次元配列として取得し、変数「values」に格納します。
「values[0]」に各セルのデータが含まれます。
- 取得した範囲「range」内のすべてのセル値をgetValues() メソッドで2次元配列として取得し、変数「values」に格納します。
- if (values.some(cell => { … }))
- values[0].some(…) メソッドで、行内に少なくとも1つデータが含まれているか確認します。
「some」は条件を満たすデータが1つでもあれば「true」を返します。
- values[0].some(…) メソッドで、行内に少なくとも1つデータが含まれているか確認します。
- if (cell === null || cell === undefined) {
- 変数「cell」が「null」または「undefined」の場合、セルが空であると判断します。
この条件で空セルを除外します。
- 変数「cell」が「null」または「undefined」の場合、セルが空であると判断します。
- return 0;
- 空セルの場合、「false」を返します。
これにより、このセルはデータが含まれていないと見なされます。
- 空セルの場合、「false」を返します。
- if (typeof cell === ‘string’) {
- 次に、「cell」のデータ型が文字列であるかを確認します。
この確認により、文字列としての空白やスペースだけのデータを区別します。
- 次に、「cell」のデータ型が文字列であるかを確認します。
- return cell.trim() !== “”;
- セル内の文字列から空白を取り除いた上で、空でないかを確認します。
空でない文字列の場合は「true」を返し、データがあると判断します。
- セル内の文字列から空白を取り除いた上で、空でないかを確認します。
- return true;
- 文字列以外のデータ型の場合(数値やブール値など)は、そのまま「true」を返し、データが含まれていると判断します。
- return rowIndex + 1;
- 「rowIndex + 1」を返し、データがある行を最終行として返します。
「+1」することで、Excelの1ベースの行番号に合わせています。
- 「rowIndex + 1」を返し、データがある行を最終行として返します。
- return 0;
- シートにデータが一切ない場合や、データが見つからなかった場合に 「0」を返して終了します。
- }
- 関数「getLastDataRow」の終了を示します。
総括・ポイント
このコードでは、for文を用いてExcelシート上の最終行まで繰り返し処理を行い、1から最終行までの数値を順に入力しています。
最終行の取得には独立したgetLastDataRow
関数を用いているため、シートのデータ量に応じて範囲を動的に指定することが可能です。
シート内のデータの最終行まで繰り返し操作が必要な場面で、効率的に対応できるスクリプト構成となっています。
使用例6: 配列を使用して要素数のみループする
この例では、Officeスクリプトのfor文を使って、配列内の要素数分だけ繰り返し処理を行い、各要素の値をExcelのセルに入力する方法を紹介します。
配列を使った繰り返し処理を活用することで、Excelの指定範囲内に配列のデータを効率よく配置できます。
コード例 | 配列の要素数分だけfor文でループ
function main(workbook: ExcelScript.Workbook) {
// 配列を定義
let dataArray: number[] = [10, 20, 30, 40, 50];
// アクティブなシートを取得
let sheet: ExcelScript.Worksheet = workbook.getActiveWorksheet();
// 配列の要素数分だけループを実行し、セルにデータを入力
for (let i: number = 0; i < dataArray.length; i++) {
sheet.getRange(`A${i + 1}`).setValue(dataArray[i]);
}
}
処理結果
コードの動作概要
配列 dataArray
を定義し、配列の要素数に応じて処理を繰り返す準備をします。
この例では、[10, 20, 30, 40, 50]
というデータが定義されています。
workbook.getActiveWorksheet()
メソッドを使用して、現在アクティブなシートを取得します。
このシートは sheet
という変数に格納され、Excel上の操作対象となります。
for (let i = 0; i < dataArray.length; i++)
で、配列 dataArray
の要素数だけループを繰り返します。
この設定により、配列の全要素を順に処理することが可能です。
sheet.getRange(A${i + 1}).setValue(dataArray[i])
で、A列の各セルに配列の要素を順に設定します。
最初のループでは「A1」に10が入力され、次のループでは「A2」に20が設定される、といった形で最終要素まで進みます。
このコードで使用している機能
- let (変数)
let
は変数を宣言するためのキーワードです。
- getActiveWorksheet() (アクティブなシートの取得)
workbook.getActiveWorksheet()
メソッドは、Excelで現在アクティブなシートを取得します。
- getCell(行, 列) (セルの取得)
range.getCell(i, 0)
は、指定範囲range
の中で、i
行目、0列目(A列)のセルを取得するメソッドです。
- setValue() (セルへの値の設定)
- 取得したセルに数値を入力するためのメソッドです。
- 配列名.length (配列の要素数を取得)
- 指定した配列名の要素数を取得します。
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- function main(workbook: ExcelScript.Workbook)
- Officeスクリプトのメイン関数「main」を定義しています。
この関数が呼び出されると、「workbook」内で処理が実行されます。
- Officeスクリプトのメイン関数「main」を定義しています。
- let dataArray: number[] = [10, 20, 30, 40, 50]
- 配列「dataArray」を「number[] 型」で定義し、値 [10, 20, 30, 40, 50] を格納します。
- let sheet: ExcelScript.Worksheet = workbook.getActiveWorksheet()
- 現在アクティブなシートを取得し、「sheet」に格納します。
以降の処理はこのシートを対象に行われます。
- 現在アクティブなシートを取得し、「sheet」に格納します。
- for (let i: number = 0; i < dataArray.length; i++)
- 配列「dataArray」の要素数だけループを繰り返します。
「i」は「0」から始まり、「dataArray.length」の範囲で増加します。
- 配列「dataArray」の要素数だけループを繰り返します。
- sheet.getRange(A${i + 1}).setValue(dataArray[i])
- 配列「dataArray」の各要素を「A${i + 1}」のセルに順次設定します。
配列の要素が「A1」から順番に設定されます。
- 配列「dataArray」の各要素を「A${i + 1}」のセルに順次設定します。
- }
- 関数「main」の終了を示します。
総括・ポイント
このコードでは、配列の要素数に応じてfor
文を使い、Excelシート上のセルに値を入力しています。dataArray.length
を使うことで、配列の要素数だけ繰り返し処理を行うため、柔軟にデータを配置することが可能です。
また、forEach
メソッドでも同様の処理が実行でき、配列要素の操作に特化した構文を活用することで、コードをさらにシンプルに記述できます。
この方法を活用すると、Excelでの配列データの操作や自動化がさらに便利になります。
使用例7: オブジェクトの要素をループしてセルに入力する
この例では、for 文の応用として、for-in 文を使用してオブジェクト内の各要素をループし、キーと値をExcelのシートに入力する方法を紹介します。
オブジェクトをループする際には、for 文よりも for-in 文が適しており、キーと値の組み合わせデータを効率よく処理できます。
この方法により、Excelの指定範囲内に構造化されたデータを自動で配置でき、データ操作がさらに便利になります。
コード例 | オブジェクトのキーと値をループして入力
function main(workbook: ExcelScript.Workbook) {
// オブジェクトを定義
let dataObject: { [key: string]: number } = {
"Alice": 85,
"Bob": 92,
"Charlie": 78,
"Daisy": 90,
"Evan": 88
};
// アクティブなシートを取得
let sheet: ExcelScript.Worksheet = workbook.getActiveWorksheet();
// オブジェクトの各要素に対してループ処理を行い、キーと値をセルに入力
let row: number = 1; // 開始行を指定
for (let key in dataObject) {
sheet.getRange(`A${row}`).setValue(key); // A列にキー(名前)を入力
sheet.getRange(`B${row}`).setValue(dataObject[key]); // B列に値(スコア)を入力
row++; // 次の行に移動
}
}
処理結果
コードの動作概要
オブジェクト dataObject
を定義し、キー(名前)と値(スコア)を持つデータセットを用意します。
workbook.getActiveWorksheet()
メソッドを使用して、現在アクティブなシートを取得します。
このシートは sheet
という変数に格納され、Excel上の操作対象となります。
for (let key in dataObject)
により、オブジェクト dataObject
の各キーに対して繰り返し処理を行います。
キーとその対応する値をセルに入力する処理を進めるための準備が整います。
sheet.getRange(A${row}).setValue(key)
でA列のセルにキー(名前)を、sheet.getRange(B${row}).setValue(dataObject[key])
でB列のセルにその値(スコア)を設定します。
ループごとに row
を1ずつ増やすことで、次の行にデータが入力されます。
このコードで使用している機能
- let (変数)
let
は変数を宣言するためのキーワードです。
- getActiveWorksheet() (アクティブなシートの取得)
workbook.getActiveWorksheet()
メソッドは、Excelで現在アクティブなシートを取得します。
- getCell(行, 列) (セルの取得)
range.getCell(i, 0)
は、指定範囲range
の中で、i
行目、0列目(A列)のセルを取得するメソッドです。
- setValue() (セルへの値の設定)
- 取得したセルに数値を入力するためのメソッドです。
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- function main(workbook: ExcelScript.Workbook)
- Officeスクリプトのメイン関数「main」を定義しています。
この関数が呼び出されると、「workbook」内で処理が実行されます。
- Officeスクリプトのメイン関数「main」を定義しています。
- let dataObject: { [key: string]: number } = {…}
- オブジェクト「dataObject」を定義し、キー(名前)と値(スコア)のセットを格納します。
- let sheet: ExcelScript.Worksheet = workbook.getActiveWorksheet()
- 現在アクティブなシートを取得し、「sheet」に格納します。
以降の処理はこのシートを対象に行われます。
- 現在アクティブなシートを取得し、「sheet」に格納します。
- let row: number = 1
- ループの開始行として「row」を「1」に設定します。
- for (let key in dataObject)
- オブジェクト「dataObject」の各キーに対してループを繰り返し、キーとその値にアクセスします。
- sheet.getRange(A${row}).setValue(key)
- 「A列」の「row」行目にキー(名前)を設定します。
- sheet.getRange(B${row}).setValue(dataObject[key])
- B列の「row」行目に対応する値(スコア)を設定します。
- row++
- 行番号を「1」増やし、次の行に進むようにします。
- }
- 関数「main」の終了を示します。
総括・ポイント
このコードでは、for-in 文を使用してオブジェクトのキーと値にアクセスし、Excelシートに効率よくデータを入力しています。
for 文と異なり、for-in 文はオブジェクトのキーに直接アクセスできるため、キーと値の組み合わせデータを扱う処理が非常に簡単に行えます。
オブジェクトをループする場合、for 文よりもfor-in 文が適しており、構造化データをExcelシートに自動化して出力する場面で特に役立ちます。
この方法を覚えておくことで、より柔軟で効率的なデータ操作が可能になります。
この記事のまとめ
この記事では、Officeスクリプトの「for文」を使ったExcelでの繰り返し処理について解説しました。
繰り返し処理を効率的に利用することで、Excelシート上での自動化が実現できます。
ポイントのおさらい
- for文の基本を理解する
- 基本のfor文の構成を説明しました。
シート上で範囲内のセルに対して順番に処理を実行できます。
⇒ 「Officeスクリプトのfor文の基本構文と流れ」をもう一度見る
- 基本のfor文の構成を説明しました。
- インクリメント・デクリメント演算子を使いこなす
- 「i++」「i–」などの演算子を活用することで、ループ内でカウンターを自在に制御する方法を学びました。
⇒ 「Officeスクリプトのfor文|インクリメント・デクリメント演算子の使い方」を見る
- 「i++」「i–」などの演算子を活用することで、ループ内でカウンターを自在に制御する方法を学びました。
- 繰り返し処理のfor文と合わせて使用される機能を確認
- for文を合わせてよく使われる「break」「continue」「最終行」の使用方法を学びました。
⇒ 「Officeスクリプト for文を合わせて使用したい|break・continue・最終行までの使い方」もう一度見る。
- for文を合わせてよく使われる「break」「continue」「最終行」の使用方法を学びました。
- 注意ポイントの確認
- カウンターの設定による無限ループの防止や、配列のインデックス範囲外へのアクセスを避けるための注意ポイントを再確認しました。
⇒ 「Officeスクリプトのfor文で注意すべきポイント」もう一度見る。
- カウンターの設定による無限ループの防止や、配列のインデックス範囲外へのアクセスを避けるための注意ポイントを再確認しました。
- for分の使用例をご紹介
- 最終行まで繰り返し処理を行う方法として、getLastDataRow関数を使って動的にデータ範囲を指定する方法を学びました。
また、その他の使用例も解説しています。
⇒ 「Officeスクリプトのfor文の使用例をご紹介」もう一度見る。
- 最終行まで繰り返し処理を行う方法として、getLastDataRow関数を使って動的にデータ範囲を指定する方法を学びました。
さらに学ぶために
この記事で学んだfor文の基礎をもとに、他のループ処理や条件分岐を取り入れたOfficeスクリプトでの自動化に挑戦してみましょう。
データ処理を一層効率化できるスクリプトを目指しましょう。