ド素人でも学べる ExcelVBA 009 For If セル

ブログ

はじめに

 セルを解説したので、セルを用いて For文や If文の解説をもう少し付け加えたいと思う。
 今回は、For文やIf文を組み合わせる事でプログラミングは色々な事ができるようになる。

For文の中のFor文

 For文は、その中にさらにFor文を書く事ができる。こういうのを入れ子という。
 これを使えば、矩形のセルを巡回する事ができる。
 
 順番に数字を入れていくプログラムを示す。

Sub testFor()
    Dim i As Long, j As Long
    Dim cnt As Long
    cnt = 1
    For i = 1 To 5
        For j = 1 To 5
            Cells(i, j) = cnt
            cnt = cnt + 1
        Next j
    Next i  
End Sub

 ここでは、セルの値となる cnt という変数を使っている。
 この cnt はカウント用変数でもある。
 最初に3行目で初期値を 1 にセット。最初のFor文の後、2つめのFor文の中でセルに値を入れていくが、アドレスの指定は、行には i 、列には j を指定している。値は cnt だ。

 cnt = cnt + 1 として値を増加させている。この書き方はもう慣れたかな?
わからない人はこちらのページを参照してほしい。
 
 入れ子になったFor文は、内側の巡回が終わった後に外側が実行されるイメージだ。
 時計で言えば、内側のFor文が分針。外側が時針という感じになる。

 結果は以下のようになる。

 このプログラムでは、横方向に数値を埋めてから次の行に移っている。
 では、逆に縦方向に数値を埋めてから次の列に移るようにするにはどうしたら良いだろう?
(以下のような配置でプログラムしたい。)

外側のFor文と内側のFor文を逆にすれば巡回する向きを変える事ができる。

Sub testFor2()
    Dim i As Long, j As Long
    Dim cnt As Long
    cnt = 1
    For j = 1 To 5
        For i = 1 To 5
            Cells(i, j) = cnt
            cnt = cnt + 1
        Next i
    Next j
End Sub

 
 もちろん、Cells の行と列の引数を交換してもOKだ。(こっちの方が簡単に書き換えられる。)

Sub testFor3()
    Dim i As Long, j As Long
    Dim cnt As Long
    cnt = 1
    For i = 1 To 5
        For j = 1 To 5
            Cells(j, i) = cnt
            cnt = cnt + 1
        Next j
    Next i
End Sub

 cnt を使わなくても、i と j でセルの値を作る事ができるんじゃないか?
 そう考えた人もいるかもしれない。やってみよう。
 でも、ただ足しただけじゃ思い通りにいかないので注意しよう。

Sub testFor5()
    Dim i As Long, j As Long
    For i = 1 To 5
        For j = 1 To 5
            Cells(i, j) = (i - 1) * 5 + j
        Next j
    Next i
End Sub

 i は 2回目から 5倍しないとダメだ。
  (i – 1) * 5 + j
  最初のカッコは省略できない。(数学の知識は大丈夫だろうか?)
  以下のように書いてもOKだ。
  i * 5 + j – 5

 ここまでで、プログラムは結果が同じでも書き方がいくつかあるという事がわかったと思う。
とりあえず1つの書き方を見つけられれば良いが、色々な表現ができた方が思考に柔軟性を持たせる事ができる。特に人のプログラムコードを読むときに便利だろう。

問題

 以下のような数値の配置となるようなプログラムを考えてみよう。
やり方は何通りかある。自分自身で考えて答えを出してみよう。
筆者の答えを、一番最後に載せておく。

For文を抜ける方法

 For文の途中で巡回を抜けたいという事がある。その方法をいくつか見ていこう。

Exit For

 Exit For を使うと、そのFor文から抜け出す事ができる。
Exit For は For文の内部で使用する必要がある。

Sub testExitFor()
    Dim i As Long
    For i = 1 To 10
        If i = 6 Then
            Exit For
        End If
        Cells(i, "A") = i
    Next i
End Sub

 上記の例では If文内部が一行なので、全体を一行書く事ができる。

Sub testExitFor2()
    Dim i As Long
    For i = 1 To 10
        If i = 6 Then Exit For
        Cells(i, "A") = i
    Next i
End Sub

 結果は以下のようになる。For文は10回繰り返そうとしているが、6回目で Exit For によって繰り返し処理を抜けている。

 もしFor文が複数入れ子になっている場合は、抜け出せるのは1つだけなので注意しよう。
以下は、前のプログラムを変更したものだが、Exit For で抜け出せるのは、内側の For文だけで、外側の For文は繰り返されてしまう。

Sub testFor6()
    Range("A1:E5").ClearContents
    Dim i As Long, j As Long
    Dim cnt As Long
    cnt = 1
    For i = 1 To 5
        For j = 1 To 5
            Cells(i, j) = cnt
            cnt = cnt + 1
            If cnt = 14 Then Exit For
        Next j
    Next i
    
End Sub

GoTo LABEL

 ラベルという機能を使えば、GoTo メソッドでラベル位置に処理を飛ばす事ができる。
ラベルは、行頭からラベル名を書き、最後にコロン(:)を書く。こうする事でその位置をラベル位置として認識させる事ができる。ラベル名は慣例としてアルファベット大文字で書く事が多い。

ラベル名:

 後は、必要なときに GoTo ラベル名 とすればその位置に処理を飛ばす事ができる。

Sub testFor7()
    Range("A1:E5").ClearContents
    Dim i As Long, j As Long
    Dim cnt As Long
    cnt = 1
    For i = 1 To 5
        For j = 1 To 5
            Cells(i, j) = cnt
            cnt = cnt + 1
            If cnt = 14 Then GoTo LABEL
        Next j
    Next i

LABEL:

End Sub

 ここでは、2つのFor文を抜け出すために GoTo LABEL を使って LABEL行に飛んでいる。

 GoTo LABEL は、プログラムの流れがわかりずらくなる傾向にあるため、多用する事は推奨されていない。
VBAでの主な利用方法としてはエラーが発生した場合の対処などに使われる事が多い。

Exit Sub

 すぐにプログラムを終了したければ、Exit Sub を使う。
Exit Sub では For文に限らず、どこからでも処理を中断して終了できる。

Sub testFor8()
    Range("A1:E5").ClearContents
    Dim i As Long, j As Long
    Dim cnt As Long
    cnt = 1
    For i = 1 To 5
        For j = 1 To 5
            Cells(i, j) = cnt
            cnt = cnt + 1
            If cnt = 14 Then Exit Sub
        Next j
    Next i

End Sub

まとめ

 For文やIf文は、単独で使う事もあるが組み合わせて使う事が多い。
繰り返しと条件分岐を使えば、様々な処理に対応できるようになる。

 今回解説したFor文の中のFor文や、For文を抜け出す方法は、よく使うので覚えておくようにしよう。
最後に、問題の答えを示す。

問題の答え

 プログラミングになれていない人には難しかったと思う。答えは以下のようになる。
 ブレークポイントを2つ設置して実行してみると、どうなっているか理解しやすいだろう。
 是非ステップ実行してみてほしい。

Sub macro()
    Dim i As Long, j As Long, k As Long
    For i = 1 To 7
        For j = i To 7
            Cells(j, i) = j
        Next j 
        For k = i + 1 To 7
            Cells(i, k) = k
        Next k 
    Next i
End Sub

 業務改善などで、自分の仕事の問題を解決するときは、今回のように答えが用意されているわけではない。
結局、自分で考えて答えを見つけることになる。
普段から試行錯誤を重ねて考え抜くようにすればプログラミング能力はアップする。
答えは1つじゃないから、色々なアプローチを探ってみるのは良い勉強になるだろう。

コメント

タイトルとURLをコピーしました