Excel VBAでマクロを制御する際、「特定のセル範囲がすべて空白でない場合は処理を止めたい」というケースはよくあります。本記事では、E3〜E40セルのいずれかに値が入っている場合にマクロを実行しない、シンプルで実務向きの書き方を解説します。
Range(“E3:E40”).Value がエラーになる理由
VBAでRange(“E3:E40”).Valueを直接If文で比較すると、「実行時エラー13(型が一致しません)」が発生します。これは、複数セルのRange.Valueが配列として扱われるためです。
単一セル(例:Range(“E3”))であればValueは1つの値ですが、複数セルの場合は配列となるため、文字列比較(””)はできません。
最もシンプルな解決策:COUNTA関数を使う
複数セルに値が入っているかどうかを判定する場合、Excel関数のCOUNTAをVBAから使う方法が最も簡単で可読性も高くなります。
以下のコードは、E3〜E40の中に1つでも値が入っていた場合、マクロを終了する例です。
If Application.WorksheetFunction.CountA(Range("E3:E40")) > 0 Then
MsgBox "E3〜E40に値が入っているため、処理を中止します。"
Exit Sub
End If
COUNTAは「空白でないセルの数」を返すため、1以上であれば「空白ではないセルが存在する」ことを意味します。
すべて空白でない場合を判定したいケース
もし「E3〜E40がすべて空白でない場合」に処理を止めたい場合は、セル数とCOUNTAの結果を比較します。
If Application.WorksheetFunction.CountA(Range("E3:E40")) = Range("E3:E40").Cells.Count Then
MsgBox "E3〜E40がすべて入力済みのため、処理を中止します。"
Exit Sub
End If
この方法は、入力チェックや登録済みデータの再処理防止などに便利です。
For Eachを使った基本的な書き方
VBAの基本構文を理解したい場合は、For Eachで1セルずつ判定する方法もあります。
Dim c As Range
For Each c In Range("E3:E40")
If c.Value <> "" Then
MsgBox "値が入力されています。処理を中止します。"
Exit Sub
End If
Next c
処理内容は明確ですが、記述量が増えるため、実務ではCOUNTAの方が好まれることが多いです。
よくある勘違いと注意点
Range指定はIf文で使用できますが、複数セル=配列になる点が重要です。単一セルと同じ感覚で比較するとエラーになります。
そのため、複数セルを扱う場合は「WorksheetFunction」や「ループ処理」を使うのがVBAの基本パターンです。
まとめ
E3〜E40セルに空白があるかどうかを判定してマクロを制御するには、COUNTA関数を使う方法が最もシンプルで安全です。Range.Valueを直接比較しようとせず、「複数セルは配列」という前提を押さえておくことで、VBAの理解が一段深まります。

コメント