VBA 必須チェックする方法 Excel

Excel VBAで必須チェックする方法です。

VBA 必須チェックする方法 Excel

実務の中では、特定の項目を入力必須にしたい場合がよくありますね。更に利用者に、どこの項目が必須かを教えてあげると喜ばれます。(というか、教えてあげないとダメです^^;)

ここでは 必須チェックする方法と、入力必須項目に色づけ&メッセージを表示する方法 を紹介します。


VBAで必須チェックをプログラミング

仮にこんな入力シートがあったとしましょう。入力必須項目は3つです。入力チェックボタンを押下したら、必須チェックをおこないます。

VBAで必須チェックをプログラミング

まずは、名前の必須チェックをしましょう。プログラムを書くと下記のようになるでしょうか。ここでは、標準モジュールを追加して利用しています。

'
' 入力チェック
'
Public Sub Exec()
  Dim Sheet1 As Worksheet
  Dim ErrMsg As String
  ' 入力シートを設定
  Set Sheet1 = Worksheets("Sheet1")
  ' 名前の必須チェックをおこなう
  ErrMsg = RequiredCheckForString(Sheet1, 3, 2)
  ' エラーメッセージを設定
  Sheet1.Cells(3, 3).Value = ErrMsg
  ' エラーがあった場合
  If ErrMsg <> "" Then
    ' 背景色を赤に変更し、エラーメッセージの文字色を赤に変更する。
    Sheet1.Cells(3, 2).Interior.ColorIndex = 3
    Sheet1.Cells(3, 3).Font.ColorIndex = 3
  Else
    ' 背景色をなしに変更する。
    Sheet1.Cells(3, 2).Interior.ColorIndex = xlNone
  End If
End Sub

'
' 文字列の必須チェック
' 引数  :InputSheet 入力シート
'     :InputSheetRow 入力シートの行
'     :InputSheetCol 入力シートの列
' 戻り値:エラーメッセージ(エラーがない場合は空文字列が返る)
'
Public Function RequiredCheckForString(InputSheet As Worksheet, InputSheetRow As Long, InputSheetCol As Long) As String
On Error GoTo RequiredCheckForStringErr
  Dim Rng As Range
  Dim ErrMsg As String
  ' エラーメッセージを初期化
  ErrMsg = ""
  ' 範囲を指定
  Set Rng = InputSheet.Cells(InputSheetRow, InputSheetCol)
  ' 対象セルがエラーになっている、もしくは数式の場合
  If IsError(Rng) Or Rng.HasFormula Then
    Debug.Print "Formula: " & Rng.Address
    ErrMsg = "数式が入力されています。"
  Else
    ' 入力チェック
    If IsEmpty(Rng.Value) Or Rng.Value = "" Then
      Debug.Print "空文字: " & Rng.Address
      ErrMsg = "必須入力です。"
    End If
  End If
  ' エラーメッセージを返す
  RequiredCheckForString = ErrMsg
  Exit Function
RequiredCheckForStringErr:
  MsgBox "[RequiredCheckForString]" & vbCrLf & Err.Description, vbCritical, "Exception"
  RequiredCheckForString = "[RequiredCheckForString]: " & Err.Description
  Exit Function
End Function

「入力チェック」ボタンを右クリックして、マクロの登録をおこないます。マクロ名に「Exec」を選択しましょう。

VBA マクロの登録

「入力チェック」ボタンを押下すると、下記のようになると思います。

VBAで必須チェック 入力チェックボタンを押下でエラー確認

ポイントしては、「If IsError(Rng) Or Rng.HasFormula Then」の部分でしょうか。日本語に直すと、「対象セルがエラーになっている、もしくは数式の場合」となります。

実はセルに数式を入れて、その結果が空白だったとします。これに対して「セル値= ""」とやると、空白と判定されてしまいます。これはこれでOKということであれば良いのですが、その結果がエラー(#N/Aなど)になっていて、「セル値= ""」とした場合、「型が一致しません」のエラーが発生します。そのため「IsError」を使ってエラー判定をしています。セル値に入力があるかどうかを調べる前に、必ずセル値のエラーチェックをしましょう。

数式を入れてエラーを作りだし、入力チェックをおこなうと、下図のようになります。

VBAで必須チェック 数式入力を確認

とはいえ、数式はOKとしたいってこともあると思います。その場合には、「If IsError(Rng) Or Rng.HasFormula Then」を、「If IsError(Rng) Then」に直せばOKです。この場合、エラーメッセージは適当に変更してください。

残りの項目についてもチェックを追加しましょう。同じことを何度も書くのは、ソースを汚くするので、エラーメッセージの表示は外部メソッドにしちゃいましょう。

'
' エラーメッセージをセットする
' 引数  :ErrMsg エラーメッセージ
'     :InputSheet 入力シート
'     :InputSheetRow 入力シートの行
' 戻り値:なし
'
Public Sub SetErrMsg(ErrMsg As String, InputSheet As Worksheet, InputSheetRow As Long)
  ' エラーメッセージを設定
  InputSheet.Cells(InputSheetRow, 3).Value = ErrMsg
  ' エラーがあった場合
  If ErrMsg <> "" Then
    ' 背景色を赤に変更し、エラーメッセージの文字色を赤に変更する。
    InputSheet.Cells(InputSheetRow, 2).Interior.ColorIndex = 3
    InputSheet.Cells(InputSheetRow, 3).Font.ColorIndex = 3
  Else
    ' 背景色をなしに変更する。
    InputSheet.Cells(InputSheetRow, 2).Interior.ColorIndex = xlNone
  End If
End Sub

入力チェックのプログラムも変更します。

'
' 入力チェック
'
Public Sub Exec()
  Dim Sheet1 As Worksheet
  ' 入力シートを設定
  Set Sheet1 = Worksheets("Sheet1")
  ' 名前の必須チェックをおこなう
  SetErrMsg RequiredCheckForString(Sheet1, 3, 2), Sheet1, 3
  ' カナの必須チェックをおこなう
  SetErrMsg RequiredCheckForString(Sheet1, 4, 2), Sheet1, 4
  ' 所属の必須チェックをおこなう
  SetErrMsg RequiredCheckForString(Sheet1, 5, 2), Sheet1, 5
End Sub

RequiredCheckForString からの戻り値であるエラーメッセージを、SetErrMsg の引数にしていることがポイントです。

下記のようにバラした方がわかりやすいでしょうかね。必要に応じて変えてみてください。

Dim ErrMsg As String
ErrMsg = RequiredCheckForString(Sheet1, 3, 2)
Call SetErrMsg(ErrMsg, Sheet1, 3)

ふむ、これでOKですね。後はテストして、目的通りに動くか確認しましょう。

VBAで必須チェックをテスト

では、早速で検証しましょう。まずは何も入力せずに「入力チェック」ボタンを押下し、必須入力エラーになることを確認します。

VBAで必須チェック 検証1

エラーになる数式と、正常な数式を入れて「入力チェック」ボタンを押下し、数式入力エラーになることを確認します。

VBAで必須チェック 検証2

必須項目を全て入力して、「入力チェック」ボタンを押下し、エラーが発生しないことを確認します。

VBAで必須チェック 検証3

ふむ、よさそうですね^^

まとめ

Excel VBAで必須チェックする方法を紹介しました。

必須チェックというのは、実務ではよく使うバリデーションチェックですが、VBAの場合、空白かどうかを判定するのは中々面倒です。というのは、Excelの場合、セルに計算式を埋め込むことができ、計算結果によって空白の判断が異なるからです。

セルの値が数式でエラー以外場合、IsEmpty は False を返し、セル値= ""の比較は True を返します。

セルの値が数式でエラーの場合、IsEmptyはFalseを返し、セル値= ""の比較はできず「型が一致しません」のエラーが発生します。

セル値が空文字の場合、IsEmpty は True を返し、セル値= ""の比較も True を返します。

今回のサンプルで問題がありそうでしたら、コメントでご指摘いただけると助かります。

おつかれさまでした。

この記事がお役に立ちましたら シェア をお願いいたします。