【VBA】For Next Stepを使いこなす極意!作業時間を50%削減する実践ガイド
一覧表の1行目から100行目までの必要な情報だけを取り出して別シートに転記したい
こんな処理を自動化したい!という方が多いのではないでしょうか。
私が勤めていた電気設備を保守管理する会社では、
5000行以上ある電気設備台帳から「不良」となった情報を別シートにコピペする
という作業がありました。
フィルター機能を使う、条件付き書式を使う、など試行錯誤しながら作業していたのですが、
編集ミスが発生しやり直しになる!作業にめちゃくちゃ時間がかかる!
という問題が発生。
もっと楽に、効率よく処理できないかな。。。
こんな悩みを解決するために導入すたのが、
繰り返し処理を行う『エクセルVBAのFor Next Step』
です。
『For Next Step』を使えば
今まで手作業で何時間もかけていた作業を、たった数分で終わらせる
ことが可能になります。
「でもVBAって難しそう…」と思われる方が多いですがそんな心配は無用です。
プログラミング未経験だった私は、
エクセル業務の効率をなんとかアップさせたい!
という思いだけでVBAスキルを独学で習得しました。
そんな私が「初心者でも理解できるFor Next Stepの使い方」を解説します。
この記事では、
『For Next Step』の基本的な設定方法から実践的なコードサンプルまでを、
具体例を交えながら丁寧に説明していきます。
これを読めば、毎日2時間以上分かかっていた繰り返し作業が30分以内で完了するようになるはずです。
この記事で紹介しているような『VBA開発に役立つ情報を配信するメルマガ』をスタートさせました。
「VBA学習用の教材」「エクセル作業自動化のアイデア」を無料でゲットすることができます。
併せてチェックしてみてください。
目次
【VBA】For Next Stepの基本概念と重要性
エクセル作業で同じ作業を何度も繰り返すのは、とても大変な作業ですよね。
たとえば、
100個のセルに同じ計算をしたり、たくさんのデータをチェックする作業は、
手作業では時間がかかって編集ミスも起きやすいものです。
こんな問題を解決してくれるのが、『エクセルVBAのFor Next Step』という機能です。
『For Next Step』が必要な理由と基本構文
『For Next Step』は、
決まった回数の繰り返し作業を自動化する
という機能です。
「1から10まで数える」という単純な作業でも手作業なら10回カウントする必要がありますが、
『For Next Step』を使えば一瞬で処理することができます。
基本的な書き方は、
For 変数 = 開始値 To 終了値 Step 増加値
という形です。
実際のコードを見てみましょう。
以下は「A列の1行目から10行目まで、セルに順番に数字を入れていく」という簡単な例です。
For i = 1 To 10
Cells(i, 1).Value = i
Next i
たった3行のコードで10回分の作業が完了します。
手作業での編集と比べると、作業時間が大幅に短縮できることがお分かりいただけるのではないでしょうか。
『For Next Step』で実現できる3つの主要機能
『For Next Step』には、大きく分けて3つの重要な機能があります。
1つ目は「カウント機能」です。
決まった回数だけ処理を繰り返すことができます。
2つ目は「ステップ値の調整機能」です。
「2つずつ増やす」「3つずつ減らす」といった細かい制御が可能です。
3つ目は「範囲指定機能」です。
開始値と終了値を自由に設定でき、必要な範囲だけを効率的に処理できます。
従来の繰り返し処理と比較したメリット・デメリット
従来の繰り返し処理(Do While文やDo Until文など)と比べて、『For Next Step』には大きな特徴があります。
最大のメリットは「繰り返し回数が明確な場合の処理のしやすさ」です。
「100回繰り返す」という場合、『For Next Step』なら1行で書けますが、他の方法だと複数行必要になることが多い。
また、Step値を使って増加量を自由に設定できる点も大きな利点です。
「2行おきに処理する」「逆順で処理する」といった複雑な制御も、1行追加するだけで実現できます。
デメリットは「途中で処理を中断する場合の柔軟性が低い」という点です。
「特定の条件が見つかったら即座に終了する」といった処理は、Do While文の方が向いています。
『For Next Step』のメリット・デメリットを理解して最大限効果を発揮できる使い方をしましょう。
『For Next Step』の実践テクニック
ここからは、
『For Next Step』を導入するための実践向きテクニック
をご紹介します。
『For Next Step』と併せて「処理速度を向上させるVBA」や「エラーを回避するVBA」を設定すれば、
作業効率を更にアップさせることが可能です。
Step値の最適な設定方法と処理速度の関係
Step値は処理速度に大きく影響する重要な要素です。
たとえば、
1000行のデータを2行おきにチェックしたい場合、Step値を2に設定することで処理回数を半分に減らすことができます。
具体的なコード例がこちら
従来の方法(遅いバージョン)
For i = 1 To 1000
If i Mod 2 = 0 Then
Cells(i, 1).Value = i
End If
Next i
Step値を使用した方法(速いバージョン)
For i = 2 To 1000 Step 2
Cells(i, 1).Value = i
Next i
処理結果は同じでも、処理速度には明確な違いがうまれます。
実務ではこのような小さな工夫の積み重ねが重要です。
ネストされたForNext文の効率的な使い方
ForNext文を入れ子(ネスト)にする場合、処理順序を工夫することで大幅な速度向上が期待できます。
たとえば、
一覧表の縦横のセルを処理する場合、行と列のどちらを外側のループにするかで処理速度が変わります。
具体的なコード例がこちら
For i = 1 To 最終行
For j = 1 To 最終列
Cells(i, j).Value = i * j
Next j
Next i
行を外側のループにすることで、エクセルへのメモリアクセスが効率化され処理速度が向上します。
エラー処理を組み込んだ安全な実装方法
高速な処理も大切ですが、安全性も同じくらい重要です。
エラーが発生すると、せっかくの自動化が台無しになってしまいます。
エラー発生を防ぐための具体的なコード例がこちら
On Error GoTo ErrorHandler
Application.ScreenUpdating = False
For i = 1 To 最終行
If Cells(i, 1).Value = "" Then Exit For
'処理内容
Next i
Application.ScreenUpdating = True
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました:" & Err.Description
Application.ScreenUpdating = True
「画面更新を一時停止する」「空白セルでループを終了する」「エラー発生時の処理を定義する」など
これらの対策により安定した動作が期待できます。
デバッグの効率化テクニック
プログラムが思った通りに動かない時は、デバッグ機能を活用しましょう。
特に『For Next Step』では、変数の値をウォッチウィンドウで監視すると効果的です。
また、以下のようなデバッグ用のコードを入れることで、処理の進行状況が分かりやすくなります。
For i = 1 To 大きな数
If i Mod 100 = 0 Then
Debug.Print "現在の処理位置:" & i
End If
'処理内容
Next i
このように、100回ごとに現在位置を確認することでプログラムの動作状況を把握しやすくなり、
「何回目の繰り返しで問題が発生したのか」の把握できるようになります。
以上のテクニックを組み合わせることで、安全かつ高速なVBAプログラムを作成することが可能です。
『For Next Step』の業務別活用事例
実際の業務では、『For Next Step』をどのように使えば効果的なのでしょうか。
ここでは、
多くの企業で日常的に行われている業務を事例として具体的な活用方法
をご紹介します。
Excel帳票作成の自動化事例と実装手順
毎月の売上レポートや日次の業務報告書など、
定型フォーマットの帳票作成作業へ『For Next Step』を導入する
事例をご紹介します。
以下のコードは、複数の店舗データから自動的に帳票を作成するサンプルVBAです。
Sub 帳票作成()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("データ")
'最終行を取得
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
'店舗ごとの売上を集計
For i = 2 To lastRow
'店舗名が変わるまでデータを集計
Dim 売上合計 As Long
売上合計 = 0
For j = i To lastRow
If ws.Cells(i, 1).Value = ws.Cells(j, 1).Value Then
売上合計 = 売上合計 + ws.Cells(j, 2).Value
End If
Next j
'帳票シートに結果を出力
ThisWorkbook.Sheets("帳票").Cells(i, 1).Value = ws.Cells(i, 1).Value
ThisWorkbook.Sheets("帳票").Cells(i, 2).Value = 売上合計
Next i
End Sub
このコードを使えば、
数千行のデータでも数秒で帳票作成が完成
します。
データ集計・分析作業の効率化事例
大量のデータを分析する作業への『For Next Step』の導入事例をご紹介します。
特定の条件に合致するデータを抽出したり、カテゴリごとに集計したりする作業を自動化可能です。
具体的なコード例がこちら
Sub データ分析()
Application.ScreenUpdating = False
Dim 対象シート As Worksheet
Set 対象シート = ThisWorkbook.Sheets("売上データ")
'商品カテゴリごとの集計
For i = 2 To 最終行
Dim カテゴリ名 As String
カテゴリ名 = 対象シート.Cells(i, "C").Value
'同じカテゴリの売上を合算
If カテゴリ別集計.Exists(カテゴリ名) Then
カテゴリ別集計(カテゴリ名) = カテゴリ別集計(カテゴリ名) + _
対象シート.Cells(i, "D").Value
Else
カテゴリ別集計.Add カテゴリ名, 対象シート.Cells(i, "D").Value
End If
Next i
Application.ScreenUpdating = True
End Sub
『For Next Step』と関数IFを組み合わせることで、
条件に概要する情報の検索
が可能になります。
マクロ処理の高速化テクニック
処理速度を高速に保ちつつ、『For Next Step』を設定する事例をご紹介します。
具体的なコード例がこちら
Sub 高速処理()
'画面更新の停止
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
'配列にデータを読み込んで処理
Dim データ配列()
データ配列 = Range("A1:D1000").Value
For i = 1 To UBound(データ配列)
'配列内で処理を完結させる
データ配列(i, 2) = データ配列(i, 1) * 1.1
Next i
'結果をまとめて書き戻し
Range("E1:E1000").Value = データ配列
'画面更新の再開
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
配列と組み合わせることで処理速度を落とすことなく大量のデータを操作することが可能です。
関連記事「VBA処理を最適化手法で劇的に効率アップする方法」では
VBAの処理を高速化する方法を解説
しています。
併せてチェックしてみてください。
実務でよくあるトラブルと解決方法
『For Next Step』を使用する際によく遭遇するトラブルとその解決方法をご紹介します。
たとえば、
処理が途中で止まってしまう場合は、以下のようなエラーハンドリングを追加することで解決できます。
Sub エラー対策付き処理()
On Error Resume Next
For i = 1 To 最終行
If Err.Number <> 0 Then
Debug.Print "エラー発生:" & i & "行目"
Err.Clear
Continue For
End If
'通常の処理
Next i
On Error GoTo 0
End Sub
処理が遅い場合は、
画面更新の停止や配列の活用、必要最小限の範囲だけを処理対象とする
などの対策が効果的です。
以上のような実践的なテクニックを活用することで、日常業務の効率を大幅に向上させることができます。
For Next Stepの応用的な使い方
基本的な使い方を理解したら、次は一歩進んだテクニックにチャレンジしてみてください。
より複雑な業務にも対応できる応用的な『For Next Step』の使い方をご紹介します。
これらのテクニックを身につけて、さらなる効率化を目指しましょう。
多次元配列での効果的な実装方法
大量のデータを扱う場合、セルの直接操作は処理速度が遅くなりがちです。
そこで、多次元配列を活用することで、処理速度を大幅に向上させることができます。
Sub 多次元配列処理()
'二次元配列の宣言と初期化
Dim データ配列() As Variant
データ配列 = Range("A1:D100").Value
'処理用の配列を別に用意
Dim 結果配列() As Variant
ReDim 結果配列(1 To UBound(データ配列, 1), 1 To UBound(データ配列, 2))
'二重ループで配列を処理
For i = 1 To UBound(データ配列, 1)
For j = 1 To UBound(データ配列, 2)
'何らかの計算処理
結果配列(i, j) = データ配列(i, j) * 1.5
Next j
Next i
'結果をまとめてシートに書き戻し
Range("F1").Resize(UBound(結果配列, 1), UBound(結果配列, 2)).Value = 結果配列
End Sub
この方法を使うと、1万行のデータでも数秒で処理が完了します。
セルを直接操作する方法と比べて、処理速度が10倍以上速くなることも珍しくありません。
条件分岐と組み合わせた高度な制御
『For Next Step』は条件分岐(If文)と組み合わせることで、より柔軟な処理が可能になります。
以下は、データの内容に応じて異なる処理を行うサンプルVBAです。
Sub 条件付き処理()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("データ")
For i = 2 To 最終行
Select Case ws.Cells(i, "C").Value
Case "高優先"
'優先度の高い処理
For j = 1 To 5
ws.Cells(i, j).Interior.Color = RGB(255, 200, 200)
Next j
Case "中優先"
'優先度が中程度の処理
For j = 1 To 5
ws.Cells(i, j).Interior.Color = RGB(255, 255, 200)
Next j
Case Else
'通常の処理
For j = 1 To 5
ws.Cells(i, j).Interior.Color = RGB(255, 255, 255)
Next j
End Select
Next i
End Sub
柔軟な処理が可能となるので、
数種類の編集パターンがあるエクセル業務への導入
がおすすめです。
他のループ文との使い分けポイント
VBAには、ForNext以外にもDo WhileやDo Untilなどのループ文があります。
これらを適切に使い分けることで、より効率的なVBA開発が可能です。
Sub ループ文の使い分け()
'ForNext:回数が決まっている場合
For i = 1 To 10
Cells(i, 1).Value = i
Next i
'条件が満たされるまで続ける場合はDo While
Dim j As Long
j = 1
Do While Cells(j, 1).Value <> ""
'空白セルが見つかるまで処理
j = j + 1
Loop
'条件が満たされるまで続ける場合はDo Until
Dim k As Long
k = 1
Do Until Cells(k, 1).Value = ""
'空白セルが見つかるまで処理
k = k + 1
Loop
End Sub
回数が決まっている場合は、『For Next Step』
条件が満たされるまで繰り返す場合は、『Do While』や『Do Until』
を使いましょう。
『For Next Step』の使用場面がこちら
- 処理回数が事前に分かっている場合
- 等間隔で値を変化させたい場合
- 配列やコレクションを順番に処理する場合
『Do While』や『Do Until』の使用場面がこちら
- 終了条件が複雑な場合
- 処理回数が動的に変わる場合
- 特定の条件が満たされるまで継続する必要がある場合
回数が決まっている場合は、『For Next Step』。それ以外は『Do While』や『Do Until』
というイメージです。
このように、状況に応じて適切なループ文を選択することで、より効率的で分かりやすいプログラムを作ることができます。
まとめ:『For Next Step』完全マスターへのロードマップ
ここまで『For Next Step』について様々な角度から解説してきました。
最後に、実践的な活用に向けたステップアップの方法と業務効率化のためのポイントをまとめていきましょう。
初心者の方から上級者の方まで、それぞれのレベルに合わせた学習方法をご紹介します。
スキルレベル別の学習ステップ
VBAのスキルレベルは、大きく分けて「初級」「中級」「上級」の3段階があります。
『For Next Step』についても、段階的に学習を進めることがおすすめです。
私なりのレベル別『For Next Step』VBAがこちら
'【初級レベル】基本的なループ処理
Sub 初級レベル()
'単純な繰り返し処理
For i = 1 To 10
Cells(i, 1).Value = i
Next i
End Sub
'【中級レベル】条件分岐との組み合わせ
Sub 中級レベル()
For i = 1 To 100
If Cells(i, 1).Value > 50 Then
Cells(i, 2).Value = "合格"
Else
Cells(i, 2).Value = "不合格"
End If
Next i
End Sub
'【上級レベル】複数のループと配列の組み合わせ
Sub 上級レベル()
Dim データ配列() As Variant
データ配列 = Range("A1:D100").Value
For i = 1 To UBound(データ配列, 1)
For j = 1 To UBound(データ配列, 2)
'高度な処理
Next j
Next i
End Sub
配列との組み合わせはかなり難易度が高いですよね。
実践で使える15のサンプルコード
実際の業務でよく使われるサンプルコードをまとめてみました。
必要に応じてカスタマイズして使ってみてください。
1.データの一括クリア
Sub データクリア()
For i = 1 To 100
Rows(i).ClearContents
Next i
End Sub
2.条件付き書式の一括適用
'2. 条件付き書式の一括適用
Sub 条件付き書式()
For i = 1 To 最終行
If Cells(i, 1).Value < 0 Then
Cells(i, 1).Interior.Color = RGB(255, 200, 200)
End If
Next i
End Sub
3.データの検証と修正
'3. データの検証と修正
Sub データ検証()
For i = 1 To 最終行
'エラー値のチェックと修正
If IsError(Cells(i, 1).Value) Then
Cells(i, 1).Value = 0
End If
Next i
End Sub
サンプルコードをアレンジして扱える!という方は、関連記事「VBA基本コード15選」を参考にしてみてください。
『For Next Step』の他に、実務で役立つコードが解説されていて、
記事の後半では15種類のVBAが設定されたエクセルファイルをダウンロードすることができます。
⇒ ⇒ ⇒ VBA基本コードのダウンロードはこちら
さらなる業務効率化のためのVBAテクニック
最後に、『For Next Step』を使って業務を効率化するための実践的なテクニックをご紹介します。
「不要な空白セルの削除」や「全角、半角を揃える」を一瞬で処理するサンプルコード
Sub データ前処理()
'画面更新停止で高速化
Application.ScreenUpdating = False
For i = 1 To 最終行
'不要な空白の削除
Cells(i, 1).Value = Trim(Cells(i, 1).Value)
'全角数字を半角に変換
Cells(i, 2).Value = StrConv(Cells(i, 2).Value, vbNarrow)
Next i
Application.ScreenUpdating = True
End Sub
複数シートにかけれたフィルターをまとめて解除するサンプルコード
Sub 定期業務()
'日次処理の自動化
For i = 1 To シート数
With Worksheets(i)
.AutoFilterMode = False '既存のフィルターを解除
.Range("A1").AutoFilter '新しいフィルターを適用
End With
Next i
End Sub
これらのテクニックを組み合わせることで、日常業務の大幅な効率化が期待できます。
思考の伴わないルーティーン作業は自動化してしまいしょう。
作業効率をアップさせるVBA開発のポイントがこちら
- 処理の目的を明確にする
- エラーへの対策を忘れない
- 可読性の高いコードを心がける
これらのポイントを抑えることで
半永久的に使える効率化VBAの作成
が可能になります。
この記事を読んで、
「VBAやってみたい!」「いろんなエクセル業務の自動化に挑戦したい!!」
と感じてくれた方はエクセルVBAの情報を定期的に配信しているメルマガへの登録を検討してみてください。
エクセル業務で苦しんだ私の経験を元に、
実務で役立つVBA情報をお届けしています。
この記事が、あなたの業務効率化への第一歩となることを願っています。
ディスカッション
コメント一覧
まだ、コメントがありません