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)
第17回.繰り返し処理(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(行の挿入・削除の練習)
こちらで練習してみると良いでしょう。


不規則な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の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 関連記事





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

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

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

数値範囲で表検索するVLOOKUP近似一致|エクセル関数超技(10月5日)
エクセルVBAでのシート指定方法|VBA技術解説(9月8日)
VBAのクラスとは(Class,Property,Get,Let,Set)|VBA技術解説(8月28日)
VBAこれだけは覚えておきたい必須基本例文10|VBA技術解説(8月22日)
VBAの省略可能な記述について|ExcelマクロVBA技術解説(8月11日)
複数条件判定を行う時のコツ|ExcelマクロVBA技術解説(7月11日)
For Next の使い方いろいろ|VBA技術解説(6月14日)
VBAを定型文で覚えよう|ExcelマクロVBA技術解説(3月26日)
VBAスタンダード試験対策まとめ|MOS VBAエキスパート対策(3月16日)
ユーザーフォームとメニューの操作|MOS VBAエキスパート対策(3月14日)

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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|ExcelマクロVBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数とデータ型(Dim)|ExcelマクロVBA入門
5.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
6.マクロって何?VBAって何?|ExcelマクロVBA入門
7.定数と型宣言文字(Const)|ExcelマクロVBA入門
8.繰り返し処理(For Next)|ExcelマクロVBA入門
9.とにかく書いて見よう(Sub,End Sub)|VBA入門
10.ひらがな⇔カタカナの変換|エクセル基本操作



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

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


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





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

    本文下部へ

    ↑ PAGE TOP