ループ処理と呼ばれるものをご存知でしょうか?プログラミングを行う上では必須の処理方法で、VBAにも同じく用意されている機能です。
今回は、そのループ処理を行うにあたって使用する、For Nextステートメントというものについて解説をしていきたいと思います。
基本的な使い方から、応用ポイントまで詳しく説明していくので、ぜひ最後まで読んでみてくださいね。
VBAのFor Nextステートメントとは
For Nextステートメントとは、いわゆる「ループ処理」と呼ばれる、繰り返し処理を行う場合に使用するものです。カウンターとして指定した変数に順に数が代入され、その数が所定の数値に到達するまで繰り返し同じ処理を行います。
For Nextステートメントを使用する際は、以下のように記述します。
【基本構文】
For カウンター変数名 = 開始数値 To 終了数値
処理
Next カウンター変数名
例えば、開始数値に1を指定し、終了数値に5を指定した場合、変数には1から順に2, 3, 4…と数が代入されていきます。
そして、ステートメント内に記述した処理を実行→変数の値が1つ繰り上がるといった流れを繰り返し、変数の値が5に到達した段階で処理を実行し終わると、ループが完了し次の行へと移行します。これはVBAに限らず、プログラミングで必ず用意される主要な機能の1つです。
For Nextステートメントを使う上で覚えておくべきポイント
For Nextステートメントでループ処理をするにあたって、覚えておくべきポイントがいくつかあります。
まずは基本的な使い方から順に見ていきましょう。
For Nextステートメントの基本的な使い方
まず初めに、For Nextステートメントの基本的な使い方について解説していきます。
基本構文は先ほど紹介したので、ここではサンプルコードをもとに具体例を見ていきましょう。
今回は、ループ処理を使う例としてよくある「配列を順番に処理する」ケースについて説明します。
【サンプルコード】
Sub sampleForNext()
Dim arr() As Variant
arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
Dim str As String
For num = 0 To 9
str = str & arr(num) & " "
Next num
MsgBox str
End Sub
【実行結果】
変数に代入されているカウント数を使用して、配列の要素に対して「インデックスの番号が小さい順」にアクセスしています。
配列内の要素を取得するにはインデックス番号を指定する必要がありますが、配列のインデックス番号は基本的には0から始まります。そのため、ステートメントの開始数値も0を指定しています。
配列についてもっと詳しく知りたい方はこちらの記事もご覧ください。
指定するインデックス番号以外は全て同じ処理で記述することができるので、ループ時のカウンターを使用して自動で数値を変動させることで、通常は何行にもわたって記述しなければいけない処理を1つにまとめています。これが、For Nextステートメントを使用する最大のメリットになります。
Stepステートメントでカウントの増減を変える
ループごとのカウンターの増減数は通常「+1」ですが、引数のStepに任意の数値を指定することで、増減数を変更することができます。その場合は、以下のように記述します。
【基本構文】
For カウンター変数名 = 開始数値 To 終了数値 Step 増減数
処理
Next カウンター変数名
先ほどのサンプルコードをもとに、増減数を変更した場合の違いについて確認してみましょう。
【サンプルコード】
Sub sampleStep()
Dim arr() As Variant
arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
Dim str As String
For num = 0 To 9 Step 2
str = str & arr(num) & " "
Next num
MsgBox str
End Sub
【実行結果】
増減数を指定しなかった場合は1つずつ順に要素が取得され、1から10までの全ての数字が表示されていましたが、増減数を2に変更したことで内容が2つおきの表示に変わっています。
このように、引数を使用することで増減数を任意の数値に変更することができます。
カウンターをデクリメント(減少)させて逆順にループさせる
先ほど紹介したStep引数には、正の整数だけでなく、マイナスの値を指定することもできます。
Stepにマイナスの値を指定して逆順でループする手法は、セルや配列の要素に対して後ろから順にアクセスしたい時などに便利です。
【サンプルコード】
Sub sampleStep2()
Dim arr() As Variant
arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
Dim str As String
For num = 9 To 0 Step -1
str = str & arr(num) & " "
Next num
MsgBox str
End Sub
【実行結果】
引数で-1を指定することで、アクセスする順番を逆順に変更しています。この際、配列内の後ろの要素から取得していくため、開始数値と終了数値を反転させる必要があることに注意が必要です。
正数の時と同じく、-2以下の数値を指定することで、要素を飛ばし飛ばしに処理することもできます。
ループから抜け出すには?
基本的に、指定の数値に到達するまで繰り返され続けるループ処理ですが、特定の条件を満たした場合に処理を中断したいケースが中にはあるかと思います。その場合は、Exit Forステートメントを使用することで、ループ処理から抜け出すことができます。
【サンプルコード】
Sub sampleExitFor()
Dim name As String
For num = 3 To 7
If Cells(num, 3).Value = "" Then
name = Cells(num, 2).Value
Exit For
End If
Next num
MsgBox name & "さんの出欠記録がありません"
End Sub
【実行結果】
このサンプルコードでは、出欠部分のセルの値をループ処理で順に確認し、空白状態で何も記載がされていなかった場合にループを抜けるよう記述しています。
If文を使用することで、セルの値が空白か否かを判断することができ、Trueだった場合の処理内にExit Forステートメントを記述することで、セルが空白だった場合にループを抜け出すことができるようになります。
セルが空白かどうかの判定については、今回はセル内の値が文字列であることを前提に「””(空文字)」と比較して判断しています。判定方法については、値が直接記載されているものなのか、数式の結果として空白状態になっているのかなどで方法が変わる場合もあるので、注意が必要です。
ループをスキップして処理を省略するには?
ループ処理中に特定の条件を満たした時、処理を全て中断するのではなく、その回だけスキップしたいケースもあります。
他の言語(C, Java, JavaScriptなど)の場合はcontinueを使用して即座に次の処理に移るのが一般的ですが、残念ながらVBAには存在しないため、代わりにGoToステートメントと組み合わせて使用します。
【サンプルコード】
Sub sampleGoTo()
Dim numStudent As Integer
For numCount = 3 To 7
If Cells(numCount, 3) = "欠席" Then
GoTo SkipToNext
End If
numStudent = numStudent + 1
SkipToNext:
Next numCount
MsgBox "本日の出席人数は" & numStudent & "人です"
End Sub
【実行結果】
このサンプルコードでは、セルに入力されている出欠の記録を確認し、出席と記載されている人数が何人いるかを数えています。
If文でセルに入力されている文字列を判定し、欠席だった場合はGoToステートメントを使用して、SkipToNextラベルへと処理をスキップしています。
ループの中でループを回すには?
For Nextステートメントの中にさらにFor Nextステートメントを入れ子にして記述することで、ループの中でループを回して処理することも可能です。
例えば、先ほどのコードではセルの行のみをループで処理していましたが、この方法を使うことで行と列の両方を同時に処理することが可能になります。
【サンプルコード】
Sub sampleForNext2()
Dim str As String
For row = 3 To 7
For column = 2 To 3
str = str & Cells(row, column).Value & " "
Next column
str = str & vbCrLf
Next row
MsgBox str
End Sub
【実行結果】
ステートメント内でさらにループ処理を行った場合、ループ1回目→ループ内のもう一つのループ処理を全て実行→ループ2回目の順で繰り返されていきます。
初めのうちはカウント数がどのように変わっていくのかが頭では想像しづらいと思うので、処理した回数を各ループごとにセルに書き出していく処理など、様々なコードを実際に試しながら動きに慣れていくといいでしょう。
For Eachステートメントで配列をループ処理する
ループ処理を行う方法として、For Nextステートメントの他に、For Eachステートメントというものがあります。
For Eachステートメントは、配列やコレクション内の各要素に対して処理を行う場合に使用する方法です。
【基本構文】
For Each 変数名 In 配列やコレクション名
処理
Next 変数名
指定した変数に各要素が順に代入され、内包されている要素の数だけループ処理が行われます。
For Nextステートメントの場合、変数に代入されるのは数値のみのため、処理時に配列やコレクション内の要素に別途アクセスする必要がありますが、For Eachステートメントでは要素そのものが代入されるので、そのまま変数を使って処理を行うことができます。
使用するケースによっては、For Eachステートメントを使って記述する方がコードを簡潔にまとめられることがあるので、状況に合わせて使い分けていきましょう。
【サンプルコード】
Sub sampleForEach()
Dim sampleDic As Object
Set sampleDic = CreateObject("Scripting.Dictionary")
sampleDic.Add "国語", 80
sampleDic.Add "数学", 75
sampleDic.Add "英語", 85
Dim str As String
For Each dicKey In sampleDic
str = str & dicKey & " : " & sampleDic.Item(dicKey) & vbCrLf
Next dicKey
MsgBox str
End Sub
【実行結果】
このサンプルコードでは、Dictionaryオブジェクト内の各要素にアクセスするために、For Eachステートメントを使用しています。
Dictionaryオブジェクトは、辞書や連想配列とも呼ばれるもので、インデックス番号ではなく任意のキーによって各要素が管理されています。キーには文字列なども指定できてしまうため、For Nextステートメントで処理をする場合、カウンター数をそのまま配列のキーとして使用することができません。
For Eachステートメントの場合、変数にDictionaryの各キーが代入されるので、要素にアクセスするための処理を簡潔に済ませることができます。
通常の配列より構造が複雑なDictionaryオブジェクトに対して処理を繰り返したい場合、For Eachステートメントは非常に有効な手段となります。
Dictionaryオブジェクトについてはこちらの記事で解説をしています。
まとめ
ここまで、For Nextステートメントを使用したループ処理について解説してきました。
冒頭でも説明しましたが、ループ処理はプログラミングを行う上で必須の方法です。
特にFor…Nextステートメントが必要になるケースはかなり多いと思いますので、内容をしっかりと理解して、スムーズに使いこなせるようになりましょう!
関連記事
- VBAとは
- Excelで覚えておくべき17の基本関数と目的別逆引き一覧
- オートフィルターの設定・解除方法
- メッセージボックスの設定方法
- セルの値を取得・上書きするValueプロパティの使い方を解説
- 【Excel VBA】Functionの使い方を解説(宣言・引数、戻り値の指定、応用法)
- 【VBA入門】配列まとめ(宣言・初期化、反復処理、コピー、結合)
VBAの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、VBAに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。