Excel Office スクリプト ループ(繰り返し処理)

2021年6月12日

この記事ではOffice スクリプトにおけるループ(繰り返し処理)の方法を紹介します。

このループは一定の条件の元、同じ処理を繰り返します。

解説

ループ

ループの方法は主に3種類あります。(配列用のループは別途)

ループ説明
while特定の条件を満たす間、繰り返す
do-whilewhileの後判定
forループカウンターによる繰り返し

投稿を表示

while(特定の条件を満たす間、繰り返す)

条件式の結果がtrueの間、同じ処理を繰り返します。

whileは次のように記述します。(赤字は適宜変更

while (trueの間続ける条件式) {
  繰り返す処理
}
コード例

もしwhileが始まった時に条件式の結果がtrueになる状態だと1度も実行されません。

インクリメント演算子

ループからは話が離れますが

11行目の「count++」と「count = count + 1」は同じ意味です。

++はインクリメント演算子というもので指定の変数の1を加算するものです。

簡潔に書けることと、元になった言語の慣習でよく使われます(よって、やや上級者向け)。

どちらが正解とも言えませんが、

Offceスクリプトの利用者は本職のプログラマでない人が多くなるため

後者の記述の方が易しいためを後者を使っておきましょう。

(ただ本職のプログラマは前者の記述を使いがちのため、存在は把握しておくほうがよいです)

代入加算

10行目の「total += Number(value)」と「total = total + Number(value)」は同じ意味です。

+=は代入加算というものです。

これも前述のインクリメント演算子と同様の事情で後者の利用が無難です。

do-while(whileの後判定)

条件式の結果がtrueの間、同じ処理を繰り返します。

do-whileは次のように記述します。(赤字は適宜変更

do{
  繰り返す処理
}while (trueの間続ける条件式)

do-whileの場合、判定が繰り返す処理の後に来るため、最低1回は実行されます。

その他はwhileと同様です。

for(ループカウンターによる繰り返し)

初期化式と継続条件式と変化する量(更新式)を指定して同じ処理を繰り返します。

ループカウンターのようなループの度に一定量変化する数値を、

終了条件にする場合に適しています。(赤字は適宜変更

for (初期化式; 継続条件式; 更新式) {
  繰り返す処理
}

最初に初期化式が実行され、継続条件式がfalseの間処理を繰り返し(whileとは逆です)、

繰り返す処理のあとに更新式を実行します。

次の例では10回繰り返します。

コード例

更新式は1加算以外でも可能です。(単純な1づつカウントアップが一番使います)

四則演算なども可能ですが現実的に使うの可能性が高いのは減算です。

コード例

継続の条件式以外はなくても構いません。(必要な状況は少ないですが)

コード例
開始値は0か1か

基本的には0で開始して、終了条件をカウンター<終了値(例では i<10)とするほうが良いです。

「セルアクセス(getCell)の1行目・1列目」と「配列の最初の要素のインデックス」が

どちらも0で、それらをループ内で利用する機会が多いからです。

何らか理由で、1を開始値にしたい場合は、

終了条件をカウンター<=終了値(例では i<=10)とします。

変数名

コード例ではループカウンターの変数をiという名前にしています。

iを使っている場合はj、k…と続きます。

本職プログラマの慣例としてよく使われるため例示しましたが

(祖先のJavascriptやC言語からの伝統)

Officeスクリプトではcountなどの名前を推奨します。

(前述のインクリメント演算子と同様の事情)

ループのコントロール

繰り返す処理の中で流れを変える方法があります。

コントロール説明
continue後続の処理を飛ばして、次のループに移行します。
break後続の処理を飛ばして、ループを終了します。

基本的には何らかの条件(IfやSwitch)を満たす場合に利用します。

continue(次のループ)

continueはその回のループを途中で中断して、次のループに移行します。

次の例ではカウンターが偶数の場合、continueします。

(2で割った余りが0なら偶数、1なら奇数です。i%2==0)

continueされた結果、偶数の場合にセルへの書き込みが行われません。

コード例

break(ループを抜ける)

breakはその回のループを途中で中断して、ループから離脱します。

while(true){}のように終わらないループ条件にしておいて、

幾つかのポイントでbreakさせる方法もあります。

(無限ループにならないか注意が必要です)

次の例ではカウンターが5の場合、breakします。

breakされた結果、それ以降のセルへの書き込みが行われません。

コード例

無限ループ発生時の対処方法

終了条件がtrueにならない状態で起動してしまうと、Officeスクリプトが終わりません。

そういう状態になった場合は「停止」ボタンを押すと強制的に終わらせることが可能です。

コード例

ループ内での変数宣言と範囲(スコープ)

letで宣言した変数は{}で囲まれた範囲(ブロック)と、

より下層のブロックでのみ利用可能です。

ループのブロックで宣言した変数はループの外ではアクセスできません。

次の例ではloopOutValueは12行目でも利用できますが、

countとloopInValueは13行目と14行目では利用できません。

コード例

ループでのみ使う変数はループ内で宣言しましょう。

その方が他の人が読んだとき構造を把握しやすくなります。

(ループの外では使われない変数とわかるため)

ループを出た後、ループ内変数と同名の変数を宣言できますが、

非常にややこしくなるため非推奨です。

varで変数宣言(非推奨)

変数の宣言はletでなくvarという記述でも可能です。

varではループ内で宣言した変数をループの外でもアクセス可能ですが、

この特性はプログラムを作る段階では便利ですが、後から読む場合には有害です。

JavaScriptに慣れている人はvarを使ってしまいがちなため記述しますが

(古いブラウザでletが使えなかったりしたため)

varは使わずにletで宣言しましょう。

コード例(varで宣言)

次の記事

配列の使い方

関連記事

初心者向けの記事一覧