Excel VBAで特定範囲に空白がある場合のみマクロを実行する方法【E3:E40対応】

Visual Basic

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の理解が一段深まります。

コメント

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