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コードを記述したら、フォームが開くかどうかを確認してみよう。フォーム「アドレス帳メニュー」をフォームビューで開き、[新規登録]ボタンをクリックしてください。フォーム「新規登録」が開くはずです。
標準モジュールの新規作成
次は、入力内容をチェックする処理の作成です。この処理は「標準モジュール」へ作成しますので、標準モジュールの追加と名前の設定を行って下さい。ちなみに、標準モジュールの名前は「ADRCommon」にします。

もし、標準モジュールの新規作成方法や名前の設定方法が分からない…という場合でも安心!ここに標準モジュールを新規作成する手順と名前を変更する方法(別ウィンドウで開きます)があります。
入力内容チェック処理「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.データ呼び出し処理の作成」へ進みましょう!

ちなみに、閉じるときは保存も忘れずに…
Copyright(C) 1999-2006 結城圭介。 All rights reserved