繰り返し【For Each】

今回はForEachについて説明します。
最後に良いお知らせもあるので見てみてくださいね。

前回の答え

では、まずこちらも前回と同様に練習問題の解説から入りたいと思います。
正解のコードは下記になります。
Sub 評価()
Dim s As Integer
For s = 1 To Range("A1").End(xlDown).Row
    If Cells(s, 1).Value >= 80 Then
        Cells(s, 2).Value = "よく出来ました"
    ElseIf Cells(s, 1).Value >= 50 Then
        Cells(s, 2).Value = "あと一歩"
    Else
        Cells(s, 2).Value = "もう少し頑張りましょう"
    End If
Next
End Sub
まず繰り返しの部分ですが、【For s = 1 To Range("A1").End(xlDown).Row】と入力していますが、Range("A1").End(xlDown).Rowの部分は10でも正解です。
以前セルの範囲選択と可変式選択で説明したEnd(xlDown).Rowを使うことで可変式の範囲選択にする事ができますので、もし11行目にも入力していた場合、11行目も処理してくれるようになります。
このようにEnd(xlDown).Rowは自動で処理範囲を変えてくれるので大変便利です。
なのでぜひ覚えて活用してくださいね。

ではIf文の解説に戻って

If Cells(s, 1).Value >= 80 Then


これは「1列目1行目のセル=A1のセルの値が80以上の場合」という事になり、次の行の【Cells(s, 2).Value = "よく出来ました"】では「IfがTrue(真)の時、2列目1行目のセル=B1のセルによく出来ました」を入力する事になります。

ElseIf Cells(s, 1).Value >= 50 Then

上記は1つ目と同じで値が50に変わっただけになります。

Else


こちらは「上記2つの条件に当てはまらなかった=False(偽)の時」ということで、今回の場合、49以下の時という事になります。
このように最後の条件はElseのみの入力でFalse(偽)を取得する事で処理が出来るなら、コードが短くなりますので、Flase(偽)を活用すればいい時はElseだけの使用にして、コードを短くしてあげましょう。

For Each

では話を戻して【For Each】の解説に入りたいと思います。
まず、For Eachの基本動作として変数宣言したオブジェクト繰り返したい範囲のオブジェクトを代入しながら繰り返しの範囲が終わるまで繰り返すという動作をします。

このFor Eachに関しては、このブログの最終目標であるInternetExplorerの自動操作で確実に使うことになります。
上記の「」の中を理解しないとInternetExplorerの自動操作は出来ないので、確実に理解してください。
文字の色でグループ分けしてますので、解説の色とあわせながら進んでいくとわかりやすくなると思います。
では例題として下記のコードを見てください。

例)Sub オブジェクトの検索()
  Dim a As Object
  For Each a In Range("A:A")
    If a.Value = "ここだよ!" Then
          MsgBox "ここだよ!が入っているのは " & a.Address & " です。"
      End If
  Next
  End Sub

For Each a In Range("A:A")


For Eachの基本の形として【For Each オブジェクト変数 In 繰返し範囲のオブジェクト】という表記をします。
上記の例でいうと、オブジェクト変数の部分はDimを使って変数として宣言されている、aが当てはまります。
繰返し範囲のオブジェクトの部分は、「どのオブジェクトを繰り返したいか」になりますので、今回Range("A:A")の範囲を繰り返すようにしています。

If a.Value = "ここだよ!" Then


変数aのオブジェクトに入ってるセルの値が「ここだよ!」の場合」という事になります。

MsgBox "ここだよ!が入ってるのは " & a.Address & " です。"


こちらはオブジェクトaのセルの位置をメッセージボックスで表示しているだけになります。

上記のまとめとして、For Eachは「緑の文字の範囲を順番に、青の文字に入れて処理をしていく」という事になります。
For EachにIfを組み合わせる事で「aに代入されたオブジェクトが何々の時」という処理を実行できるのです。

実際に上記のコードを実行する場合は、A列の適当な位置に「ここだよ!」を入力してください。
その後、上記のコードを実行すると「ここだよ!」が入ってるセルの位置をメッセージボックスで表示します。
For Each
このFor Eachは理解するまでが難しいと思いますが、For Eachを使いこなせるようになる事でVBAの動作の幅が一気に広がりますので、頑張って覚えてくださいね。

最後に

では最後に練習問題、と言いたいところですが、今回は内容が難しいので上記の解説を少し応用して、「A列をB列に変えてみる」や「列ではなく、行で試してみる」などして徐々に感覚を掴んで欲しいと思います。

因みに、ここまでの3種類のステートメントをマスター出来た方へお知らせです。
実はたった3種類のステートメントしかマスターしてないのに
InternetExplorerの自動操作は出来てしまうんです。
もちろん他のステートメントもマスターする事で操作の幅はもっと広がりますが、まずはVBAを楽しいものとして捉えてもらう為にもIE自動操作ではちょっとしたマクロを作ってみたいと思います。
コピペではなく、自分で打ちながら指で覚えてくださいね。