vba裏技,技,論理 - 繰返し処理

プログラムを組み立てる時に必ず必要となるのが反復、繰返し処理だ。元々プログラムは同じ処理をする手数と時間を短縮するために考案された手法であるから、この反復、繰返し処理はプログラムを構築する基本となる操作だ。

①  

i=1

For i = 1 To 20

Cells(i, 1).Value=Cells(i, 3).Value

Next i

これは「i」の値が20になるまで繰り返す,即ち20回書かれた通りのことが実行されるやり方だ。「i」が20になれば繰返しは強制的に解除される。

 Cells.Find(“連番”).Offset(1).Select

Do

  Selection.Value=Selection.Offset( , 2).Value

If SelectionValue=”” Then

Exit Do

End If

Selection.Offset(1).Select

Loop

 ここでは選択されたセルに何も入力されていない時に繰返しが解除される。解除の「exit do」は「do 構文」から出ると言う意味だ。

Cells.Find(“連番”).Offset(1).Select

繰返し:

Selection.Value=Selection.Offset(, 2).Value

 Selection.Offset(1).Select

If Selection.Value<>”” Then

GoTo 繰返し

End If

②と全く同じことをさせる構文である。Selectionの値が「””」でない限りは「繰返し」へ行けと言っている。

どの書き方も問題なく作用する。③はあまり使わないやり方だが、考えれば同様にやり方だとすぐに分かる筈だ。

rbase=Cells.Find(“連番”).Row ①

cbase=Cells.Find(“連番”).Column         ②

Cells.Find(“連番”).Offset(1).Select         ③

Do                       ④

r=Selection.Row               ⑤

Do                         ⑥

c=Selection.Column             ⑦

Selection.Value=Cells(rbase, c).Value     ⑧

If Cells(rbase, c).Value=”摘要” Then     ⑨

Cells(r, cbase).Select           ⑩

Exit Do                 ⑪

End If            

Selection.Next.Select            ⑫

Loop                     ⑬

If Selection.Offset(1).Value=”合計” Then     ⑭

Exit do

End If

Selection.Offset(1).Select ⑮

Loop

これはタイトル行の文字を合計と入力されている一つ上の行まで全て入力する書き方だ。「Do Loop」の中に更に「Do Loop」が組み込まれている「ネスト」と言われる手法だ。

① は「連番」と入力されている行を示す。

② は「連番」と入力されている列を示します。

③ タイトル行の「連番」と入力されている一つ下を選択します。

④ この「Do」は元の繰返しの始まりを示す。

⑤ rは変数で最初は「連番」の一つ下、即ち選択されたセルの行を示す。

⑥ この「Do」はネストの「Do」で先ずこの「Do」の中のコマンドを実行します。

⑦ 列は変化していくので変数「c」は変化した結果、選択されたセルの列を示します。

⑧ 選択されているセル(Selection)の「Value」即ち値は連番と入力されている行で、selection、即ち選択されている列と合致する列の値を入力します。

⑨ 選択された列のタイトル行の値が「摘要」になればこのネストの「Do Loop」

から一旦出てしまいます。

⑩ この時に選択されている列は「摘要」というセルなので、それを「連番」の下に戻します。これはまたそこから入力を開始するためです。

⑪ 「rbase」の行で選択されているセルの列の値が「摘要」(空白セルの一つ左)ではない場合は一つずつ右(next)に移動せよというコマンドです。

⑨から始まる「If EndIf」の構文と⑫の構文を逆に書くと最後の行(合計の一つ上の行)は実行されないので注意をする必要があります。

⑫ 条件が満たされないと選択されているセルが一つ右に移動する

⑬ 選択されているセルが「合計」と入力されているセルの一つ上であるという条件が満たされれば「Do Loop」から強制的に出されます。

⑭ 上記条件が満たされないと選択されているセルの行が一つ下に行きます。

そしてまたネストの「Do Loop」の中を実行します。

 大雑把に言うとネストの「Do Loop」で「連番」下から始めて右に移動しながら摘要の列まで入力してゆく、

 それが全て入力されると一段下の行に行き、また上記と同様の処理をします。その処理は合計と入力されている一段上の行まで行う。

 という二つの連続作業が書かれている訳です。

上記のやり方は一つの例であって、どんな書き方でも論理的に正しければきっちりと動きます。覚えないで理論的に考えて下さい。

酒巻 修平

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です