VBA 必須チェックする方法 Excel
Excel VBAで必須チェックする方法です。
実務の中では、特定の項目を入力必須にしたい場合がよくありますね。更に利用者に、どこの項目が必須かを教えてあげると喜ばれます。(というか、教えてあげないとダメです^^;)
ここでは 必須チェックする方法と、入力必須項目に色づけ&メッセージを表示する方法 を紹介します。
VBAで必須チェックをプログラミング
仮にこんな入力シートがあったとしましょう。入力必須項目は3つです。入力チェックボタンを押下したら、必須チェックをおこないます。
まずは、名前の必須チェックをしましょう。プログラムを書くと下記のようになるでしょうか。ここでは、標準モジュールを追加して利用しています。
' ' 入力チェック ' 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」を選択しましょう。
「入力チェック」ボタンを押下すると、下記のようになると思います。
ポイントしては、「If IsError(Rng) Or Rng.HasFormula Then」の部分でしょうか。日本語に直すと、「対象セルがエラーになっている、もしくは数式の場合」となります。
実はセルに数式を入れて、その結果が空白だったとします。これに対して「セル値= ""」とやると、空白と判定されてしまいます。これはこれでOKということであれば良いのですが、その結果がエラー(#N/Aなど)になっていて、「セル値= ""」とした場合、「型が一致しません」のエラーが発生します。そのため「IsError」を使ってエラー判定をしています。セル値に入力があるかどうかを調べる前に、必ずセル値のエラーチェックをしましょう。
数式を入れてエラーを作りだし、入力チェックをおこなうと、下図のようになります。
とはいえ、数式は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で必須チェックをテスト
では、早速で検証しましょう。まずは何も入力せずに「入力チェック」ボタンを押下し、必須入力エラーになることを確認します。
エラーになる数式と、正常な数式を入れて「入力チェック」ボタンを押下し、数式入力エラーになることを確認します。
必須項目を全て入力して、「入力チェック」ボタンを押下し、エラーが発生しないことを確認します。
ふむ、よさそうですね^^
まとめ
Excel VBAで必須チェックする方法を紹介しました。
必須チェックというのは、実務ではよく使うバリデーションチェックですが、VBAの場合、空白かどうかを判定するのは中々面倒です。というのは、Excelの場合、セルに計算式を埋め込むことができ、計算結果によって空白の判断が異なるからです。
セルの値が数式でエラー以外場合、IsEmpty は False を返し、セル値= ""の比較は True を返します。
セルの値が数式でエラーの場合、IsEmptyはFalseを返し、セル値= ""の比較はできず「型が一致しません」のエラーが発生します。
セル値が空文字の場合、IsEmpty は True を返し、セル値= ""の比較も True を返します。
今回のサンプルで問題がありそうでしたら、コメントでご指摘いただけると助かります。
おつかれさまでした。