秀丸マクロ: 入れ子 while文の使い方

繰り返しは while 文のみ

秀丸マクロで繰り返し処理を実現する場合、while 文を使います。 他のプログラミング言語でよくある for 文は秀丸にはありません。

while 文は無限ループを発生させてしまう可能性がありますから、 慣れない間は無限ループに注意してプログラミングする必要があります。

while 文

while 文は次のように記述します。
条件式が真の間、{}(波括弧)内の処理を繰り返し実行。

書式
while (条件式) {
	
	// 処理
	
}

具体的には次のようなコードになります。

// 5回ループ
#i = 0;
while(#i < 5) {
	// 処理
	#i = #i + 1;
}

while 文の入れ子

while 文を入れ子にすることもできます。

次のコードは外側のループを3回、内側のループを2回実行します。
ループ用のカウンタは外側を #i、内側を #k で管理しています。

// 外側のループ
#i = 0;
while(#i < 3){
	
	// 内側のループ
	#k = 0;
	while(#k < 2){
		
		#k = #k + 1;
	}
	
	#i = #i + 1;
}

while 文の入れ子の応用例として、 タブ区切りの複数行テキストをHTMLのtable形式にするプログラムを作成しました。

サンプルコード: タブ区切りの複数行テキストをHTMLのtableタグに変換

ループを抜け出す break

ループを抜け出すには break文を使います。 2重ループの中でbreak文を使った場合は、 1つ外のループへ抜け出します。

if (条件式) break;

次のループへ continue

次のループへ進む場合は continue 文を使います。
continue文を使う場合は、 ループカウンタの管理に気を付けてください。 場合によっては無限ループを発生させる原因になります。

if (条件式) continue;

複数行の内容を1行ずつ取得

選択された複数行の内容を、1行ずつ取得したい場合は、 split() 関数とwhile 文を使うと実現できます。

split() 関数を使って改行で区切り、 while 文で配列をループします。 コードは次の通りです。

// 範囲選択中でない場合、マクロを終了する
if (selecting == 0) endmacro;

// 選択範囲の文字列を取得(範囲選択を維持しない)
$str = gettext(seltopx,seltopy,selendx,selendy);

// 改行で分割
#num = split($arr, $str, "\r\n");

// 配列のループ
#i = 0;
while (#i < #num) {
	
	// ここに行ごとの処理を記述
	message $arr[#i];
	
	#i = #i + 1; // カウンタの ++ を忘れずに
}