同一処理を何度も繰り返すことを「ループ」と呼びます。ループには、指定した回数だけ処理を繰り返す方法や、ある特定の状況が発生するまで処理を繰り返す方法などがありますが、For....Nextステートメントは、あらかじめ処理回数を指定する基本的なループ方法です。
For Nextステートメントには繰返し処理をカウントする為の「カウント変数」が必要になります。
カウンタ変数は、初めに初期値が格納され、Nextまで処理が実行されると最初に戻り、処理を繰り返します。
最終値を超えると処理が終了します。
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
※Stepを使用すると指定した値でカウンタ変数を増減できます。Stepを省略した場合には、自動的に1ずつ値が加算されます。
<例1>メッセージが5回表示されるように繰返し処理を行うプログラムの作成
| 「ForNext01」プログラム | 解 説 |
| Sub fornext01() Dim i As Integer For i = 1 To 5 MsgBox "メッセージを" & i & "回表示する" Next End Sub |
Sub ForNext01() 変数 i を宣言 For 変数[ i ]が1〜5になるまで処理を繰返す。 メッセージを表示 Next End Sub ●&の前後は半角スペースを手動で入力します。 |
<例2>カウンタ変数の増減値を正の値「3」で指定する場合
| 「Fornext02」プログラム | 解 説 |
| Sub fornest02() Dim i As Integer For i = 1 To 15 Step 3 ActiveCell.Value = i ActiveCell.Offset(0, 1).Select Next End Sub |
Sub ForNext02() 変数 i を宣言 For 変数[ i ]が1〜15になるまで3ずつ増加して処理を繰返す。 変数「i」の値を選択されたセルに書き込みます。 選択されたセルから1つ右(0,1)の列に移動します。 Next End Sub |
<例4>カウンタ変数の増減値を負の値「-1」で、指定し、4枚目以降のシートを削除するプログラムの作成。
| 「Fornext03」プログラム | 解 説 |
| Sub Fornext03() Dim i As Integer For i = Worksheets.Count To 4 Step -1 Worksheets(i).Delete Next End Sub |
Sub Fornext03() 変数 i を宣言 For ワークシートの数を数えて、1づつ減らして4になるまで繰返す。 変数 i のワークシートを削除する。 Next End Sub |
500点の場合は、「満点です。」400点以上の場合は、「合格です。」300点以上の場合は、「標準の点数です。」300点未満の場合は、「落第です。もう1年頑張りましょう。」と表示するプログラムの作成
| 「Fornext03」プログラム | 解 説 |
| Sub test03() Dim i As Integer Dim a, b, c, d As String a = "満点です。" b = "合格です。" c = "標準の点数です。" d = "落第です。もう1年がんばりましょう。" Range("C17").Select For i = 1 To 4 If ActiveCell.Offset(0, -1).Value = 500 Then ActiveCell.Value = a ElseIf ActiveCell.Offset(0, -1).Value >= 400 Then ActiveCell.Value = b ElseIf ActiveCell.Offset(0, -1).Value >= 300 Then ActiveCell.Value = c Else ActiveCell.Value = d End If ActiveCell.Offset(1, 0).Select Next End Sub |
Sub test03() 変数 i を宣言 変数、a,b,c,d を宣言 「満点です。」を変数「a」に代入 「合格です。」を変数「b」に代入 「標準の点数です。」を変数「c」に代入 「落第です。もう1年がんばりましょう。」を変数「d」に代入 セル「C17」を選択します。 For 変数 [i]を1〜4になるまで処理を繰り返します。 If アクティブセルの左側を選択し、その値が500だったら メッセージ[a]を表示します。 ElseIf 400点以上だったら メッセージ[b]を表示します。 ElseIf 300点以上だったら メッセージ[c]を表示します。 Else それ以外の点数だったら メッセージ[d]を表示します。 End If アクティブセルを下に移動します。 Next カウンタ変数iが、4になるまで繰り返します。 End Sub |
あるコレクションの全てのオブジェクトに対して繰り返しの処理を行いたい時は、「For Each 〜Next」文を使います。
※コレクション(例:Workbooks、Worksheets、Range、namesなど)
For Each<変数>in<コレクション>
<処理>
Next
この時、コレクションの代わりにセル範囲(例:Range("A1:D5"))を指定することも出来ます。
下のサンプルでは、コレクション内(Range(”A1:D5”))の全てのオブジェクト(C)を参照して「15」が見つかったら、セルを赤で塗りつぶす(Interior.ColorIndex = 3)サンプルです。
| Sub test06() Dim C As Range For Each C In Range("A1:D5") If C=15 Then C.Interior.ColorIndex = 3 End If Next C End Sub |
変数Cは、以下の順番でセルを参照し、 「15」があれば、セルを赤で振りつぶします。 処理の順番は、下のとうりです。 A1、B1、C1、D1 A2、B2、C2、D2 A3、B3、C3、D3 A4、B4、C4、D4 A5、B5、C5、D5 |
■ COUNT プロパティ
オブジェクトの数を数えるプロパティです。
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
構文
オブジェクト. Count
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
<例3>変数[ i ]にブック内のシート数を格納するステートメント
ワークシートの枚数を取得します。 「i = Worksheet . Count」
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
Sub sht01()
Dim i As Integer
i = Worksheets.Count
MsgBox "シート数は、" & i & " 枚です。"
End Sub
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

手順
@新しい請求書を作成する。
1.作成する請求書の年月情報を取得する。
2.シート総数をカウントする。
3.●同名シートのチェックを行う
4.「請求書」シートをコピーする。
5.シート名を変更する。
| Sub 請求書作成() | |
| Sub 請求書作成() Dim myyear As Integer Dim mymonth As Integer Dim mywsname As String Dim mywscount As Integer With Worksheets("請求書原本") myyear = .Range("G3").Value mymonth = .Range("H3").Value End With mywsname = myyear & "-" & Format(mymonth, "00") mywscount = Worksheets.Count Worksheets("請求書原本").Copy after:=Worksheets(mywscount) With Worksheets(mywscount + 1) .Name = mywsname .Range("E3").Value = myyear & "年" & mymonth & "月" End With Worksheets("請求書原本").Select End Sub |
Sub 請求書作成() 変数を宣言する。 ワークシート「請求書原本」の 「G3」の値を「myyear」も代入し 「H3」の値を「mymonth」に代入する。 新しいシート名を「mywsname」に代入する。 新しいシート名は、「4桁の西暦-2桁の月」という形式で、表示するようにする。Format(mymonth, "00") で、月の表示形式を「00」に設定します。 ワークシートの数を数えて(Count)、変数「mywscount」に代入する。 「ワークシート(mywscount)」というシートの後ろに「請求書原本」というシートをコピーします。 コピーしたシートの体裁を整えます。 ワークシートの枚数に1を加え ワークシートの名前を変数「mywsname」にし 「E3」に「年・月」と表示する。 「請求書原本」を選択する。 |
| Sub 請求書作成02() Dim myyear As Integer Dim mymonth As Integer Dim mywsname As String Dim mywscount As Integer Dim i As Integer With Worksheets("請求書原本") myyear = .Range("G3").Value mymonth = .Range("H3").Value End With mywsname = myyear & "-" & Format(mymonth, "00") mywscount = Worksheets.Count For i = 1 To mywscount If mywsname = Worksheets(i).Name Then MsgBox "同名シートがあります。" Worksheets(i).Activate Exit Sub End If Next Worksheets("請求書原本").Copy after:=Worksheets(mywscount) With Worksheets(mywscount + 1) .Name = mywsname .Range("E3").Value = myyear & "年" & mymonth & "月" End With Worksheets("請求書原本").Select End Sub |
カウンター変数「i」を宣言する。 1枚目のシートからシート総数になるまで、繰り返し処理を行う。 同名シートがある場合は、メッセージボックスを表示し 同名シートを選択する。 |
| For........Next による方法 | For Each.................Nextによる方法 | エラートラップによる方法 |
| Sub wscheck1() Dim i As Integer for i = 1 to worksheets.Count If Worksheets(i).Name = "test" Then MsgBox "「test」シートが存在します。" Exit Sub End If Next MsgBox "「test」シートが存在しません。" End Sub |
Sub wscheck2() Dim myWS As Worksheet For Each myWS In Worksheets If myWS.name = "test" Then MsgBox "「test」シートが存在します。" Set myWS = Nothing Exit Sub End If Next MsgBox "「test」シートが存在しません。" End Sub |
Sub wscheck3() Dim myWS As Worksheet On Error GoTo ErrHdl Set myWS = Worksheets("test") MsgBox "「test」シートが存在します。" Set myWS = Nothing ErrHdl: MsgBox "「test」シートが存在しません。" End Sub |
| for〜nextで、1からシート数になるまで繰り返し処理を繰り返します。 | For Each myWS InWorksheets ・・・・・・・Worksheetsコレクションの中で、順番にワークシートを取り上げ、変数myWSで、扱えるようにしています。 Set myWS = Nothing・・・・オブジェクト変数をクリアする処置 |
On Error GoTo ErrHdl・・・・・エラーが発生した場合には、「ErrHdl」にジャンプします。 Set myWS = Worksheets("test")・・・・ myWSというワークシート変数で、「test」というワークシートを扱えるようにSetステートメントで代入しています。 |