日々増え続ける顧客データなど、最終行が定まっていないデータをループさせる場合はuntilやwhileを使って空白行までをループさせることが多いと思います。
この場合データの途中に空白があった場合にループ処理がそこで止まってしまうので、最終行までたどりつけません。
入力規則などで空白を禁止できない場合致命的な欠陥になるので、たとえ途中で空白があった場合でもすべてのデータにループ範囲を適用できる方法を考えてみました。
最終行を取得してforでループを行う【結論】
空白行があっても止まらないループは次の2つの組み合わせで実現できます。
データの最終行を取得する
エクセルに入力されたデータの最終行を調べるには次のメゾッドを利用します。
Cells(Rows.Count, 1).End(xlUp).Row
エクセルに入力したデータの最終行を取得するのは、いろいろな応用が利くので覚えておいて損はありません。
このメゾッドはA列の入力を見て最終行を判断しますので、そもそもA列に入力がない場合は数字の部分を変更して調整してください。
ループにforを使う
forの構文にデータの最終行を指定すれば、途中に空白があっても止まらないループの完成です。
for i = 2 To Cells(Rows.Count, 2).End(xlUp).Row
ループさせたい処理を記入
Next i
空白があっても止まらないループ【サンプルコード】
Private Sub loop_sample()
Dim i As Integer
Dim age_calc As Integer
Dim loop_count As Integer
Dim av_age As Integer
Debug.Print Cells(Rows.Count, 1).End(xlUp).Row & "行目までをループしました。" 'イミディエイトに出力
'変数の初期化-----------------------
age_calc = 0 '年齢の合計
loop_count = 0 'ループ回数
av_age = 0 '平均年齢
'ループさせて年齢の平均を計算する
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
If Len(Cells(i, 6)) > 0 Then '空白行はカウントしない
If IsNumeric(Cells(i, 6).Value) = True Then '数値以外はカウントしない
loop_count = loop_count + 1
age_calc = age_calc + Cells(i, 6)
End If
End If
Next i
av_age = age_calc / loop_count '年齢の平均を計算
Debug.Print loop_count; "人の平均年齢は" & av_age & "歳です" 'イミディエイトに出力
End Sub
サンプルコードの動作条件
掲載しているサンプルは、顧客データの年齢の平均を計算して結果をイミディエイトに表示するマクロです。
サンプルコードは次のようなルールで動作します。
動作確認用の顧客リストも一緒に掲載しておきますが、このエクセルシートにはマクロをつけていませんので、上記掲載のサンプルコードをVBAエディタに貼り付けてください。
サンプルコードの確認手順
サンプルコードは次の手順で確認してください。
イミディエイトウインドウやメインウインドウの開き方がわからないという方は下記の記事が参考になるかもしれません。
まとめ
本来forを使ったループは範囲が定まっていないループには使いませんが、最終行を他のメゾッドで取得してしまえば問題ありません。
この方法ならループ範囲に空白のセルがあっても途中で止まることがありませんので、入力規則が定まっていない場合や設定できない場合に今回ご紹介したテクニックを使ってみてはいかがでしょうか?
コメント