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 を返します。
今回のサンプルで問題がありそうでしたら、コメントでご指摘いただけると助かります。
おつかれさまでした。