For Each Next文について
今回は、For Each Next文について勉強してみます。
実はこれ、自分の中であまり理解できていないステートメントです・・・。
For Each Nextとは何を繰り返すのか?
For Each オブジェクト変数 In コレクション
処理
Next
オブジェクト変数 In コレクションの行では、コレクションの要素のうちの一つが変数に格納される・・・具体的にいうとコレクションの要素がコレクション(1)~コレクション(9)まであったとすると、まずコレクション(1)が変数に格納されることになります。
次の行で処理を実行してから、Next(次の要素)に行きます。
再びオブジェクト変数 In コレクションで、次の要素のコレクション(2)が変数に格納され、次の行で処理を実行してNext・・・
これがコレクション(9)まで続く訳です。
では、そもそもコレクションとは何ぞや?
書籍によると、同じ種類のオブジェクトの集まりをコレクションと言うそうです。
Workbooks
Worksheets
複数のセル(Range("A1:C3")やSelection・・・等々、複数のセルを表現するものはたくさんある)
などです。
For Each オブジェクト変数 In Worksheets
であれば、オブジェクト変数への要素の格納がWorksheets(1)~Worksheets(n)まで順番に繰り返されることになります。
では複数セルの場合は、どのように繰り返されるのでしょうか?
前回、投稿した「選択範囲の金額を百万円単位にする」をFor Each Next文で作ってみたいと思います。
***************************************
Sub 選択範囲の金額を百万円単位にする()
Dim myRange As Range
For Each myRange In Selection
If myRange.Value <> 0 And myRange.Value <> "" And _
TypeName(myRange.Value) <> "String" And TypeName(myRange.Value) <> "Date" Then
'セルの値が0,空白,文字列,日付のいづれかの場合は処理をしない
myRange.Value = Application.RoundUp(myRange.Value / 1000000, 2) '小数点第三位以下切り上げ
End If
Next myRange
End Sub
***************************************
※SubからEnd Subまでをコピペしてマクロを使用できます。使用の際は自己責任でお願いいたします。
これをステップインで順番に見ていきたいと思います。
まず、セル範囲を選択します。(コレクション=選択されている箇所の複数セル)
そしてステップインを途中まで進めます。
矢印のように、左上のセルから右へ1セルずつ処理されていきます。
そして右下のセルの処理が終わったら、For Each Nextを抜けます。(コレクションのすべての要素(この例ではセル)について繰り返しが終わった)
すなわち、Selection(1)※左上のセル ~ Selection(18)※右下のセル までの1つずつのセルが順番にオブジェクト変数に格納され、処理を実行し、繰り返しを終了したということです。
説明が下手くそですいません。
ところで、Eachってどういう意味なんでしょうか?ググってみたところ、
それぞれの、一つ一つの、めいめいの
って意味なんですね・・・腑に落ちました。