VBA技術解説
For Next の使い方いろいろ

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
最終更新日:2018-06-14

For Next の使い方いろいろ


VBAの繰り返し処理としては、
For Next または Do Loop
この二つを最初に学んだのではないでしょうか。


プログラムにおける繰り返し処理は、基本中の基本です。
特に使用頻度の高いFor Next を重点的に学んでいることと思いますが、
書き方、使い方は、いくつかのパターンがあります。

For NextとDo Loopの基本的な文法と使い方については、
第16回.繰り返し処理(For Next)
・For Next ステートメント ・For Next 例文 ・For Next をステップ イン実行で目で見て確認しましょう。 ・1行置きに処理する場合 ・Exit For ・For~Nextのネスト(入れ子) ・最後に一言
第17回.繰り返し処理(Do Loop)
・Do~Loopの構文 ・条件式 ・Do Loop 例文 ・Exit Do ・Do~Loopのネスト(入れ子) ・最後に一言
こちをご覧ください。

ここでは、For Nextの使い方を、いくつかのパターンで見てみましょう。


基本のStep 1

まずは普通にStepを省略して、Step 1での使い方です。
A1セルからA10セルに、上から順に行数を入れるVBAです。

Sub sample1()
  Dim i As Long
  For i = 1 To 10
    Cells(i, 1) = i
  Next
End Sub

恐らく、多くの書籍・サイトで、最初にFor Nextを説明する時は、
Stepを省略して説明しているのではないでしょうか。

ほとんどの場合がStep1なので、
Stepをわざわざ書くのも面倒ですので、省略することが多くなります。


1行置きのStep 2

続いて1行置きに処理する方法として、Step 2の使い方です。
A1セルからA10セルの、1,3,5,7,9行目に行数を入れるVBAです。



Sub sample2()
  Dim i As Long
  For i = 1 To 10 Step 2
    Cells(i, 1) = i
  Next
End Sub

カウンター変数を1ずつではなく、2ずつ増加させる書き方です。
もちろん、3ずつならStep 3、4ずつならStep 4になります。

必ず習得しなければならない書き方になりますが、
とはいえ、
実際に使う事は、そんなに多くはないと思われます。


下からStep -1

今度は下から処理する方法として、Step -1の使い方です。
A1セルからA10セルに、下から順に行数を入れるVBAです。

Sub sample3()
  Dim i As Long
  For i = 10 To 1 Step -1
    Cells(i, 1) = i
  Next
End Sub

逆順のループになります。
行や列を順に削除・挿入していくような処理や、
シートを削除・挿入していくような処理の場合は、
上方や前方から処理してしまうと上手くいきません。

削除・挿入した途端に、全体の位置関係がずれてしまう為です。
そこで、
後ろや下からから処理すると、
削除・挿入で影響を受けることが無いので、うまく処理することが出来ます。
練習問題14(行の挿入・削除の練習)
・マクロVBA練習問題 ・シンキングタイム ・マクロVBA練習問題回答へ
こちらで練習してみると良いでしょう。


不規則なStep

Stepを指定して一定の階差で処理する事が出来ますが、
不規則な行数のみ処理したい場合にどうしたら良いかです。
以下では、1,2,3,6,7,8行目に行数を入れます。

Sub sample4_1()
  Dim i As Long
  For i = 1 To 8
    Select Case i
      Case 1, 2, 3, 6, 7, 8
        Cells(i, 1) = i
    End Select
  Next
End Sub

Stepが決まらないので、困った、、、
というパターンです。
単純に、Step 1でFor Nextを書いて、
処理対象の数値を、Select Caseで判定しつつ処理するのが最も簡単でしょう。
・Select Caseステートメントの構文 ・Select Case の例文 ・Select Case の応用
Select CaseのCaseで、
カンマ区切りでOr条件になること知っていれば、これが最も簡単な方法となります。

ただし、対象数値を良く分析すると結構規則性があったりします。
上記の例で言えば、以下の方法でも書くことが出来ます。



Sub sample4_2()
  Dim i As Long
  For i = 1 To 8
    If i Mod 5 > 0 And _
      i Mod 5 <= 3 Then
      Cells(i, 1) = i
    End If
  Next
End Sub

1,2,3,6,7,8
これは、5で割った余りが1~3という事になります。
ですが、
上記のように1,2,3,6,7,8行目ならSelect Caseの方が良いと思います。
しかしこれが、
1,2,3,6,7,8,11,12,13,16,17,18,21,22,23…
このような場合は、
上記のようにその規則性を見つけ出して数式化する必要が出てきます。


Do Loop代わりの無限ループ

Do LoopをFor Nextで書き換えることが出来るかという事です。
普通にDo Loopを使えば良いのですが、あえてFor Nextで書いてみます。

Sub sample5_1()
  Dim i As Long
  For i = 1 To 10000000
    If i > 10 Then
      Exit For
    End If
    Cells(i, 1) = i
  Next
End Sub

For Next の終了値を、あり得ないほど大きな数値にしてしまいます。
つまりは、無限ループさせるのと同じようなことになります。
Do Loopだけなら無限ループしますので、それと同じ意味になります。
後はUntilやWhile条件を、Ifステートメントで判定し、
条件を満たした時点で、Exit Forでループを抜けます。
Do Loopの書き方として、
UntilとWhileは、互いが否定形になるだけの違いです。
Do UntilまたはWhileの場合は、Forの先頭でIf判定すれば同じになります。
Loop UntilまたはWhileの場合は、Nextの直前でIf判定すれば同じになります。

終了値に、とんでもない数値を指定するのがスマートじゃないと思うのなら、
(プログラムを書くのに、スマートである必要はないのですけど、、、)
以下のように、カウンター変数を無理矢理戻してしまう方法もあります。

Sub sample5_2()
  Dim i As Long
  Dim j As Long
  j = 1
  For i = 1 To 1
    If j > 10 Then
      Exit For
    End If
    Cells(j, 1) = j
    j = j + 1
    i = i - 1
  Next
End Sub

Nextステートメントで、カウンター変数がStepするので、
その前にStepで変化する分を戻してしまえば、カウンター変数は変化しないので無限にループします。
Do Loopを使う場面として、
最も良く使われるのが、Dir関数を使ってのファイル一覧の取得でしょう。

Sub sample5_3()
  Dim i As Long
  Dim sFile As String
  sFile = Dir("C:\*.*")
  i = 1
  Do While sFile <> ""
    Cells(i, 1) = sFile
    i = i + 1
    sFile = Dir()
  Loop
End Sub

このDo Loopを、For Nextで書き直したものが、以下になります。

Sub sample5_4()
  Dim i As Long
  Dim sFile As String
  sFile = Dir("C:\*.*")
  For i = 1 To 10000000
    If sFile = "" Then
      Exit For
    End If
    Cells(i, 1) = sFile
    sFile = Dir()
  Next
End Sub

Sub sample5_5()
  Dim i As Long
  Dim j As Long
  Dim sFile As String
  sFile = Dir("C:\*.*")
  j = 1
  For i = 1 To 1
    If sFile = "" Then
      Exit For
    End If
    Cells(j, 1) = sFile
    j = j + 1
    sFile = Dir()
    i = i - 1
  Next
End Sub

実践として使う事はないとは思いますが、
(普通に、Do Loopを使えば良いですし、Do Loopで書くものです。)

このような事が出来るという事の単なる紹介になってしまっていますが、
ここを理解できるという事は、For Nextの動作を十分に理解できたということになります。


For Next 関連記事

第16回.繰り返し処理(For Next)
・For Next ステートメント ・For Next 例文 ・For Next をステップ イン実行で目で見て確認しましょう。 ・1行置きに処理する場合 ・Exit For ・For~Nextのネスト(入れ子) ・最後に一言

第17回.繰り返し処理(Do Loop)
・Do~Loopの構文 ・条件式 ・Do Loop 例文 ・Exit Do ・Do~Loopのネスト(入れ子) ・最後に一言

ForとIfのネストこそがVBAの要点
・第1に考える事・・・大外の繰り返しを作成 ・第2に考える事・・・1支店だけを作成 ・第3に考える事・・・昨対比の判定 ・第4に考える事・・・3支店の繰り返し ・第5に考える事・・・3支店の繰り返しを全体の中に組み込む ・最後に考える事・・・最後の仕上げ ・目指すべきVBAの書き順・・・VBAが上達したら




同じテーマ「マクロVBA技術解説」の記事

論理積(And)論理和(Or)と真(True)偽(False)の判定
If条件式のいろいろな書き方:TrueとFalseの判定とは
VBAでの括弧()の使い方、括弧が必要な場合
VBAにおけるピリオドとカンマとスペースの使い方
変数とプロシージャーの命名について
文字列置換の基本と応用(Replace)
データクレンジングと名寄せ
ForとIfのネストこそがVBAの要点
For Next の使い方いろいろ
複数条件判定を行う時のコツ


新着記事NEW ・・・新着記事一覧を見る

TOROW関数(配列を横1行の配列にして返す)|エクセル入門(2022-10-31)
TOCOL関数(配列を縦1列の配列にして返す)|エクセル入門(2022-10-31)
CHOOSECOLS関数(配列から複数の指定された列を返す)|エクセル入門(2022-10-29)
CHOOSEROWS関数(配列から複数の指定された行を返す)|エクセル入門(2022-10-29)
WorksheetFunctionの効率的な使い方とスピル新関数の利用|VBA入門(2022-10-27)
VSTACK関数(配列を縦方向に順に追加・結合)|エクセル入門(2022-10-25)
HSTACK関数(配列を横方向に順に追加・結合)|エクセル入門(2022-10-25)
LAMBDA以降の新関数の問題と解説(配列操作関数編)|エクセル入門(2022-10-24)
LAMBDA以降の新関数の問題と解説(ヘルパー関数編)|エクセル入門(2022-10-24)
LAMBDA以降の新関数の問題集|エクセル入門(2022-10-24)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Excelショートカットキー一覧|Excelリファレンス
7.並べ替え(Sort)|VBA入門
8.マクロって何?VBAって何?|VBA入門
9.エクセルVBAでのシート指定方法|VBA技術解説
10.ExcelマクロVBAの基礎を学習する方法|エクセルの神髄




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ