VBAで正規表現や関数を使った入力チェックを行い、Accessに新規レコードを追加、保存するには:Access VBAで学ぶ初心者のためのデータベース/SQL超入門(4)(4/5 ページ)
Accessを通じて、初心者がリレーショナルデータベースやSQLの基本を学び、データベースを使った簡単なシステムの作り方を習得する本連載。今回は、VBEの起動とデータ入力用フォームの作成、VBAを使った入力用コードやデータの検証処理を記述する方法を解説する。
不正入力対応
「データ入力フォーム」の基本のプログラムを記述し、処理を指定した。しかしこのプログラムには三つの問題点がある。
- 「年齢」に数値以外のデータが入力された場合はどうするか
- 「電話番号」に電話番号以外の形式でデータが入力されたらどうするか
- 「郵便番号」に郵便番号以外の形式でデータが入力されたらどうするか
これらの問題を解決する処理を、リスト1のVBAのコードに追加していく。
「年齢」に数値以外のデータが入力された場合の処理
「年齢テキストボックス」に入力された値が数値かどうかを判定するには、「IsNumeric関数」を使用する。IsNumeric関数は、値が数値として評価できるかどうかを調べ、結果を「ブール値」で返す。数値として認識できる場合は「True」、それ以外は「False」を返す。
この関数を使って「VBA」を書くとリスト2のようになる。
If IsNumeric(年齢テキストボックス.Value) = False Then MsgBox ("数値を入力してください。") Exit Sub Else myRecordset("年齢") = Me.年齢テキストボックス End If
入力された値が数値ではない場合は、警告メッセージを出して処理を抜け、数値の場合は、「年齢」フィールドに「年齢テキストボックス」の値を登録する。
ここの処理では、下記の「制御構文」を使用している
If 条件式 Then 処理1 Else 処理2 End If
条件式によって処理を分岐する。条件式が成立すれば「処理1」を実行し、条件式が成立しなかったら「処理2」を実行する。
「電話番号」に電話番号以外の形式でデータが入力された場合の処理
次は「電話番号」の処理だ。電話番号の形式にのっとった値が入力されたか判別して処理を分ける。
ここでは「正規表現」を使用する。それには、VBEにある設定をする必要がある。
まずVBEメニューの「ツール」から「参照設定」を選択する。そこで表示された画面の「参照可能なライブラリ ファイル」から「Microsoft VBScript Regular Expression 5.5」を選択して[OK]ボタンをクリックする(図8)。
これで「正規表現」が使用できるようになったので、リスト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
- 「正規表現」を表すクラスであるRegExpクラス型の変数「myRegEx」を宣言する(1)。
- 次に、「正規表現」にのっとっているかどうかの結果を格納するブール型変数、「regCheck変数」を宣言する(2)。
- 新しいRegExpクラスのインスタンスを作成し、「Set文」を使ってmyRegExに設定する(3)。Set文はオブジェクト変数にオブジェクトを設定する場合に使用する。
- 「RegEx.patternプロパティ」を使って「正規表現」で使用するパターンを設定する(4)。ここで指定している「\d{2,4}-\d{2,4}-\d{4}」は「電話番号の形式」を表す「正規表現」だ。
- Testメソッドで、「電話テキストボックス」の値が、指定した「正規表現」にのっとっているかどうかを判別し(5)、結果を変数regCheckに格納する。
- regCheckの値が「False」の場合は、入力されたデータが、「電話番号」形式にのっとっていないので、警告メッセージを表示して処理を抜ける(6)。それ以外の場合は、「電話番号」フィールドに「電話テキストボックス」の値を登録する(7)。
「郵便番号」に郵便番号以外の形式でデータが入力された場合の処理
次は「郵便番号」に郵便番号以外の形式でデータが入力された場合の処理を設定する。
「郵便番号」に形式以外のデータが入力されたときの処理はリスト4だ。同じく「正規表現」を使用する。リスト3とほとんど同じだが、正規表現だけが異なる。
myRegEx.Pattern = " ^[0-9]{3}[\-]?[0-9]{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
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- どんなビジネスにも欠かせないリレーショナルデータベースの基礎知識と作り方――テーブル、レコード、フィールド、主キーとは
Accessを通じて、初心者がリレーショナルデータベースやSQLの基本を学び、データベースを使った簡単なシステムの作り方を習得する本連載。初回はデータベースの基本を理解し、Accessを使い始めてみよう - Access VBAでデータ入力フォームを作り、各コントロールを追加するためのデザインビューの使い方
今回は、テーブルを基にデータ入力フォームを作成し、ラベル、テキストボックス、コンボボックス、ボタンリストボックスを追加する手順を解説する - SQLとはどういう言語か
- Accessを使うなら最低限知っておきたいSQL文を使ったさまざまな種類のクエリ操作の基本
今回は、テーブルに「SELECT文」や「BETWEEN演算子」などのSQLを入力し、データベースに蓄積したレコードを抽出する方法を解説する - 初心者でも図解で分かる! VBEの基本的な使い方とVBAプログラムの基礎文法
- Accessでフォームからデータを追加し、Excelのシートにエクスポートする
- SQLとはどういう言語か
- 数値判定、乱数発生、数値の丸めなど、数値に関する4つの関数の使い方
- 制御文で道案内
- 使うほどに良さが分かる正規表現
- .NET Frameworkがサポートする正規表現クラスを徹底活用する(前編)
- .NET Frameworkがサポートする正規表現クラスを徹底活用する(後編)