17.変更処理の作成
変更処理のフロー 変更処理は、フォーム「登録内容変更」で入力されたプロフィール情報を使ってアドレス帳テーブルのレコードを更新するための処理です。フォーム上の[変更]ボタンをクリックするとアドレス帳テーブルのレコードを更新し、[キャンセル]をクリックしたときは(入力した内容を)破棄し変更処理を終了することができます。

ただし、入力した内容にはミスがあるかもしれません。そのため、レコードを変更する前には入力内容のチェックを行い、入力内容に問題がなければレコードを変更するようにします。
変更処理の作成
ここでは、フォーム「登録内容変更」のボタン[変更]へVBAコードを記述します。まずは、フォーム「登録内容変更」をデザインビューで開いて下さい。

フォーム「登録内容変更」をデザインビューで開いたら、ボタン[変更]のイベント「クリック時」へVBAコードを記述する準備を(プロパティウィンドウで「クリック時」を選択しをクリック)しましょう。

登録処理は、「1.入力されている内容をチェック」、「2.エラーがなければフォームに入力されている内容を使って呼び出しているレコードを更新」です。変更処理でのポイントはSQLを組み立てる部分(ここではUPDATEを使用)で、SQLの実行や一覧の再表示などの基本的な部分は登録処理の応用です。

VBAコードを記述したら、変更処理が正常に動作するか確認してみよう。手順は、フォーム「アドレス帳メニュー」をフォームビューで開き、一覧のレコードセレクタをダブルクリックし、フォーム「登録内容変更」を開きます。プロフィール情報を入力し、最後にボタン[変更]をクリックしましょう。アドレス帳メニューの一覧に表示されているレコードも同じように変更されているはずです。

 ■イベントプロシージャ「変更_Click」の作成例
Private Sub 変更_Click()

    '16.データ呼び出し処理の作成
    '記述先:フォーム[登録内容変更]/フォーム[開く時]

    Dim objDB  As New MDBAccess 'データベース操作クラス
    Dim strSQL As String        'SQL組み立て用
    Dim lngCurrent As Long      'Requery前に選択していたレコード番号の保存用

    '入力内容のチェックを行います
    If InputCheck() = True Then

       'SQLの組み立て。レコードの特定は、フィールド「レコードキー」で。
       strSQL = ""
       strSQL = strSQL _
              & "UPDATE  アドレス帳テーブル" _
              & "   SET  漢字氏名 = '" & 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 & "'" _
              & "       ,FAX番号 = '" & Me.FAX番号.Value & "'" _
              & "       ,携帯等電話番号 = '" & Me.携帯等電話番号.Value & "'" _
              & "       ,PCメールアドレス = '" & Me.PCメールアドレス.Value & "'" _
              & "       ,携帯メールアドレス = '" & Me.携帯メールアドレス.Value & "'" _
              & "       ,備考 = '" & Me.備考.Value & "'" _
              & " WHERE  レコードキー = " & Me.レコードキー.Value

       'トランザクション開始
       objDB.BeginTrans

       '更新の実行と結果判定
       If objDB.ExecSQL(strSQL) = True Then

          '更新が成功したときはコミット
          objDB.Commit
          '更新完了メッセージ
          MsgBox "プロフィールを更新しました!", vbOKOnly + vbInformation, "更新完了"
          'フォームを閉じる
          DoCmd.Close acForm, "登録内容変更"

          'メニューの一覧で現在選択しているレコード番号の取得
          lngCurrent = Forms("アドレス帳メニュー").一覧.Form.CurrentRecord
          'メニューの一覧を更新する
          Forms("アドレス帳メニュー").一覧.Form.Requery
          'レコードを移動
          DoCmd.GoToRecord acActiveDataObject, , acGoTo, lngCurrent

       Else

          '更新が失敗しっときはロールバック
          objDB.Rollback
          '更新失敗メッセージ
          MsgBox "DBエラーが発生しました", vbOKOnly + vbExclamation, "更新失敗"

       End If

    End If

End Sub
 ※これは、Access VBAです。

■このプロシージャの解説

更新対象のレコードを指定するWHERE句では、隠しテキストボックス(レコードキーの値を持っているテキストボックス)の値を使っています。


              & " WHERE  レコードキー = " & Me.レコードキー.Value


アドレス帳メニューの一覧を更新するためにRequeryを実行しますが、Requeryを実行するとレコードの選択が解除されてしまい、どのレコードを変更したのか探すのに手間がかかります。そのため、最初にフォームのプロパティ「CurrentRecord」を使って現在選択しているレコード(の番号)を取得、Requeryを実行した後に、DoCmd.GoToRecordを使ってそれまで選択していたレコードへジャンプ(再度選択)する処理を行っています。


          'メニューの一覧で現在選択しているレコード番号の取得
          lngCurrent = Forms("アドレス帳メニュー").一覧.Form.CurrentRecord
          'メニューの一覧を更新する
          Forms("アドレス帳メニュー").一覧.Form.Requery
          'レコードを移動
          DoCmd.GoToRecord acActiveDataObject, , acGoTo, lngCurrent

ボタン「キャンセル」のイベントプロシージャ作成
ここでは、フォーム「登録内容変更」のボタン[キャンセル]へVBAコードを記述します。まずは、フォーム「登録内容変更」をデザインビューで開いて下さい。

ボタン[キャンセル]は、変更作業の中断です。この処理も、ほとんどの部分が登録処理で作成したVBAコードと同じなので、特に説明はいらないでしょう。

 ■イベントプロシージャ「キャンセル_Click」の作成例
Private Sub キャンセル_Click()

    '17.変更処理の作成
    '記述先:フォーム[登録内容変更]/ボタン[キャンセル]/[クリック時]

    '中断の確認
    If MsgBox("変更を中断しますか?", vbYesNo + vbExclamation, "中断の確認") = vbYes Then
       'ダイアログで[はい]をクリックしたときだけフォームを閉じます
       DoCmd.Close acForm, "登録内容変更"
    End If

End Sub
 ※これは、Access VBAです。

VBAコードを記述したら、取り消しが正常に動作するか確認してみよう。手順は、フォーム「アドレス帳メニュー」を開き、ボタン[新規登録]をクリック、フォーム「新規登録」でボタン[キャンセル]をクリックし、フォームが閉じればOK!
次は「削除処理」です
変更処理の作成が終わったら、いったんフォームやVisual Basic Editorを全て閉じ「18.削除処理の作成」へ進みましょう!

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