VBAでForと関数Ifを組み合わせて使用する方法をご紹介!繰り返し処理の作業効率がアップ

 

期限が過ぎたらセルを赤色に塗りつぶす!数値から判定結果を自動出力する!

 

こんな処理をエクセルVBAを使って自動化する方法をご紹介します。

 

本記事では、For NextループとIF関数を組み合わせた自動化テクニックをわかりやすく解説。

基本的な使い方や実務で使える具体的なサンプルコード、処理速度を向上させるテクニック技まで、段階的に学べる内容となっています。

 

Left Caption

ガッツポーズの人

「無限ループが怖い」「大量データの処理が遅い」という悩みも、本記事の内容で解決可能

 

VBA初心者の方でも実践できる具体例を多数用意しましたので、ぜひ最後までご覧ください。

 

広告

For Next と IF関数の基本的な使い方

 

大量のデータ処理の効率をアップさせるには、「For Next文」と「IF関数」の活用が絶対に欠かせません。

 

この2つを組み合わせることで、条件に応じた繰り返し処理を簡単に実装できます。

 

基本さえ理解すればVBA初心者でもすぐエクセル業務に応用できるテクニックなので使い方をマスターしてしまいましょう。

 

そもそもVBAってどうやって始めるの?コードはどこに書くの?

このような疑問をお持ちの方はまず、関連記事「初心者でも安心!エクセルVBAの作り方」を参考にしてください。

 

 

図や簡単なサンプルコードを使ってVBAの始め方を解説しています。

 

 

IF関数の基本構文と使用例

関数IFの基本的な構造はこちら

If 条件 Then
処理1
Else
処理2
EndIf

 

「もし条件ならば処理1、条件ではないなら条件2」という意味になります。

条件をもっと増やしたいときは以下のようになります。

 

If 条件1 Then
処理1
ElseIf 条件2 Then
処理2
Else 条件3 Then
処理3
Else
処理4
EndIf

 

「もし条件1ならば処理1、条件2ならば処理2、条件3ならば処理3、これら以外ならば処理4」という意味になります。

 

Left Caption

ガッツポーズの人

記載したプログラムを上から順番に処理をしていく!という特徴を抑えておきましょう。

 

「もし○○なら△△を実行する」という処理を行うサンプルコードがこちら

Sub CheckValue()
If Range("A1").Value >= 100 Then
MsgBox "値は100以上です"
Else
MsgBox "値は100未満です"
End If
End Sub

 

A1セルの値が100なら「値は100以上です」というメッセージを表示し、それ以外なら「値は100未満です」というメッセージを表示する

という意味です。

 

上記サンプルコードをModule1に入力して使います。

こんな感じ

VBAコードをModule1への入力を示したイラスト

 

実行するとメッセージボックスが表示されます。

 

For Nextループの基本構文と動作の仕組み

For Next文は指定した回数だけ処理を繰り返すための構文です。

 

サンプル事例として、

2の倍数をA列の1行目から10行目まで表示する

という処理をVBAで表現してみます。

 

サンプルコードはこちら

Sub ProcessRows()
Dim i As Long
For i = 1 To 10
Cells(i, 1).Value = i * 2
Next i
End Sub

 

実行結果がこちら

ForNextコードの実行結果を示したイラスト

 

Left Caption

ガッツポーズの人

大量のデータをいっきに処理できる

 

For NextとIF関数の基本的な組み合わせ事例

For NextとIF関数の基本的な組み合わせ方法をサンプル事例を使ってご紹介します。

 

サンプル事例として、

A列の1行目から10行目までに入力された数値が正の数の場合B列に「正の数」と表示し、負の数の場合B列に「0以下」と表示する

という処理をVBAで表現してみます。

 

サンプルコードがこちら

Sub CombineForAndIf()
Dim i As Long
For i = 1 To 10
If Cells(i, 1).Value > 0 Then
Cells(i, 2).Value = "正の数"
Else
Cells(i, 2).Value = "0以下"
End If
Next i
End Sub

 

実行結果がこちら

ForNextと関数IFの組み合わせVBAの実行結果を示したイラスト

 

A列で0以下の数値が入力されている場合、B列に「0以下」というテキストが入力されます。

 

Left Caption

ガッツポーズの人

大量の数値の判別作業に使える

 

For Next + IF関数による実践的な自動化例

 

VBAによる自動化では、For NextとIF関数の組み合わせが非常に重要です。

 

この2つの構文を使いこなすことで、

複雑な条件分岐をしつつ大量のデータを処理する

ことが可能にあります。

 

エクセルの特定範囲を条件判定しながら処理する方法

For NextとIF関数を使えば、

特定の範囲を対象にセルの値に応じて異なる処理を行う

ことができます。

 

サンプル事例として、

A列の値を確認しながらB列に結果を出力する

という処理をVBAで表現してみます。

 

A列の値を確認しながらB列に結果を出力するVBAの概要を示したイラスト

 

A列の点数を判定して結果をB列に出力します。

 

 

サンプルコードがこちら

Sub ProcessRange()
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
Dim i As Long
For i = 2 To lastRow
If Cells(i, 1).Value >= 80 Then
Cells(i, 2).Value = "合格"
ElseIf Cells(i, 1).Value >= 60 Then
Cells(i, 2).Value = "再試験"
Else
Cells(i, 2).Value = "不合格"
End If
Next i
End Sub

 

3行目のコードは、1列目の最終行を変数lastRowに格納するという意味です。

 

このVBAを使えばA列に入力される情報の行数が変動しても自動的に対応。

 

Left Caption

ガッツポーズの人

めっちゃ便利です。

 

関連記事「【VBA】カウント関数の使い方」では最終行を取得するやり方を詳しく解説しています。

 

 

行や列を追加することが多いという方は是非チェックしてみてください。

 

実行結果がこちら

A列の値を確認しながらB列に結果を出力するVBAの結果を示したイラスト

 

点数が80以上なら合格、60以上80未満なら再試験、60未満なら不合格

という結果になります。

 

配列の要素を条件分岐しながら処理する方法

配列を使用することで、処理速度を大幅に向上させることができます。

 

大量のデータを扱う場合は配列を活用して

処理時間の短縮、エラー発生の防止

に努めましょう。

 

サンプル事例として、

A列の金額に消費税10%を加算した金額をB列に出力する

という処理をVBAで表現してみます。

 

配列を使ったVBAの概要を示したイラスト

 

A列に入力された数値を1.1倍した数値をB列に出力します。

 

配列を使ったサンプルコードがこちら

Sub ProcessArray()
Dim myArray() As Variant
Dim i As Long, lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
myArray = Range("A2:A" & lastRow).Value
For i = LBound(myArray) To UBound(myArray)
If myArray(i, 1) > 0 Then
myArray(i, 1) = myArray(i, 1) * 1.1
End If
Next i
Range("B2:B" & lastRow).Value = myArray
End Sub

 

6行目のコードは、配列で指定した最初の数値から配列で指定した最後の数値まで繰り返すという意味です。

 

実行結果がこちら

配列を使ったVBAの結果を示したイラスト

 

Left Caption

ガッツポーズの人

数千個、数万個のデータを処理するなら配列の活用が絶対におすすめ

 

データの抽出と集計を自動化する実装例

エクセル業務では、

特定の条件に合うデータを抽出し集計する作業

が頻繁に発生しますよね。

 

このような処理もFor NextとIF関数を組み合わせることで効率的に実装できます。

 

よく求められるサンプル事例がこちら

判定結果によって背景色を変化させ集計するVBAの概要を示したイラスト

 

A列の数値から判定をする → 判定結果から背景色を変更する → A判定の項目の数値を集計する

という内容です。

 

この処理を自動化するサンプルコードがこちら

Sub SummarizeData()
Dim i As Long, sum As Long
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
sum = 0
For i = 2 To lastRow
If Cells(i, 1).Value >= 100 And Cells(i, 2).Value = "A" Then
sum = sum + Cells(i, 1).Value
Cells(i, 3).Interior.Color = RGB(255, 255, 0)
End If
Next i
Range("D2").Value = sum
End Sub

 

8行目のコードは、点数が100以上でA判定の数値を変数sumにどんどん加算していく。

12行目のコードは、集計値が格納された変数sumをD2セルに表示する。

という意味です。

 

実行結果がこちら

判定結果によって背景色を変化させ集計するVBAの結果を示したイラスト

 

Left Caption

ガッツポーズの人

アレンジすればいろんなエクセル業務に応用可能

 

よくあるエラーと対処方法

 

VBAの作成では、

エラーが発生してコード作成が思うように進まない!

なんてことがよく発生します。

 

効率的にVBAを作成するためには、

よく発生するエラーを理解し、適切な対処方法を知っておくこと

が重要です。

 

ここからはVBA初心者がよく遭遇するエラー発生を防ぐためのポイントをご紹介していきます。

 

無限ループを防ぐためのポイント

For Nextを使ったVBAでは、

無限ループ処理になってしまうエラー

がよく発生します。

 

このエラーを防止するためには、

抜け出し条件を設定し、カウンターを適切に管理すること

が重要です。

 

安全なループ処理ができるサンプルコードがこちら

Sub SafeLoop()
Dim i As Long, loopCount As Long
loopCount = 0
For i = 1 To Range("A" & Rows.Count).End(xlUp).Row
loopCount = loopCount + 1
If loopCount > 10000 Then
MsgBox "処理が長すぎます。確認してください。"
Exit For
End If
'処理内容
Next i
End Sub

 

5行目から9行目のコードは、

繰り返し処理の回数をカウントし10000回以上繰り返した場合「処理が長すぎます。確認してください。」というメッセージを表示し繰り返し処理を抜ける

という意味です。

 

Left Caption

ガッツポーズの人

無限ループの可能性があるVBAに導入してください。

 

変数の宣言に関するポイント

変数の宣言を適切に管理することで、予期せぬエラーを防ぐことができます。

 

以下のサンプルコードのように

Public変数の使用は最小限に抑え必要な場合のみDim文で明示的に宣言

しましょう。

Option Explicit
Private pCounter As Long

Sub ManageScope()
Dim localVar As String
localVar = "ローカル変数"
pCounter = pCounter + 1
Call SubFunction(localVar)
End Sub

Private Sub SubFunction(ByVal param As String)
Debug.Print param
Debug.Print pCounter
End Sub

 

Left Caption

ガッツポーズの人

変数を受け渡すときはシンプルなコード作りを心がけましょう。

 

デバッグの効率的な進め方

デバッグはVBA開発においてとても重要な工程です。

 

下記のサンプルコードは、エラーが発生してもデバックのしやすい仕組みが導入されています。

Sub DebugExample()
On Error GoTo ErrorHandler
Dim i As Long

Debug.Print "処理開始"
For i = 1 To 10
If i = 5 Then Stop 'ブレークポイントの設定
Debug.Print "現在の値: " & i
Next i
Exit Sub

ErrorHandler:
Debug.Print "エラー番号: " & Err.Number
Debug.Print "エラー内容: " & Err.Description
End Sub

 

7行目から10行目のコードは、

繰り返し5回目をブレークポイントとしても表示させる

という意味です。

 

12行目から14行目のコードは、

発生したエラー番号とエラーの内容を表示する

という意味です。

 

エラーが発生するタイミング、エラー内容を把握することでデバックの効率をアップさせることが可能です。

 

他にもVBAには、

ブレークポイントの設定やイミディエイトの活用など、便利なデバッグツールが用意

されています。

 

関連記事「VBA初心者でもできる!デバックの方法」では効率的なデバック方法が図やサンプルコードを使って解説されています。

 

VBAを設定してもよくエラーが発生して作業が進まない!という方は是非参考にしてみてください。

 

 

 

処理速度を向上させるためのコツ

 

For Nextが使われたVBAでは処理速度の最適化が重要です。

 

特に大量のデータを処理する場合、適切な最適化を実装しなければ膨大な処理時間が必要になることがあります。

 

Left Caption

疲れ果てた人

処理完了までに10分以上必要になったことも。。。。

 

実務で活用するための処理速度の最適化方法をご紹介します。

 

With構文を活用した高速化テクニック

With構文を使用することで、オブジェクトの参照回数を減らし処理速度を向上させることができます。

 

With構文を使ったサンプルコードはこちら

Sub UseWithStatement()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(1)
With ws
.Range("A1").Value = "データ"
.Range("A1").Font.Bold = True
.Range("A1").Interior.Color = RGB(255, 255, 0)
End With
End Sub

 

4行目から8行目のがWith構文を使ったコードです。

5行目のコードは本来「ws.Range(“A1").Value = “データ"」となるところ、With構文を使うことで「.Range(“A1").Value = “データ"」と省略可能。

 

コードを短く省略できるだけではなく、オブジェクト(サンプルコードではwsが該当)の参照も省略できるので処理スピードがアップに繋がります。

 

Left Caption

ガッツポーズの人

With構文は積極的に活用しましょう。

Application.ScreenUpdatingの適切な使用方法

画面更新を制御することで、処理速度を大幅に向上させることができます。

Sub OptimizeScreenUpdating()
On Error GoTo ErrorHandler

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

'処理内容をここに記述

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Exit Sub

ErrorHandler:
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
MsgBox "エラーが発生しました: " & Err.Description
End Sub

 

4行目のコードは、VBA処理時の画面更新をOFFにする。

10行目のコードは、OFFにしていた画面更新をONにする。

という意味です。

 

更新画面をOFFにしている状態でFor~Nextのような繰り返し処理を実行し、処理完了後に画面更新をONにすることでVBAの処理スピードがアップします。

 

画面更新の設定と併せてエラーハンドリグVBAの設定をしておくと、エラー発生時スムーズに対応できるのでおすすめです。

 

【応用編】For NextとIF関数の活用事例

 

VBAの基本を理解したら、より高度な自動化にチャレンジしましょう。

ここからは複雑な条件分岐や複数のシートを使用する処理など、実務で必要となる高度なテクニックを紹介します。

 

Select Case文との組み合わせ方

複数の条件分岐が必要な場合Select Case文を使用することで、より見やすくメンテナンスのしやすいコードにすることができます。

 

 

サンプル事例として、

点数が90以上のとき判定Sで背景色が黄色、点数が80~90のとき判定Aで背景色が緑色、点数が70~79のとき判定Bで背景色が水色、点数が70未満のとき判定Cで背景色が赤色

という処理をVBAで表現してみます。

 

 

Select Caseを使ったVBAの概要を示したイラスト

 

Select Caseを使ったサンプルコードはこちら

Sub AdvancedCaseExample()
Dim i As Long
Dim lastRow As Long

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

For i = 2 To lastRow
Select Case Cells(i, 1).Value
Case Is >= 90
Cells(i, 2).Value = "S"
Cells(i, 2).Interior.Color = RGB(255, 255, 0)
Case 80 To 89
Cells(i, 2).Value = "A"
Cells(i, 2).Interior.Color = RGB(0, 255, 0)
Case 70 To 79
Cells(i, 2).Value = "B"
Cells(i, 2).Interior.Color = RGB(0, 255, 255)
Case Else
Cells(i, 2).Value = "C"
Cells(i, 2).Interior.Color = RGB(255, 0, 0)
End Select
Next i
End Sub

 

処理結果がこちら

Select Caseを使ったVBAの結果を示したイラスト

 

分岐条件を付け加えることで、さらに複雑な処理の実現が可能です。

 

複数シートを横断する処理の実装方法

実務では複数のシートのデータを集計したり、比較したりする必要があります。

 

サンプル事例として、

複数Sheetに入力された数値を「集計Sheet」のA2セルに表示する

という処理をVBAで表現してみます。

 

複数シートの数値を集計するVBAの概要を示したイラスト

 

複数Sheetの数値を集計するサンプルコードがこちら

Sub ProcessMultipleSheets()
Dim ws As Worksheet
Dim totalSum As Long
Dim lastRow As Long

totalSum = 0

For Each ws In ThisWorkbook.Worksheets
If ws.Name <> "集計" Then
lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row

For i = 2 To lastRow
If ws.Cells(i, 1).Value > 0 Then
totalSum = totalSum + ws.Cells(i, 1).Value
End If
Next i
End If
Next ws

ThisWorkbook.Sheets("集計").Range("A2").Value = totalSum
End Sub

 

8行目のコードは、ブック内全てのシートを繰り返す。

9行目のコードは、シート名が「集計」以外の時、10行目から17行目までの処理を繰り返す。

20行目のコードは、変数totalSumに格納した集計値を「集計Sheet」のA2セルに表示する。

という意味です。

 

実行結果がこちら

複数シートの数値を集計するVBAの結果を示したイラスト

 

 

Left Caption

ガッツポーズの人

数値が入力されたシートがどれだけ増えても対応可能。

 

 

このように、For~NextとIF関数を業務内容に合わせて組み合わせることで、より高度な自動化を実現できます。

  • 何千個から何万個ものデータ処理を自動化する
  • 会社名、氏名、連絡先が入力された一覧表から請求書や領収書を自動作成する
  • 日報をスケジュール表に自動反映する

 

Left Caption

ガッツポーズの人

いろんなエクセル業務に応用可能です。

 

いかがでしたでしょうか。

 

この記事を読んで、

VBAで日々のルーティーン作業を自動化したい!

と感じてくれた方はマメBlogのエクセルマクロ開発代行サービスの利用を検討してみてください。

 

 

Left Caption

ガッツポーズの人

この記事で紹介している『繰り返し処理とIF関数の組み合わせVBA』を扱っているエクセルに設定することもできます。

 

「今やっている業務にも設定できるの?」「費用はどれくらいかかるの?」など、いろんな疑問があるかともいます。

ご相談、お見積りの依頼は無料ですのでお気軽にお問い合わせください。