処理を繰返す (For 〜 Next)  Fom143

同一処理を何度も繰り返すことを「ループ」と呼びます。ループには、指定した回数だけ処理を繰り返す方法や、ある特定の状況が発生するまで処理を繰り返す方法などがありますが、For....Nextステートメントは、あらかじめ処理回数を指定する基本的なループ方法です。

For Nextステートメントには繰返し処理をカウントする為の「カウント変数」が必要になります。
カウンタ変数は、初めに初期値が格納され、Nextまで処理が実行されると最初に戻り、処理を繰り返します。
最終値を超えると処理が終了します。

構文

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

For  カウンタ変数 = 初期値 To 最終値 [Step  増減値]
     処理
Next

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

※Stepを使用すると指定した値でカウンタ変数を増減できます。Stepを省略した場合には、自動的に1ずつ値が加算されます。

プロシージャの確認

<例1>メッセージが5回表示されるように繰返し処理を行うプログラムの作成

メッセージを1回表示する

「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
●&の前後は半角スペースを手動で入力します。

増減値を正の値にした For 〜 Next ステートメント  Fom147

プロシージャの確認

<例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

増減値を負の値にした For 〜 Next ステートメント  Fom148

プロシージャの確認

<例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

練習問題01

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 〜in〜Next

あるコレクションの全てのオブジェクトに対して繰り返しの処理を行いたい時は、「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 プロパティ
   オブジェクトの数を数えるプロパティです。
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
構文
オブジェクト. 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ステートメントで代入しています。