For Next の使い方いろいろ
VBAの繰り返し処理としては、
For Next または Do Loop
この二つを最初に学んだのではないでしょうか。
特に使用頻度の高いFor Next を重点的に学んでいることと思いますが、
書き方、使い方は、いくつかのパターンがあります。
第16回.繰り返し処理(For Next)
A1セルからA10セルに、上から順に行数を入れるVBAです。
Sub sample1()
Dim i As Long
For i = 1 To 10
Cells(i, 1) = i
Next
End Sub
恐らく、多くの書籍・サイトで、最初にFor Nextを説明する時は、
Stepを省略して説明しているのではないでしょうか。
Stepをわざわざ書くのも面倒ですので、省略することが多くなります。
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
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
不規則な行数のみ処理したい場合にどうしたら良いかです。
以下では、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で判定しつつ処理するのが最も簡単でしょう。
カンマ区切りで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で書いてみます。
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 関連記事
第17回.繰り返し処理(Do Loop)
ForとIfのネストこそがVBAの要点
同じテーマ「マクロVBA技術解説」の記事
If条件式のいろいろな書き方:TrueとFalseの判定とは
VBAでの括弧()の使い方、括弧が必要な場合
VBAにおけるピリオドとカンマとスペースの使い方
変数とプロシージャーの命名について
文字列置換の基本と応用(Replace)
データクレンジングと名寄せ
ForとIfのネストこそがVBAの要点
For Next の使い方いろいろ
複数条件判定を行う時のコツ
ブール型(Boolean)のis変数・フラグについて
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.ブック・シートの選択(Select,Activate)|VBA入門
10.条件分岐(Select Case)|VBA入門
- ホーム
- マクロVBA応用編
- マクロVBA技術解説
- For Next の使い方いろいろ
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。