入力チェックの種類
セルやテキストボックスの文字列の入力チェックが必要な場合がありますが、入力チェックには以下のようにいろいろあります。
- 未入力チェック
- 文字数チェック
- 日付形式チェック
- 郵便番号形式チェック
- メールアドレス形式チェック
- 全角のみチェック
- 半角のみチェック
- 数字のみチェック
- 英字のみチェック
入力項目の内容に合わせて細分化すればさらにチェック形式が増えますがここでは上に挙げた各チェックについて実装方法を紹介します。
なお、一部のチェックでは都合がいいため正規表現を利用しています。正規表現が分からなくてもコピペで使えるようにしています。
事前設定
以下の一部のチェックで正規表現を使っているため、正規表現を利用するための参照設定をしておく必要があります。
VBAの画面でツールメニュー→参照設定のダイアログを開き、「Microsoft VBScript Regular Expressions 5.5」にチェックを付けることで正規表現のRegExpクラスが利用できるようになります。
1. 未入力チェック
引数の指定セル範囲に空白セルが1つもなければTrue、1つでもあればFalseを返します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
'// 引数1:指定セル範囲 '// 戻り値:True=チェックOK、False=チェックNG Function chkMissing(r As Range) As Boolean Dim rCell As Range '// 処理対象セル Dim ret As Boolean '// 関数戻り値 For Each rCell In r '// 未入力の場合 If rCell.Value = "" Then chkMissing = False Exit Function End If Next chkMissing = True End Function |
使い方
1 2 3 4 5 6 |
Sub chkMissingTest() Dim ret As Boolean ret = chkMissing(Selection) Debug.Print ret End Sub |
2. 文字数チェック
引数の指定セル範囲の文字列の長さが指定した最小と最大の範囲に収まっているかをチェックします。範囲内であればTrue、そうでないならFalseを返します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
'// 引数1:指定セル範囲 '// 引数2:最大文字数 '// 引数3:最小文字数(既定値=1) '// 戻り値:True=チェックOK、False=チェックNG Function chkCharCount(r As Range, maxCount As Long, Optional minCount As Long = 1) As Boolean Dim rCell As Range '// 処理対象セル Dim ret As Boolean '// 関数戻り値 Dim iLength For Each rCell In r iLength = Len(rCell.Value) '// 文字数が条件を満たされていない場合 If (iLength < minCount) Or (iLength > maxCount) Then chkCharCount = False Exit Function End If Next chkCharCount = True End Function |
使い方
1 2 3 4 5 6 |
Sub chkCharCountTest() Dim ret As Boolean ret = chkCharCount(Selection, 3, 1) Debug.Print ret End Sub |
3. 日付形式チェック
引数の指定セル範囲の文字列をIsDate関数で判定しています。IsDate関数は「20180522」のような8文字の数字列は日付として認めないため、許可したい場合はIsDate関数だけでは対応できません。
そのような場合はカスタマイズが必要になります。
8文字日付形式用に拡張したIsDate関数を「8桁日付やスラッシュ編集日付用のIsDate関数」でIsDateEx関数として紹介していますので、IsDate関数の代わりに差し替えてもらえば8文字日付でもチェックが可能になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
'// 引数1:指定セル範囲 '// 戻り値:True=チェックOK、False=チェックNG Function chkDate(r As Range) As Boolean Dim rCell As Range '// 処理対象セル Dim ret As Boolean '// 関数戻り値 For Each rCell In r '// 日付形式ではない場合 If IsDate(rCell.Value) = False Then chkDate = False Exit Function End If Next chkDate = True End Function |
使い方
1 2 3 4 5 6 |
Sub chkDateTest() Dim ret As Boolean ret = chkDate(Selection) Debug.Print ret End Sub |
4. 郵便番号形式チェック
日本で使われる郵便番号は一般的には7桁の999-9999形式のため正規表現でチェックしています。
もし海外の郵便番号への対応が必要になるなどの特殊事情がある場合はチェックをゆるくするなどの対応が必要になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
'// 引数1:指定セル範囲 '// 戻り値:True=チェックOK、False=チェックNG Function chkZipCode(r As Range) As Boolean Dim rCell As Range '// 処理対象セル Dim ret As Boolean '// 関数戻り値 Dim reg As New RegExp '// 正規表現クラスオブジェクト '// 検索条件=郵便番号形式を抽出 reg.Pattern = "^[0-9]{3}-[0-9]{4}$" '// 文字列の最後まで検索する reg.Global = True For Each rCell In r '// 郵便番号形式ではない場合 If reg.Test(rCell.Value) = False Then chkZipCode = False Exit Function End If Next chkZipCode = True End Function |
使い方
1 2 3 4 5 6 |
Sub chkZipCodeTest() Dim ret As Boolean ret = chkZipCode(Selection) Debug.Print ret End Sub |
5. メールアドレス形式チェック
メールアドレスの厳密なチェックは結構大変です。
企業のメールアドレスのように命名法則が決まっているのであれば正規表現でのチェックも可能ですが、想定されるメールアドレスの形式を網羅するような正規表現でのチェックは残念ながら無理です。
そこで、かなりチェックはゆるいのですが、「a@a.a」の形式になっていればOK、とするチェックにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
'// 引数1:指定セル範囲 '// 戻り値:True=チェックOK、False=チェックNG Function chkMailAddress(r As Range) As Boolean Dim rCell As Range '// 処理対象セル Dim ret As Boolean '// 関数戻り値 Dim reg As New RegExp '// 正規表現クラスオブジェクト '// 検索条件=メールアドレス形式を抽出 reg.Pattern = "^.+@.+\..+$" '// 文字列の最後まで検索する reg.Global = True For Each rCell In r '// メールアドレス形式ではない場合 If reg.Test(rCell.Value) = False Then chkMailAddress = False Exit Function End If Next chkMailAddress = True End Function |
使い方
1 2 3 4 5 6 |
Sub chkMailAddressTest() Dim ret As Boolean ret = chkMailAddress(Selection) Debug.Print ret End Sub |
6. 全角のみチェック
文字列が全角のみかをチェックします。
12行目のStrConv関数で、DBCS言語であるセルの文字列をASCII言語に変換しています。
これにより、全角の「あa」が変換前はDBCS言語として4バイトだったのが、Shift-JIS換算の3バイトとして扱われるようになります。
DBCS言語の場合は全角や半角に関わらず1文字が2バイトとして扱われます。半角英数の”1″や”a”も2バイトです。
15行目のLen関数でセルの文字列の文字数を取得し2倍しています。「あいう」なら6、「あa」なら4が返ります。
16行目でASCII変換後の文字列に対してLenB関数を使うとバイト数を取得できます。
ASCII変換後の「あいう」なら6、「あa」なら3が返ります。全て全角文字であれば文字数×2と全角バイト数が一致するため、そこから全角文字で構成されているかを判定します。
DBCS言語などについての詳細は「VBAのByte単位用関数の問題点」をご参照ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
'// 引数1:指定セル範囲 '// 戻り値:True=チェックOK、False=チェックNG Function chkDoubleByteChar(r As Range) As Boolean Dim rCell As Range '// 処理対象セル Dim ret As Boolean '// 関数戻り値 Dim sASCII As String Dim sCell As String Dim iLenASCII As Long Dim iLenUNICODE As Long For Each rCell In r '// セルの文字列とそれをASCII変換した文字列を取得 sCell = rCell.Value sASCII = StrConv(sCell, vbFromUnicode) '// それぞれの文字列長を取得 iLenUNICODE = Len(sCell) * 2 iLenASCII = LenB(sASCII) '// 全角文字だけでない場合 If (iLenUNICODE <> iLenASCII) Then chkDoubleByteChar = False Exit Function End If Next chkDoubleByteChar = True End Function |
使い方
1 2 3 4 5 6 |
Sub chkDoubleByteCharTest() Dim ret As Boolean ret = chkDoubleByteChar(Selection) Debug.Print ret End Sub |
7. 半角のみチェック
文字列が半角のみかをチェックします。
文字コードの理屈については全角のみチェックと同じです。
全角文字のチェックで15行目で2倍していた部分が無くなっただけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
'// 引数1:指定セル範囲 '// 戻り値:True=チェックOK、False=チェックNG Function chkHalfByteChar(r As Range) As Boolean Dim rCell As Range '// 処理対象セル Dim ret As Boolean '// 関数戻り値 Dim sASCII As String Dim sCell As String Dim iLenASCII As Long Dim iLenUNICODE As Long For Each rCell In r '// セルの文字列とそれをASCII変換した文字列を取得 sCell = rCell.Value sASCII = StrConv(sCell, vbFromUnicode) '// それぞれの文字列長を取得 iLenUNICODE = Len(sCell) iLenASCII = LenB(sASCII) '// 半角文字だけでない場合 If (iLenUNICODE <> iLenASCII) Then chkHalfByteChar = False Exit Function End If Next chkHalfByteChar = True End Function |
使い方
1 2 3 4 5 6 |
Sub chkHalfByteCharTest() Dim ret As Boolean ret = chkHalfByteChar(Selection) Debug.Print ret End Sub |
8. 数字のみチェック
数字のみかどうかを正規表現でチェックしています。
コードでは半角数字のみを対象としていますが、全角数字も対象としたい場合は”^[0-9]+$”を”^[0-90-9]+$”としてください。ブラウザではわかりにくい場合がありますが追加している0-9の数字は全角です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
'// 引数1:指定セル範囲 '// 戻り値:True=チェックOK、False=チェックNG Function chkNumeric(r As Range) As Boolean Dim rCell As Range '// 処理対象セル Dim ret As Boolean '// 関数戻り値 Dim reg As New RegExp '// 正規表現クラスオブジェクト '// 検索条件=数字のみ形式を抽出 reg.Pattern = "^[0-9]+$" '// 文字列の最後まで検索する reg.Global = True For Each rCell In r '// 数字のみではない場合 If reg.Test(rCell.Value) = False Then chkNumeric = False Exit Function End If Next chkNumeric = True End Function |
使い方
1 2 3 4 5 6 |
Sub chkNumericTest() Dim ret As Boolean ret = chkNumeric(Selection) Debug.Print ret End Sub |
9. 英字のみチェック
数字のみのチェックと同様に正規表現でチェックしています。
コードでは大文字と小文字の両方を対象としていますが、大文字のみにしたい場合などは正規表現の条件から不要な部分を削除してください。
大文字のみであれば「”^[A-Z]+$”」、小文字のみであれば「”^[a-z]+$”」としてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
'// 引数1:指定セル範囲 '// 戻り値:True=チェックOK、False=チェックNG Function chkAlphabet(r As Range) As Boolean Dim rCell As Range '// 処理対象セル Dim ret As Boolean '// 関数戻り値 Dim reg As New RegExp '// 正規表現クラスオブジェクト '// 検索条件=英字のみ形式を抽出 reg.Pattern = "^[A-Za-z]+$" '// 文字列の最後まで検索する reg.Global = True For Each rCell In r '// 英字のみではない場合 If reg.Test(rCell.Value) = False Then chkAlphabet = False Exit Function End If Next chkAlphabet = True End Function |
使い方
1 2 3 4 5 6 |
Sub chkAlphabetTest() Dim ret As Boolean ret = chkAlphabet(Selection) Debug.Print ret End Sub |
“VBAでセルなどの入力チェックを行う” への1件のフィードバック