みなさん、こんにちは。今回はExcelマクロVBA入門の6回目です。
前回は変数について紹介しました。前回の記事はこちら
今回は繰り返し処理と最終行数の取得について紹介します。
学習用Excelファイルのダウンロードはこちらから↓
繰り返し処理とは
Excelでのデータ処理において、繰り返し処理を行う場面はたくさんあると思います。例えば・・
- 1000行分のデータがあり、1行ずつ合計を出していく。
- 1000行分のデータがあり、ある数値が条件を満たしているかすべて確認する。
- 全シートの特定のセルのデータを集計する。
- 全ブックの特定のシートの特定のセルを集計する。
もちろん、これらの処理は関数を使っても可能ですが、日々更新されていくデータであれば(例えば、日々行数が増えていく、シートが増えていくなど)、増えた行数分だけ手動で関数をコピーして対応していくと思います。
それらを全て自動化できるということです。
ここまでの記事と、更にこの記事を読んでいただければ、そういった自動化を自分自身で行うことが可能になります。
For~Nextステートメント
For~Nextステートメントは、指定した回数だけ操作を繰り返すことができます。
開始値と終了値を指定します。Nextで変数に1が加算されます。
For~Nextステートメント(例)
下記のコードでメッセージボックスに1~5までを表示します。
Dim i As Long '変数iをを宣言します。
For i = 1 To 5 '変数iに開始値「1」と終了値「5」を設定します。
MsgBox i & "回" '変数iに1が入ります。
Next i 'Nextで変数に1が加算されます。
※変数iが5になるまで「For~Next」がループします。
Sub 繰り返し例題()
Dim i As Long
For i = 1 To 5
MsgBox i & "回"
Next i
End Sub
DoUntil~Loopステートメント
Do Until~Loopステートメントは指定した条件を満たすまで操作を繰り返します。
先程のFor~Nextステートメントは開始値と終了値が決まっていました。
Do Until~Loopステートメントは、繰り返す回数が決まっていない処理で、その代わりに条件を満たすまで操作を繰り返します。
Do Until~Loopステートメント(例)
下記のコードでメッセージボックスに1~5までを表示します。
Dim i As Long '変数iをを宣言します。
i = 1 '変数iに1を代入
Do Until i = 6 '変数iが6になるまで繰り返す
MsgBox i & "回" 'メッセージボックスを表示
i = i + 1 '変数iに1を加算
Loop
Sub 繰り返し例題_2()
Dim i As Long
i = 1
Do Until i = 6
MsgBox i & "回"
i = i + 1
Loop
End Sub
i = i+1
i=i+1は、変数を加算する時に使われる定番の計算式です。
iに1を加算して、また更に先ほど加算されたiに1が加算されて・・・と雪だるま式に変数iが加算されていく式です。
DoWhile~Loopステートメント
Do While~Loopステートメントは指定した条件を満たす間は操作を繰り返します。
先程のDo Until~Loopステートメントは指定した条件を満たすまででした。
Do While~Loopステートメントは、繰り返す回数が決まっていない処理で、その代わりに条件を満たす間は操作を繰り返します。
Do While~Loopステートメント(例)
下記のコードでメッセージボックスに1~5までを表示します。
Dim i As Long '変数iを宣言します。
i = 1 '変数iに1を代入
Do While i < 6 '変数iが6未満の間は繰り返す
MsgBox i & "回" 'メッセージボックスを表示
i = i + 1 '変数iに1を加算
Loop
Sub 繰り返し例題_3()
Dim i As Long
i = 1
Do While i < 6
MsgBox i & "回"
i = i + 1
Loop
End Sub
演習1
レジュメ:「9.演習」シート使用
それぞれの表の合計フィールド(黄色の塗りつぶし部分)に「数量×単価」の値を入れていきます。
9-1はForNextステートメント、9-2はDoUntilステートメントを使います。
9-1演習問題( For Nextステートメント)
Sub 繰り返し_9_1()
Dim i As Long
For i = 8 To 14
Cells(i, 6) = Cells(i, 3) * Cells(i, 5)
Next
End Sub
Dim i As Long '変数iを宣言
For i = 8 To 14 '変数iに開始値「8」と終了値「14」を設定します。
Cells(i, 6) = Cells(i, 3) * Cells(i, 5) '変数iが式に入ります。
Next 'Nextで変数に1が加算されます。
9-2演習問題( Do Untilステートメント)
Sub 繰り返し_9_2()
Dim i As Long
i = 8
Do Until Cells(i, 3) = ""
Cells(i, 13) = Cells(i, 10) * Cells(i, 12)
i = i + 1
Loop
End Sub
Dim i As Long '変数iを宣言
i = 8 '変数iに8を代入
Do Until Cells(i, 8) = "" '「セルHのi」が空欄になるまで繰り返す
Cells(i, 13) = Cells(i, 10) * Cells(i, 12) '変数iが式に入ります。
i = i + 1 '変数iに1を加算
Loop
最終行の取得
上記の繰り返し処理については、最終行が明確に設定されています。
しかし、日々データが増えていき処理したい行が増えていく場合は、最終行が変わっていきます。
そこで最終行が何行目なのか?を探してくれるコードが必要になります。
それが下記のコードです。
Cells(Rows.Count,1).End(xlUp).Row
上記コードで、Cells(Rows.Count,1)は1列目のワークシートの最終行を表しています。
つまりCells(1048576,1)です。(Excel2003なら65536です)
.End(xlUp).Rowはその最終行(1048576行)からデータがある行まで上に移動した行数という意味になります。
キーボード操作であれば、ワークシートの最終行(1048576行)から「Ctrl+十字キー「↑」」でデータのあるセルに移動する操作です。.Rowなのでそのアクティブセルになる行数という意味になります。
因みにセルの2列目の最終行を取得したい場合は、Cells(Rows.Count,2).End(xlUp).Rowです。
演習2
レジュメ:「10.最終行の取得」シート使用
Sub 最終行の自動取得()
Dim i As Long
For i = 13 To Cells(Rows.Count, 1).End(xlUp).Row
Cells(i, 6) = Cells(i, 3) * Cells(i, 5)
Next
End Sub
Dim i As Long '変数iを宣言
For i = 13 To Cells(Rows.Count, 1).End(xlUp).Row '変数iに開始値「13」と終了値「1列目の最終行の行番号」を設定します。
Cells(i, 6) = Cells(i, 3) * Cells(i, 5) '変数iが式に入ります。
Next
まとめ
今回は繰り返し処理と最終行の取得について紹介しました。入門講座もいよいよ終盤です!
次回はIF Thenステートメントについて、紹介します。お楽しみに!!
コメント