「VBAでIF文とANDを組み合わせたいけど、どう書けばいいんだろう…」
そんな悩み、私も経験があります。実は、ExcelのIF関数とは少し書き方が違うんです。
私は20年のExcel業務の中で、VBAのIF ANDを使って多くの作業を自動化してきました。例えば、毎月3時間かかっていた売上データのチェック作業が、たった5分で終わるように。
この記事では、VBAでのIF ANDの基本的な書き方から、実践で使える具体例まで、初心者の方にも分かりやすく解説します。エラーでお困りの方のために、よくあるトラブルの解決方法もご紹介しますよ。
さあ、一緒にVBAでの条件分岐をマスターしていきましょう!
VBAでのIF ANDの基礎知識
IF構文とANDの組み合わせ方法とは
Excelでお馴染みのIF関数。VBAでも同じように条件分岐ができますが、複数の条件を組み合わせる時は少し書き方が変わります。
例えば、「出勤時刻が9時以降」かつ「退勤時刻が17時前」のデータを探したい場合。これをIF関数で書こうとすると…
=IF(AND(B2>=TIME(9,0,0), C2<=TIME(17,0,0)), "遅刻・早退", "")
…となりますよね。でもVBAでは少し違います:
If Cells(i, 2).Value >= TimeValue("09:00:00") And Cells(i, 3).Value <= TimeValue("17:00:00") Then
Cells(i, 4).Value = "遅刻・早退"
End If
と、このような書き方になります。
構文の基本ルール
基本的な書き方はこうです:
If 条件1 And 条件2 Then
'条件を満たした時の処理
End If
次に、実際の業務でよく使う例を見ていきましょう…
実践的な使用例と実装テクニック
セルの値を判定する基本パターン
先ほどの勤怠管理の例は、時間の判定でしたね。でも実際の業務では、もっと色々なパターンがあります。

例えば、ある企業の契約更新管理。「契約更新月が近い」かつ「未連絡」の顧客を探す場合:
Sub 更新が近いかつ未連絡()
Dim lastRow As Long
Dim i As Long
Dim currentMonth As Integer
currentMonth = Month(Date) '現在の月(2月)を取得
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow '契約更新日が2月 かつ 最終連絡日が空欄
If Month(Cells(i, 3).Value) = currentMonth And Cells(i, 4).Value = "" Then
Cells(i, 5).Value = "連絡必要"
End If
Next i
End Sub
💡 Month()関数とは?
日付から月だけを取り出す関数です。例えば、2024/9/12 からは 9 を取得します。
このコードで毎月の連絡リスト作成が30分→2分に短縮できました。
ユーザーフォームでの活用法
フォームの入力チェックも IF AND
の得意分野です。例えば、「入力必須」かつ「数値のみ」をチェックする場合:
If TextBox1.Text <> "" And IsNumeric(TextBox2.Text) Then
Label1.Caption = "OK!"
Else
Label1.Caption = "入力エラー"
End If
🔍 IsNumeric()とは?
値が数値として扱えるかをチェックする関数です。例えば、”123″はOK、”ABC”はNGとなります。
「でも、もっと複雑な条件もあるよね?」
そうなんです。実は、ここからが IF AND
の真価を発揮する場面なんです。
より実践的な入力チェックの例:
'商品登録フォームの入力チェック
Private Sub btnRegister_Click()
'商品コードチェック(必須・5文字以上)
If Len(txtProductCode.Text) >= 5 And txtProductName.Text <> "" Then
'単価チェック(必須・数値・0以上)
If IsNumeric(txtPrice.Text) And Val(txtPrice.Text) > 0 Then
'在庫数チェック(必須・数値・0以上)
If IsNumeric(txtStock.Text) And Val(txtStock.Text) >= 0 Then
lblResult.Caption = "登録OK!"
'実際の登録処理をここに書く
Else
lblResult.Caption = "在庫数は0以上の数値を入力してください"
End If
Else
lblResult.Caption = "単価は0より大きい数値を入力してください"
End If
Else
lblResult.Caption = "商品コード(5文字以上)と商品名は必須です"
End If
End Sub
💡 よく使う入力チェック関数
IsNumeric()
: 数値として有効か確認Len()
: 文字列の長さを取得Val()
: 文字列を数値に変換(数値以外は0として扱う)Trim()
: 前後の空白を削除
複数の大量な条件を使う必要がある場合はすべてANDやORでつなぐのではなく、このようにIFの中にIFを入れていくことですべてにデータを確認する必要が無くなるので、格段にスピードアップをさせることが出来るようになります。
🔍 入力チェックのコツ
- 最も重要なチェックを最初に行う
- エラーメッセージは具体的に何が問題かを示す
- 数値の場合、桁数制限や範囲チェックも必要に応じて追加
トラブルシューティングとデバッグ技法
よくあるエラーと解決法

私が新人時代に最もハマったのが、このエラー。原因は大きく分けて3つ:
.Value
の付け忘れ- オブジェクトの初期化忘れ
- セル範囲の指定ミス
特に多いのが1番。でも、こんな便利な方法があります:
デバッグ用のコード
Debug.Print "セルの値:" & Cells(i, 2).Value
Debug.Print "判定結果:" & (Cells(i, 2).Value >= 100)

この方法を使えば、ターゲットとなるセルの値が適正になっているかどうか判定しやすくなります。
Debug.Printを使うとイミディエイトウィンドウに結果が表示されます。イミディエイトウィンドウについてはイミディエイトウィンドウの表示方法 Excel(エクセル)マクロ(VBA)を参照してください。
パフォーマンスと最適化
条件式の最適な書き方
複数の条件をチェックする時、高速化させるためにちょっとしたコツがあります。
例えば、こんなコード:
'改善前:すべての条件を一度にチェック
For i = 2 To lastRow
If Cells(i, 2).Value = "対象" And Cells(i, 3).Value > 100 And Cells(i, 4).Value = "未処理" Then
'処理内容
End If
Next i
このコードは一見シンプルで良さそうですが、実は1万件のデータを処理すると約8秒もかかってしまいます。なぜでしょう?
それは、すべての行で3つの条件を必ずチェックしているからなんです。
💡 実務での失敗談 私も新人時代、「条件は一行にまとめた方がスッキリする!」と思って書いていました。結果、大量データの処理が遅くて先輩にに怒られた思い出が…(笑)
では、どう改善すれば良いのでしょうか?
'改善後:条件を段階的にチェック
For i = 2 To lastRow
If Cells(i, 4).Value = "未処理" Then '最も絞り込める条件を最初に
If Cells(i, 2).Value = "対象" Then
If Cells(i, 3).Value > 100 Then
'処理内容
End If
End If
End If
この書き方なら、同じ1万件のデータが3秒で処理できます!
コードの可読性向上
「でも、IF文が入れ子になって見にくくない?」
そう思われるかもしれません。その場合は、条件をまとめる方法もあります:
'可読性を重視した書き方
For i = 2 To lastRow
Dim isUnprocessed As Boolean
Dim isTarget As Boolean
Dim isOverLimit As Boolean
isUnprocessed = (Cells(i, 4).Value = "未処理")
isTarget = (Cells(i, 2).Value = "対象")
isOverLimit = (Cells(i, 3).Value > 100)
If isUnprocessed And isTarget And isOverLimit Then
'処理内容
End If
Next i
💡 変数名のコツ
- is から始まる名前をつけると、条件判定の変数だとすぐわかります
- 条件の内容が変数名を見ただけでわかるように命名しましょう
発展的なテクニック
他の制御構文との使い分け
実は、IF ANDばかりを使うのは効率が悪いケースもあります。例えば:
'IF ANDを使った場合
If Cells(i, 1).Value = "A" And Cells(i, 2).Value = "完了" Then
'処理A
ElseIf Cells(i, 1).Value = "B" And Cells(i, 2).Value = "完了" Then
'処理B
ElseIf Cells(i, 1).Value = "C" And Cells(i, 2).Value = "完了" Then
'処理C
End If
これ、もっとスマートに書けるんです:
'Select Caseを使った場合
If Cells(i, 2).Value = "完了" Then
Select Case Cells(i, 1).Value
Case "A"
'処理A
Case "B"
'処理B
Case "C"
'処理C
End Select
End If
💡 実務でのアドバイス 同じ項目で複数の値をチェックする場合は、Select Caseの方が読みやすく、保守もしやすいです。私も最初は全部IF ANDで書いていましたが、後から修正する時に大変でした…(^^;)
条件式の高度な組み合わせ
AND、OR、NOTを組み合わせることで、より複雑な条件分岐も可能です:
'在庫管理での複合条件チェック例
If (Cells(i, 2).Value <= 10 And Cells(i, 3).Value = "A級品") Or _
(Cells(i, 2).Value <= 5 And Cells(i, 3).Value = "B級品") Or _
(Not Cells(i, 4).Value = "発注済" And Cells(i, 5).Value = "緊急") Then
Cells(i, 6).Value = "要発注"
End If
このコードは以下のような状況をチェックしています:
- A級品の在庫が10個以下
- B級品の在庫が5個以下
- 発注済でない(Not)かつ緊急指定されている商品

💡 実務でのポイント
AND、OR、NOTを組み合わせる時は、カッコ ( ) で条件をグループ化すると見やすくなります
行の途中で改行する場合は、スペース + アンダースコア ( _ ) を使います
条件が複雑になるほど、コメントで判定内容を説明することが重要です
⚠️ 注意点
条件が複雑になりすぎたら、それは設計を見直すサインかもしれません。私の場合、条件が3つを超えたら要注意、4つ以上になったら別の方法を検討するようにしています。
よくある質問(FAQ)
Q1: 「Object required」エラーが出る

- Q「型が一致しません。」のエラーが出る
- A
最も多いのが
.Value
の付け忘れです。こうチェックしてみましょう:
'デバッグ用
Debug.Print TypeName(Cells(i, 3))
Debug.Print TypeName(Cells(i, 3).Value)

- Q条件が正しいのに判定されない
- A
文字列比較でよくある問題です。Trimを使って余分なスペースを除去してみましょう:
If Trim(Cells(i, 1).Value) = "対象" Then
- Q処理が遅い
- A
条件の順番を見直してみましょう。最も「絞り込める」条件を最初に持ってくることで、大幅に速度改善できます。
まとめ
IF ANDは非常に便利な機能ですが、使い方次第で全く違う結果になります。
- 基本は
.Value
をつけることを忘れずに - 条件は段階的にチェックする
- 複雑になりすぎたら、Select Caseの使用を検討
- デバッグ用のPrint文を活用する
「百聞は一見にしかず」というように、実際に手を動かして試してみるのが一番の上達への近道です。
最初は戸惑うことも多いかもしれませんが、このガイドを参考に、ぜひチャレンジしてみてください!何か困ったことがあれば、コメント欄でお気軽に質問してくださいね。
🎯 次のステップ
- 実際のデータで練習してみる
- デバッグ機能を使いこなす
- Select Caseなど他の制御構文も試してみる
これでVBAのIF AND完全ガイドは終わりです。みなさんの業務効率化に役立てば幸いです!
コメント