|

|
|
 |
15.登録処理の作成 |
 |
|
|
|
|
|
登録処理は、アドレス帳テーブルへ新たにプロフィールを登録するための処理です。メニューのボタン[新規登録]をクリックするとフォーム「新規登録」が現れ、ここでプロフィール情報を入力します。
入力した情報は、フォーム上の[登録]ボタンをクリックするとアドレス帳テーブルに追加され、[キャンセル]をクリックすると(入力した内容を)破棄し新規登録を終了することができます。
ただし、入力した内容にはミスがあるかもしれません。そのため、テーブルに登録する前には入力内容のチェックを行い、入力内容に問題がなければテーブルへ登録するようにします。
|
|
|
|
|
|
| フォーム「新規登録」を開く(DoCmd.OpenForm) |
|
|
|
|
ここでは、フォーム「アドレス帳メニュー」のボタン[新規登録]へVBAコードを記述します。まずは、フォーム「アドレス帳メニュー」をデザインビューで開いて下さい。
VBAを使ってフォームを開くときはDoCmd.OpenFormという命令を使います。フォーム「新規登録」は、フォーム「アドレス帳メニュー」の[登録]ボタンをクリックしたときに開くようにしますが、ボタンをクリックしたときにこの命令(VBAコード)を実行したいときは、ボタンのイベント「クリック時」というイベントプロシージャを使います。
ボタンのイベント「クリック時」へイベントプロシージャを記述するときは、プロパティウィンドウで「クリック時」を選択し、 をクリックしてください。
Visual Basic Editorが開いたら、イベントプロシージャ「新規登録_Click」へ次のようにVBAコードを記述します。
■イベントプロシージャ「新規登録_Click」の作成例
Private Sub 新規登録_Click()
'15.登録処理の作成
'記述先:フォーム[アドレス帳メニュー]/ボタン[新規登録]/[クリック時]
DoCmd.OpenForm "新規登録"
End Sub
|
※これは、Access VBAです。
VBAコードを記述したら、フォームが開くかどうかを確認してみよう。フォーム「アドレス帳メニュー」をフォームビューで開き、[新規登録]ボタンをクリックしてください。フォーム「新規登録」が開くはずです。
|
|
|
|
|
|
| 入力内容チェック処理「InputCheck」の作成 |
|
|
|
|
標準モジュールの作成が終わったら、次はFunctionプロシージャ「InputCheck」の作成です。このFunctionプロシージャは、フォーム「新規登録」または「登録内容変更」の入力チェックで、「漢字氏名、カナ氏名、性別、関係、都道府県」のいずれかのテキストボックスが入力されていない場合はMsgBox関数でその内容を表示しプロシージャの戻り値へFalseを返す。エラーがない場合はプロシージャの戻り値へTrueを返します。
このFunctionプロシージャでのポイントは、「フォーム上のコントロールはどのように参照するか」です。フォームの指定にはScreen.ActiveFormを指定していますが、これはフォーム「新規登録」と「登録内容変更」の両方から(このプロシージャを)使えるようにするための工夫です。Screen.ActiveFormでフォームを指定すれば、フォーム「新規登録」と「登録内容変更」のうち現在使っているフォーム(最前面に表示しているフォーム)のコントロールを参照してくれます。
それと、コントロールからの値の取得や値の設定はValueプロパティで行い、指定したコントロールへフォーカスを移動するときはSetFocusメソッドを実行します。
なお、フォーム上のコントロールを参照する方法については、Access VBA Tips「0.1 VBAでフォームを扱う基本」を参照してください。
■プロシージャ「InputCheck」の作成例
Function InputCheck() As Boolean
'15.登録処理の作成
'記述先:標準モジュール「ADRCommon」
'最初にFalseを設定しますが、エラーが無ければTrueに設定します
InputCheck = False
'漢字氏名の入力チェック
If IsNull(Screen.ActiveForm.漢字氏名.Value) = True Then
MsgBox "漢字氏名を入力してください", vbOKOnly + vbInformation, "入力エラー"
'漢字氏名へフォーカスを移動します
Screen.ActiveForm.漢字氏名.SetFocus
'カナ氏名の入力チェック
ElseIf IsNull(Screen.ActiveForm.カナ氏名.Value) = True Then
MsgBox "カナ氏名を入力してください", vbOKOnly + vbInformation, "入力エラー"
'漢字氏名へフォーカスを移動します
Screen.ActiveForm.カナ氏名.SetFocus
'性別の入力チェック
ElseIf IsNull(Screen.ActiveForm.性別.Value) = True Then
MsgBox "性別を選択してください", vbOKOnly + vbInformation, "入力エラー"
'性別へフォーカスを移動します
Screen.ActiveForm.性別.SetFocus
'関係の入力チェック
ElseIf IsNull(Screen.ActiveForm.関係.Value) = True Then
MsgBox "関係を選択してください", vbOKOnly + vbInformation, "入力エラー"
'関係へフォーカスを移動します
Screen.ActiveForm.関係.SetFocus
'都道府県の入力チェック
ElseIf IsNull(Screen.ActiveForm.都道府県.Value) = True Then
MsgBox "都道府県を選択してください", vbOKOnly + vbInformation, "入力エラー"
'都道府県へフォーカスを移動します
Screen.ActiveForm.都道府県.SetFocus
Else
'入力エラーが無い場合
InputCheck = True
End If
End Function
|
※これは、Access VBAです。
VBAコードを記述したら、ひとまずエラーが無いことだけを確認してください。確認するときは、Visual Basic Editorで[デバッグ]−[MDBプロジェクト名のコンパイル]で行います。
|
|
|
|
|
|
|
|
|
|
ここでは、フォーム「新規登録」のボタン[登録]へVBAコードを記述します。まずは、フォーム「新規登録」をデザインビューで開いて下さい。
フォーム「新規登録」をデザインビューで開いたら、ボタン[登録]のイベント「クリック時」へVBAコードを記述する準備を(プロパティウィンドウで「クリック時」を選択し をクリック)しましょう。
登録処理は、「1.入力されている内容をチェック」、「2.エラーがなければフォームに入力されている内容を『アドレス帳テーブル』へ追加」の順序で行います。
VBAコードを記述したら、登録処理が正常に動作するか確認してみよう。手順は、フォーム「アドレス帳メニュー」をフォームビューで開き、ボタン[新規登録]をクリック、フォーム「新規登録」でプロフィール情報を入力し、最後にボタン[登録]をクリックします。データが登録されると、アドレス帳メニューの一覧にレコードが追加されているはずです。
■イベントプロシージャ「登録_Click」の作成例
Private Sub 登録_Click()
'15.登録処理の作成
'記述先:フォーム[新規登録]/ボタン[登録]/[クリック時]
Dim objDB As New MDBAccess 'データベース操作クラス
Dim strSQL As String 'SQL組み立て用
'入力内容のチェックを行います
If InputCheck() = True Then
'SQLの組み立て
strSQL = ""
strSQL = strSQL _
& "INSERT INTO アドレス帳テーブル" _
& " (漢字氏名,カナ氏名" _
& " ,性別コード,関係コード" _
'生年月日は入力されているときだけINSERTに含める(フィールド名)
If IsNull(Me.生年月日) = False Then
strSQL = strSQL _
& " ,生年月日"
End If
strSQL = strSQL _
& " ,職業" _
& " ,郵便番号,都道府県コード,住所" _
& " ,電話番号,FAX番号,携帯等電話番号" _
& " ,PCメールアドレス,携帯メールアドレス" _
& " ,備考)" _
& "VALUES ('" & Me.漢字氏名.Value & "'" _
& " ,'" & Me.カナ氏名.Value & "'" _
& " ," & Me.性別.Value _
& " ," & Me.関係.Value
'生年月日は入力されているときだけINSERTに含める(値)
If IsNull(Me.生年月日) = False Then
strSQL = strSQL _
& " ,#" & Me.生年月日.Value & "#"
End If
strSQL = strSQL _
& " ,'" & Me.職業.Value & "'" _
& " ,'" & Me.郵便番号.Value & "'" _
& " ," & Me.都道府県.Value _
& " ,'" & Me.住所.Value & "'" _
& " ,'" & Me.電話番号.Value & "'" _
& " ,'" & Me.FAX番号.Value & "'" _
& " ,'" & Me.携帯等電話番号.Value & "'" _
& " ,'" & Me.PCメールアドレス.Value & "'" _
& " ,'" & Me.携帯メールアドレス.Value & "'" _
& " ,'" & Me.備考.Value & "'" _
& " ) "
'トランザクション開始
objDB.BeginTrans
'追加の実行と結果判定
If objDB.ExecSQL(strSQL) = True Then
'追加が成功したときはコミット
objDB.Commit
'登録完了メッセージ
MsgBox "プロフィールを登録しました!", vbOKOnly + vbInformation, "登録完了"
'フォームを閉じる
DoCmd.Close acForm, "新規登録"
'メニューの一覧を更新する
Forms("アドレス帳メニュー").Form("一覧").Form.Requery
'一覧を選択します(これを行わないとDoCmd.GoToRecordを実行できません)
Forms("アドレス帳メニュー").Form("一覧").SetFocus
'最終レコード(追加したレコード)へ移動します
DoCmd.GoToRecord acActiveDataObject, , acLast
Else
'追加が失敗しっときはロールバック
objDB.Rollback
'登録失敗メッセージ
MsgBox "DBエラーが発生しました", vbOKOnly + vbExclamation, "登録失敗"
End If
'クラスのインスタンスを破棄
Set objDB = Nothing
End If
End Sub
|
※これは、Access VBAです。
■このプロシージャの解説
入力内容のチェックは、標準モジュールへ作成したFunctionプロシージャ「InputCheck」を使って行います。実際の登録処理はInputCheckの結果が正常(True)のときだけ実行します。
'入力内容のチェックを行います
If InputCheck() = True Then
|
登録処理では、最初にSQLの組み立てを行います。テーブルへデータを追加する処理なので、組み立てるSQLはINSERTです。SQLを組み立てたら、次はこのSQLを実行してテーブルへデータを登録しましょう。このときに使用するのがデータベース操作用のクラスモジュール「MDBAccess」です。
なお、フィールド「生年月日」については、何らかの入力があった場合のみSQLへ取り込むようにしています。SQL内で日付フィールドが未入力になると値リストが「##」と編集され、これが原因でSQLエラーが発生するからです。
'SQLの組み立て
strSQL = ""
strSQL = strSQL _
& "INSERT INTO アドレス帳テーブル" _
& " (漢字氏名,カナ氏名" _
& " ,性別コード,関係コード" _
'生年月日は入力されているときだけINSERTに含める(フィールド名)
If IsNull(Me.生年月日) = False Then
strSQL = strSQL _
& " ,生年月日"
End If
strSQL = strSQL _
& " ,職業" _
& " ,郵便番号,都道府県コード,住所" _
& " ,電話番号,FAX番号,携帯等電話番号" _
& " ,PCメールアドレス,携帯メールアドレス" _
& " ,備考)" _
& "VALUES ('" & Me.漢字氏名.Value & "'" _
& " ,'" & Me.カナ氏名.Value & "'" _
& " ," & Me.性別.Value _
& " ," & Me.関係.Value
'生年月日は入力されているときだけINSERTに含める(値)
If IsNull(Me.生年月日) = False Then
strSQL = strSQL _
& " ,#" & Me.生年月日.Value & "#"
End If
strSQL = strSQL _
& " ,'" & Me.職業.Value & "'" _
& " ,'" & Me.郵便番号.Value & "'" _
& " ," & Me.都道府県.Value _
& " ,'" & Me.住所.Value & "'" _
& " ,'" & Me.電話番号.Value & "'" _
& " ,'" & Me.FAX番号.Value & "'" _
& " ,'" & Me.携帯等電話番号.Value & "'" _
& " ,'" & Me.PCメールアドレス.Value & "'" _
& " ,'" & Me.携帯メールアドレス.Value & "'" _
& " ,'" & Me.備考.Value & "'" _
& " ) "
|
クラスモジュールを使用する場合は、最初にオブジェクト変数として宣言(Dim objDB As New MDBAccess)しておきます。変数名の指定でNewを付けていますが、これは変数objDBにクラスモジュール「MDBAccess」の機能を持たせる(インスタンスを作成する)ための記述です。
Dim objDB As New MDBAccess 'データベース操作クラス
|
SQLを実行するときは、オブジェクト変数(objDB)のメソッド「ExecSQL」を使ってSQLを実行するだけですが、念のため追加前にトランザクションの開始を宣言し、SQLが正常終了(ExecSQLの結果がTrue)したらコミットを実行、失敗(ExecSQLの結果がFalse)したらロールバックを実行します。
'トランザクション開始
objDB.BeginTrans
'追加の実行と結果判定
If objDB.ExecSQL(strSQL) = True Then
'追加が成功したときはコミット
objDB.Commit
'登録完了メッセージ
MsgBox "プロフィールを登録しました!", vbOKOnly + vbInformation, "登録完了"
'フォームを閉じる
DoCmd.Close acForm, "新規登録"
'メニューの一覧を更新する
Forms("アドレス帳メニュー").Form("一覧").Form.Requery
'一覧を選択します(これを行わないとDoCmd.GoToRecordを実行できません)
Forms("アドレス帳メニュー").Form("一覧").SetFocus
'最終レコード(追加したレコード)へ移動します
DoCmd.GoToRecord acActiveDataObject, , acLast
Else
'追加が失敗しっときはロールバック
objDB.Rollback
'登録失敗メッセージ
MsgBox "DBエラーが発生しました", vbOKOnly + vbExclamation, "登録失敗"
End If
|
忘れてはいけないのがアドレス帳メニューで表示しているプロフィール一覧の更新です。テーブルと連結しているフォームやコンボボックスなどを再表示するときは、Requeryというメソッドを使います。この処理では、サブフォーム内に表示しているフォーム(登録内容一覧)をRequeryで更新しています。なお、サブフォームの指定方法はAccess VBA Tips「0.2 VBAでサブフォームを扱う基本」を参照してください。
それと、アドレス帳ツールでは、新規登録したプロフィール情報は必ず一覧の最後へ追加されます。Requeryを実行したあとは自動的に先頭レコードが選択された状態になりますが、追加したレコードがどれなのか分かるように最終レコードへ移動しておくと親切です。最終レコードへ移動するには、DoCmd.GoToRecordの第3引数へacLastを指定します。
ちなみに、DoCmd.GoToRecordを実行する前に、SetFocusを使って一覧へフォーカスを設定しているのには理由があります。これを行わないと、DoCmd.GoToRecordが失敗(実行時エラーが発生する)するのです。
'メニューの一覧を更新する
Forms("アドレス帳メニュー").Form("一覧").Form.Requery
'一覧を選択します(これを行わないとDoCmd.GoToRecordを実行できません)
Forms("アドレス帳メニュー").Form("一覧").SetFocus
'最終レコード(追加したレコード)へ移動します
DoCmd.GoToRecord acActiveDataObject, , acLast
|
フォームを閉じる処理です。フォームを閉じるときは「DoCmd.Close」を実行します。引数には、閉じるオブジェクトの種類(フォームのときはacForm)とオブジェクト名(フォーム名「新規登録」)を指定します。
'フォームを閉じる
DoCmd.Close acForm, "新規登録"
|
登録処理はフォーム「新規登録」だけに限定した処理なので、コントロールを参照するときのフォームの指定には「Me」を使用しています。
& "VALUES ('" & Me.漢字氏名.Value & "'" _
& " ,'" & Me.カナ氏名.Value & "'" _
& " ," & Me.性別.Value _
& " ," & Me.関係.Value
'生年月日は入力されているときだけINSERTに含める(値)
If IsNull(Me.生年月日) = False Then
strSQL = strSQL _
& " ,#" & Me.生年月日.Value & "#"
End If
strSQL = strSQL _
& " ,'" & Me.職業.Value & "'" _
& " ,'" & Me.郵便番号.Value & "'" _
& " ," & Me.都道府県.Value _
& " ,'" & Me.住所.Value & "'" _
& " ,'" & Me.電話番号.Value & "'" _
& " ,'" & Me.FAX番号.Value & "'" _
& " ,'" & Me.携帯等電話番号.Value & "'" _
& " ,'" & Me.PCメールアドレス.Value & "'" _
& " ,'" & Me.携帯メールアドレス.Value & "'" _
& " ,'" & Me.備考.Value & "'" _
& " ) "
|
|
|
|
|
|
|
|
|
|
|
ここでは、フォーム「新規登録」のボタン[キャンセル]へVBAコードを記述します。まずは、フォーム「新規登録」をデザインビューで開いて下さい。
ボタン[キャンセル]は、新規登録の中断です。入力されている内容をテーブルへ登録せずにフォームを閉じます。フォームを閉じる方法は、もうご存じですね!DoCmd.Closeを使います。
ちなみに、このような処理では間違えて[キャンセル]をクリックしてしまった場合を考慮してあげると親切です。閉じる前に「中断するかどうか」を訪ね、閉じる意志があるときだけフォームを閉じるようにしましょう。
■イベントプロシージャ「キャンセル_Click」の作成例
Private Sub キャンセル_Click()
'15.登録処理の作成
'記述先:フォーム[新規登録]/ボタン[キャンセル]/[クリック時]
'中断の確認
If MsgBox("新規登録を中断しますか?", vbYesNo + vbExclamation, "中断の確認") = vbYes Then
'ダイアログで[はい]をクリックしたときだけフォームを閉じます
DoCmd.Close acForm, "新規登録"
End If
End Sub
|
※これは、Access VBAです。
VBAコードを記述したら、取り消しが正常に動作するか確認してみよう。手順は、フォーム「アドレス帳メニュー」を開き、ボタン[新規登録]をクリック、フォーム「新規登録」でボタン[キャンセル]をクリックし、フォームが閉じればOK!
|
|
|
|
|
|
|
|
|
|
登録処理の作成が終わったら、いったんフォームやVisual Basic Editorを全て閉じ「16.データ呼び出し処理の作成」へ進みましょう!
ちなみに、閉じるときは保存も忘れずに…
|
|
|
|
|