エクセルVBAで空白があっても止まらないループを作ってみた

コンピューターのお仕事
スポンサーリンク

日々増え続ける顧客データなど、最終行が定まっていないデータをループさせる場合はuntilやwhileを使って空白行までをループさせることが多いと思います。

この場合データの途中に空白があった場合にループ処理がそこで止まってしまうので、最終行までたどりつけません。

入力規則などで空白を禁止できない場合致命的な欠陥になるので、たとえ途中で空白があった場合でもすべてのデータにループ範囲を適用できる方法を考えてみました。

この記事は次のような方を対象としています。

  • エクセルを使ってデータ管理をしている
  • 多量のデータ処理に時間がかかって悩んでいる
  • VBAを使って業務の効率化をしたいと思っている
スポンサーリンク

最終行を取得してforでループを行う【結論】

空白行があっても止まらないループは次の2つの組み合わせで実現できます。

  • エクセルに入力されたデータの最終行を取得する
  • データの最終行までをforを使ってループさせる

データの最終行を取得する

エクセルに入力されたデータの最終行を調べるには次のメゾッドを利用します。

Cells(Rows.Count, 1).End(xlUp).Row

エクセルに入力したデータの最終行を取得するのは、いろいろな応用が利くので覚えておいて損はありません。

このメゾッドはA列の入力を見て最終行を判断しますので、そもそもA列に入力がない場合は数字の部分を変更して調整してください。

  • B列の場合 … Cells(Rows.Count, 2).End(xlUp).Row
  • C列の場合 … Cells(Rows.Count, 3).End(xlUp).Row
  • D列の場合 … Cells(Rows.Count, 4).End(xlUp).Row

ループに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

サンプルコードの動作条件

掲載しているサンプルは、顧客データの年齢の平均を計算して結果をイミディエイトに表示するマクロです。

サンプルコードは次のようなルールで動作します。

  • 年齢はF列に記入
  • 年齢に文字が含まれるとその行はスキップ(無視)
  • 2行目からのデータをループして計算

動作確認用の顧客リストも一緒に掲載しておきますが、このエクセルシートにはマクロをつけていませんので、上記掲載のサンプルコードをVBAエディタに貼り付けてください。

サンプルコードの確認手順

サンプルコードは次の手順で確認してください。

  1. 動作確認用_顧客リストサンプル.xlsをダウンロードして開く
  2. 「編集を有効にする(E)」をクリック
  3. Alt + F11ボタンでVBAエディタを起動
  4. プロジェクトウインドウからSheet1(Sheet1)をダブルクリック
  5. 開いたメインウインドウにサンプルコードを貼り付ける
  6. イミディエイトウインドウからサンプルコードを呼び出す
  7. イミディエイトウインドウで実行結果を確認

イミディエイトウインドウやメインウインドウの開き方がわからないという方は下記の記事が参考になるかもしれません。

まとめ

本来forを使ったループは範囲が定まっていないループには使いませんが、最終行を他のメゾッドで取得してしまえば問題ありません。

この方法ならループ範囲に空白のセルがあっても途中で止まることがありませんので、入力規則が定まっていない場合や設定できない場合に今回ご紹介したテクニックを使ってみてはいかがでしょうか?

Excel VBAを勉強中の方におすすめの書籍

コメント

タイトルとURLをコピーしました