Accessを使用して住所録の一覧をフォームで表示し、「編集」ボタンをクリックすると編集フォームが開き、「登録」ボタンを押すとテーブルデータを更新する仕組みを作成します。
完成イメージ
① 住所録の一覧フォームを作成します。
「編集」ボタンをクリックすると別ウインドウで編集フォームが開きます。
② 「編集」ボタンをクリックすると立ち上がる編集フォーム。
変更箇所を修正して「登録」ボタンをクリックするとデータを更新します。
③ 「登録」ボタンをクリックしたあとの画面。
編集フォームが閉じて一覧フォームに戻ります。 「修正が完了しました」のメッセージが出力されて変更点が一覧フォームに反映されています。
作成するもの(全体像)
Access内に以下のテーブル・クエリ・フォームを作成します。
上のテーブルから順に用意していきます。
① T_data(テーブル)
② Q_data(クエリ)
③ F_一覧(フォーム)
④ F_編集(フォーム)
⑤ F_一覧(フォーム)の「編集」ボタンクリック時のVBA作成
⑥ F_編集(フォーム)の「登録」ボタンクリック時のVBA作成
① T_dataテーブルの作成
今回はExcelでデータを用意し、Accessへインポートして住所録データのテーブルを作成しました。
※住所録データの内容はダミーデータ生成サイトで作成した実在しないデータです。
ID列はデータ更新時のKEYに使用するため、オートナンバー型で作成しています。
作成したテーブルは保存して閉じておいてください。
② Q_data(クエリ)の作成
①で作成したT_dataテーブルを元にクエリを作成します。
新規でクエリを作成し、T_dataのフィールドをセットするだけでOKです。
作成したクエリは保存して閉じておいてください。
③ F_一覧(フォーム)の作成
②で作成したQ_dataクエリを元にした一覧フォームを作成します。
帳票フォームのプロパティでレコードソースを「Q_data」を選択します。
左端に「編集」ボタンを作成し、IDから順に横並びにテキストボックスを配置します。
名前はフィールド名と同じ名前で設定しています。
後程⑤の手順で編集ボタンのVBAを作成します。
この時点ではまだ編集ボタンは押しても何も反応しませんが、一旦レイアウトビュー表示にしてみます。
↓のようになります。
作成したフォームは一旦保存して閉じておいてください。
④ F_編集(フォーム)
③の編集ボタンクリック時のVBAはまだ作成せず、続いて先にもう1つのフォームを作成します。
今回はテキストボックスを非連結で配置し、値の反映はVBAを使用して反映させます。
また右上に「登録」ボタンを配置します。「登録」ボタンをクリックすると①で作成した「T_data」テーブルの値を上書きで更新するようにします。VBAの作成方法は手順⑥で紹介します。
作成したフォームは一旦保存して閉じておいてください。
⑤ 一覧フォームから編集フォームを開くVBAの作成
手順③で作成した「F_一覧」フォームの「編集」ボタンをクリックしたときの動きをVBAで作成していきます。
まずは「F_一覧」フォーム側に選択したデータのIDを「F_編集」フォームに受け渡しながら「F_編集」フォームを開くコードを記述します。
「F_一覧」フォームを開いてデザインビュー表示にして、「編集」ボタンのプロパティでクリック時に動くマクロを設定します。
「イベント」タブの「クリック時」の右にある「…」を押して、ビルダーの選択ウィンドウで「コードビルダー」を選択します。
「コードビルダー」を選択して「OK」を押すとVBAの編集画面が開きます。
「編集」ボタンをクリックしたら「F_編集」フォームを開き、選択したIDのデータを表示させるようにするため、フォームのオープンメソッドでIDを引数に設定します。
↓コードはこちらからコピーできます。
Private Sub 編集ボタン_Click()
'一覧フォームを開く
DoCmd.OpenForm "F_編集", acNormal, , , , acDialog, Me.ID
End Sub
コードを記述したら「F_一覧」フォームは保存して閉じてOKです。
さらに次は「F_編集」フォーム側にフォームを開くときの動きを作成していきます。
「F_編集」フォームのフォームのプロパティから「読み込み時」の動きを作成します。
はじめに作成したVBAで「F_一覧」フォームからIDの値を受け取り、IDの値を使用して「T_data」テーブルからSQLで値を抽出し、「F_編集」フォームに反映していきます。
↓コードはこちらからコピーできます。
Private Sub Form_Load()
If IsNull(Me.OpenArgs) = False Then
Me.tb_ID.Value = Me.OpenArgs
'変数定義
Dim db As DAO.Database
Dim Rst As DAO.Recordset
Dim sql As String
Dim nRet As Long
'コネクションオープン
Set db = CurrentDb
sql = "select * from T_data where ID=" & Me.tb_ID.Value
Set Rst = db.OpenRecordset(sql)
'レコードから値を取得
With Rst
Me.tb_所属部門 = Rst!所属部門
Me.tb_氏名 = Rst!氏名
Me.tb_ふりがな = Rst!ひらがな
Me.tb_生年月日 = Rst!生年月日
Me.cb_性別 = Rst!性別
Me!tb_メールアドレス = Rst!メールアドレス
Me!tb_郵便番号 = Rst!郵便番号
Me!tb_住所 = Rst!住所
End With
'クローズ処理
Rst.Close
Set Rst = Nothing
End If
End Sub
コードを記述して「F_編集」フォームを保存して閉じると「F_一覧」フォームで「編集」ボタンをクリックしたときの動きを確認することができます。
⑥ 編集フォームで登録ボタンをクリックしたときのデータ更新VBAの作成
さいごに「F_編集」フォームの「登録」ボタンをクリックしたときの動きを作成します。
「登録」ボタンをクリックするとフォームに入力された値を「T_data」テーブルへ反映します。
IDをキーにSQLでデータを選択し、値を更新させるコードです。
値の更新後は「F_編集」フォームを閉じて、完了メッセージを出力し、「F_一覧」を再表示させています。※一覧フォームの値は再読み込みさせないとデータ更新前の情報になってしまいます。
↓コードはこちらからコピーできます。
Private Sub bt_登録_Click()
'変数定義
Dim db As DAO.Database
Dim Rst As DAO.Recordset
Dim sql As String
Dim nRet As Long
'コネクションオープン
Set db = CurrentDb
sql = "select * from T_data where ID=" & Me.tb_ID.Value
Set Rst = db.OpenRecordset(sql)
'レコードを更新
With Rst
.Edit
Rst!所属部門 = Me.tb_所属部門
Rst!氏名 = Me.tb_氏名
Rst!ひらがな = Me.tb_ふりがな
Rst!生年月日 = Me.tb_生年月日
Rst!性別 = Me.cb_性別
Rst!メールアドレス = Me.tb_メールアドレス
Rst!郵便番号 = Me.tb_郵便番号
Rst!住所 = Me.tb_住所
Rst.Update
End With
'クローズ処理
Rst.Close
Set Rst = Nothing
'編集フォームを閉じる
DoCmd.Close acForm, "F_編集"
'一覧フォームを再読込みする
Forms!F_一覧!.Form.Requery
'完了メッセージ
MsgBox "修正が完了しました。"
End Sub
ここまで終わったら「F_編集」フォームを保存して閉じて作業は完了です。
一連の操作ができるか試してみましょう。
補足
本格的に住所録等のデータベースを作成していく場合は新規登録ボタンを作ったり、必要な値が入っているかのチェックを作ったり、もっと作りこむ必要がありますが、今回はサンプルとしてデータ更新だけを行う仕様にしています。
データの更新方法も実際は色々な作成方法があり、今回ご紹介した方法は1パターンにすぎませんが、フォーム同士を連携させたデータ更新の際には使い勝手が良いので今回の方法をよく使用しています。
Excelのユーザーフォームを使用して同じ動作を行う方法はこちら↓の記事で紹介しています。
※コードのコピー利用について
・コードのコピーは自由におこなっていただけます。
・気を付けて作成はしていますがコードには誤りがある可能性があります。
・自身の環境で動作確認をしていますが、すべての方の環境で同様に動くことは保証できません。
・データの破損等の責任は負いかねますのでご自身の責任のもとお使いください。