Home » ExcelVBA Rangeオブジェクト » RangeへのFor Each~Nextを逆順に?

対象:Excel2010, Excel2013, Windows版Excel2016

「VBA excel range for each 逆順」
といった検索キーワードでのアクセスに気付きました。

Rangeオブジェクトに限らず、VBAのFor Each~Nextループの手軽さに気付いた方から
「For Each~Nextループを逆順に回すにはどうすればいいのでしょうか?」
というご質問をいただくことがあります。

残念ながらFor Each~Next文で、ループを逆方向に回すような指定はできません

Rangeオブジェクトでも、For Each~Next文で逆順に処理することはできません。For~Nextループを使いましょう。

増分値にマイナスの値を指定しましょう

拙著『いちばんやさしいExcel VBAの教本』のLesson 43「For~Next文の繰り返し条件を使いこなしましょう」で、

増分値にはマイナスの値を指定することもできます。この場合、カウンター変数は繰り返すたびに小さくなるので、最終値より初期値を大きな数値にする必要があります。

とお伝えしています。

Rangeオブジェクトに対して逆順にループ処理を行いたい場合も、増分値にマイナスの値を指定します。

zを逆順で書くようにループ処理するサンプルマクロ

A1:C2セルに対して、アルファベットの「z」を逆順に書くようにループ処理したい場合は、以下のSubプロシージャが参考になるでしょう。

Sub Rangeへのループを逆順に_zの逆順()
 Dim i As Long

 With Range("A1:C2")
  For i = .Count To 1 Step -1
   MsgBox .Item(i).Address(False, False)
  Next i
 End With
End Sub

上記のSubプロシージャを実行すると、
  C2 B2 A2 C1 B1 A1
の順でメッセージボックスにセルアドレスが表示されます。

mを逆順で書くようにループ処理するサンプルマクロ

A1:C2セルに対して、アルファベットの「m」を逆順で書くようにループ処理したい場合は、変数を2つ使った2重ループにして、それぞれの増分値をマイナス指定します。

Sub Rangeへのループを逆順に_mの逆順()
 Dim c As Long, r As Long

 With Range("A1:C2")
  For c = .Columns.Count To 1 Step -1
   For r = .Rows.Count To 1 Step -1
    MsgBox .Item(r, c).Address(False, False)
   Next r
  Next c
 End With
End Sub

上記のSubプロシージャを実行すると、
  C2 C1 B2 B1 A2 A1
の順でセルアドレスがメッセージボックスに表示されます。

[スポンサードリンク]

Home » ExcelVBA Rangeオブジェクト » RangeへのFor Each~Nextを逆順に?

「ExcelVBA Rangeオブジェクト」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.