VBAの勉強を始めてみた

タイトルの通りVBAの勉強を始めました。効率化と暇つぶしを兼ねています。VBA以外の話題もあるよ(笑)

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までをコピペしてマクロを使用できます。使用の際は自己責任でお願いいたします。

 

これをステップインで順番に見ていきたいと思います。

まず、セル範囲を選択します。(コレクション=選択されている箇所の複数セル)

f:id:kouten0430:20170517144257j:plain

 

そしてステップインを途中まで進めます。

f:id:kouten0430:20170517144357j:plain

 

矢印のように、左上のセルから右へ1セルずつ処理されていきます。
そして右下のセルの処理が終わったら、For Each Nextを抜けます。(コレクションのすべての要素(この例ではセル)について繰り返しが終わった)

f:id:kouten0430:20170517152139j:plain

 

すなわち、Selection(1)※左上のセル ~ Selection(18)※右下のセル までの1つずつのセルが順番にオブジェクト変数に格納され、処理を実行し、繰り返しを終了したということです。

 

説明が下手くそですいません。


ところで、Eachってどういう意味なんでしょうか?ググってみたところ、
それぞれの、一つ一つの、めいめいの
って意味なんですね・・・腑に落ちました。