Excelマクロ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)
VBAのForNextは同じ処理を繰り返し行うためのVBA構文です。VBAで繰り返し処理をする方法は何通りかありますが最も頻繁に使われていて最も簡単便利でありまず最初に覚えるべき繰り返し処理のVBA構文がForNextになります。ForNextは繰り返し処理をするためのステートメントで同じ処理を複数回繰り返したい場合に使います
第17回.繰り返し処理(Do Loop)
繰り返し処理として、前回はFor~Nextをやりました、今回はDo~Loopです。For~Nextに比べると使用頻度は落ちますが、必ず覚える必要があるものです。For~Nextは、繰り返す回数をあらかじめ指定するものでしたが、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練習問題 ・区分がDの行を削除して下さい。・区分がIの行の前に新規行を挿入して下さい。練習問題用のExcelファイル こちらからダウンロードできます。zipはこちらです。AB ※上記表の全体を選択しコピー(Ctrl+C)の後エクセルのシートのA1セルに貼り付け(Ctrl+V)してください。
こちらで練習してみると良いでしょう。


不規則な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で判定しつつ処理するのが最も簡単でしょう。
前回のElseIf以外の、多肢条件分岐の別の書き方があります。それがSelectCaseになります。むしろElseIfより、このSelectCaseの方が、より多肢条件分岐に適していると言えます。SelectCaseは、多肢条件分岐に特化したステートメントになります。
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)
VBAのForNextは同じ処理を繰り返し行うためのVBA構文です。VBAで繰り返し処理をする方法は何通りかありますが最も頻繁に使われていて最も簡単便利でありまず最初に覚えるべき繰り返し処理のVBA構文がForNextになります。ForNextは繰り返し処理をするためのステートメントで同じ処理を複数回繰り返したい場合に使います

第17回.繰り返し処理(Do Loop)
繰り返し処理として、前回はFor~Nextをやりました、今回はDo~Loopです。For~Nextに比べると使用頻度は落ちますが、必ず覚える必要があるものです。For~Nextは、繰り返す回数をあらかじめ指定するものでしたが、Do~Loopは、繰り返す回数ではなく、繰り返す条件を指定するものです。

ForとIfのネストこそがVBAの要点
VBA習得で最も肝心なものは、For文とIf文をしっかりと覚えることです、そして、For文とIf文をネストさせるプログラミング技術の習得です。For~Nextステートメントは、繰り返し処理 If~EndIfステートメントは、条件分岐 つまり、条件により分岐しつつ繰り返し処理を行う。




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

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


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

Byte配列と文字コード関数について|VBA技術解説(8月20日)
PowerQueryの強力な機能をVBAから利用する方法|VBA技術解説(8月4日)
練習問題31(セル結合を解除して値を埋める)|VBA練習問題(7月30日)
練習問題30(マトリックス→リスト形式)|VBA練習問題(7月25日)
Applicationを省略できるApplicationのメソッド・プロパティ一覧|VBA技術解説(7月22日)
コレクション(Collection)の並べ替え(Sort)に対応するクラス|VBA技術解説(7月20日)
CSVの読み込み方法(ジャグ配列)|VBAサンプル集(7月15日)
その他のExcel機能(グループ化、重複の削除、オートフィル等)|VBA入門(7月14日)
オートフィルタ退避回復クラスを複数シート対応させるVBAクラス|VBA技術解説(7月6日)
オートフィルタを退避回復するVBAクラス|VBA技術解説(7月6日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数とデータ型(Dim)|ExcelマクロVBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.ひらがな⇔カタカナの変換|エクセル基本操作
10.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説



  • >
  • >
  • >
  • For Next の使い方いろいろ

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


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




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