VBAで正規表現や関数を使った入力チェックを行い、Accessに新規レコードを追加、保存するにはAccess VBAで学ぶ初心者のためのデータベース/SQL超入門(4)(4/5 ページ)

» 2015年09月01日 05時00分 公開
[薬師寺国安PROJECT KySS]

不正入力対応

 「データ入力フォーム」の基本のプログラムを記述し、処理を指定した。しかしこのプログラムには三つの問題点がある。

  1. 「年齢」に数値以外のデータが入力された場合はどうするか
  2. 「電話番号」に電話番号以外の形式でデータが入力されたらどうするか
  3. 「郵便番号」に郵便番号以外の形式でデータが入力されたらどうするか

 これらの問題を解決する処理を、リスト1のVBAのコードに追加していく。

「年齢」に数値以外のデータが入力された場合の処理

 「年齢テキストボックス」に入力された値が数値かどうかを判定するには、「IsNumeric関数」を使用する。IsNumeric関数は、値が数値として評価できるかどうかを調べ、結果を「ブール値」で返す。数値として認識できる場合は「True」、それ以外は「False」を返す。

 この関数を使って「VBA」を書くとリスト2のようになる。

If IsNumeric(年齢テキストボックス.Value) = False Then
    MsgBox ("数値を入力してください。")
    Exit Sub
Else
    myRecordset("年齢") = Me.年齢テキストボックス
End If
リスト2 「年齢テキストボックス」の値が数値かどうかを判別して処理を分ける

 入力された値が数値ではない場合は、警告メッセージを出して処理を抜け、数値の場合は、「年齢」フィールドに「年齢テキストボックス」の値を登録する。

 ここの処理では、下記の「制御構文」を使用している

If 条件式 Then
    処理1
Else
    処理2
End If

 条件式によって処理を分岐する。条件式が成立すれば「処理1」を実行し、条件式が成立しなかったら「処理2」を実行する。

「電話番号」に電話番号以外の形式でデータが入力された場合の処理

 次は「電話番号」の処理だ。電話番号の形式にのっとった値が入力されたか判別して処理を分ける。

 ここでは「正規表現」を使用する。それには、VBEにある設定をする必要がある。

 まずVBEメニューの「ツール」から「参照設定」を選択する。そこで表示された画面の「参照可能なライブラリ ファイル」から「Microsoft VBScript Regular Expression 5.5」を選択して[OK]ボタンをクリックする(図8)。

図8 「Microsoft VBScript Regular Expression 5.5」を選択する
※注 「参照設定」内に、「Microsoft VBScript Regular Expression 1.0」しか表示されていない方は、これを選択後、「参照」ボタンをクリックし、C:\Windows\System32の配下にある「vbscript.dll」を選択する。すると、「参照設定」に「Microsoft VBScript Globals」が表示され、これを選択すると「Microsoft VBScript Regular Expression 5.5」が表示される

 これで「正規表現」が使用できるようになったので、リスト3のコードを追加する。

〜コード略〜
Dim myRegEx As RegExp ≪1≫
Dim regCheck As Boolean ≪2≫
Set myRegEx = New RegExp ≪3≫
〜コード略〜
myRegEx.Pattern = "\d{2,4}-\d{2,4}-\d{4}" ≪4≫
regCheck = myRegEx.Test(電話テキストボックス.Value) ≪5≫
If regCheck = False Then
    MsgBox "電話番号が不正です。" ≪6≫
    Exit Sub
Else
    myRecordset("電話番号") = 電話テキストボックス ≪7≫
End If
リスト3 「電話番号」が電話番号の形式にのっとっているかどうかを判別する
  1. 「正規表現」を表すクラスであるRegExpクラス型の変数「myRegEx」を宣言する(1)。
  2. 次に、「正規表現」にのっとっているかどうかの結果を格納するブール型変数、「regCheck変数」を宣言する(2)。
  3. 新しいRegExpクラスのインスタンスを作成し、「Set文」を使ってmyRegExに設定する(3)。Set文はオブジェクト変数にオブジェクトを設定する場合に使用する。
  4. 「RegEx.patternプロパティ」を使って「正規表現」で使用するパターンを設定する(4)。ここで指定している「\d{2,4}-\d{2,4}-\d{4}」は「電話番号の形式」を表す「正規表現」だ。
  5. Testメソッドで、「電話テキストボックス」の値が、指定した「正規表現」にのっとっているかどうかを判別し(5)、結果を変数regCheckに格納する。
  6. regCheckの値が「False」の場合は、入力されたデータが、「電話番号」形式にのっとっていないので、警告メッセージを表示して処理を抜ける(6)。それ以外の場合は、「電話番号」フィールドに「電話テキストボックス」の値を登録する(7)。

「郵便番号」に郵便番号以外の形式でデータが入力された場合の処理

 次は「郵便番号」に郵便番号以外の形式でデータが入力された場合の処理を設定する。

 「郵便番号」に形式以外のデータが入力されたときの処理はリスト4だ。同じく「正規表現」を使用する。リスト3とほとんど同じだが、正規表現だけが異なる。

myRegEx.Pattern = " ^[0-9]{3}[\-]?[0-9]{4}$"
リスト4 「郵便番号」が「郵便番号」の形式にのっとっているかを判別する処理

 上記のコードを追加したVBAコードの全文がリスト5だ。

Option Compare Database
Option Explicit
Private Sub 登録ボタン_Click()
    '正規表現を使用可能にするには[ツール]−[参照設定]
    'からMicrosoft VBScript Regular Expressions 5.5にチェックを入れる。
    '正規表現用変数
    Dim myRegEx As RegExp
    Dim regCheck As Boolean
    Set myRegEx = New RegExp
    Dim myRecordset As DAO.Recordset
    Set myRecordset = CurrentDb.OpenRecordset("select * from 顧客管理テーブル")
    myRecordset.AddNew
    myRecordset("氏名") = 氏名テキストボックス
    myRecordset("性別") = 性別コンボボックス
    ‘IsNumeric関数で「年齢」が数値かどうかを判別
    If IsNumeric(年齢テキストボックス.Value) = False Then
        MsgBox ("数値を入力してください。")
        Exit Sub
    Else
        myRecordset("年齢") = 年齢テキストボックス
    End If
    ‘郵便番号正規表現チェック
    myRegEx.Pattern = "^[0-9]{3}[\-]?[0-9]{4}$"
    regCheck = myRegEx.Test(郵便番号テキストボックス.Value)
    If regCheck = False Then
        MsgBox "郵便番号が不正です。"
        Exit Sub
    Else
        myRecordset("郵便番号") = 郵便番号テキストボックス
    End If
    myRecordset("住所") = 住所テキストボックス
    '電話番号正規表現チェック
    myRegEx.Pattern = "\d{2,4}-\d{2,4}-\d{4}"
    regCheck = myRegEx.Test(電話テキストボックス.Value)
    If regCheck = False Then
        MsgBox "電話番号が不正です。"
        Exit Sub
    Else
        myRecordset("電話番号") = 電話テキストボックス
    End If
    myRecordset.Update
    Me.Recalc
    myRecordset.Close
    Set myRecordset = Nothing
End Sub
リスト5 「年齢」が数値かどうかの判別と、「電話番号」が電話番号の形式にのっとっているか、「郵便番号」が郵便番号の形式にのっとっているかどうかの判別処理を追加した全コード

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。