PR

【Access VBA】一覧フォームから編集フォームを呼び出しデータを更新する

VBA

Accessを使用して住所録の一覧をフォームで表示し、「編集」ボタンをクリックすると編集フォームが開き、「登録」ボタンを押すとテーブルデータを更新する仕組みを作成します。

スポンサーリンク

完成イメージ

① 住所録の一覧フォームを作成します。

  「編集」ボタンをクリックすると別ウインドウで編集フォームが開きます。

AccessVBA-一覧フォームの完成イメージ
F_一覧フォームの完成イメージ 変更前(レイアウトビュー表示)

② 「編集」ボタンをクリックすると立ち上がる編集フォーム。

  変更箇所を修正して「登録」ボタンをクリックするとデータを更新します。

AccessVBA-編集フォームの完成イメージ-変更前と変更後
F_編集フォームの完成イメージ 変更前→変更後(レイアウトビュー表示)

③ 「登録」ボタンをクリックしたあとの画面。

編集フォームが閉じて一覧フォームに戻ります。 「修正が完了しました」のメッセージが出力されて変更点が一覧フォームに反映されています。

AccessVBA-一覧フォームの完成イメージ-変更後
F_一覧フォームの完成イメージ 変更後(レイアウトビュー表示)
スポンサーリンク

作成するもの(全体像)

Access内に以下のテーブル・クエリ・フォームを作成します。
上のテーブルから順に用意していきます。

① T_data(テーブル)
② Q_data(クエリ)
③ F_一覧(フォーム)
④ F_編集(フォーム)
⑤ F_一覧(フォーム)の「編集」ボタンクリック時のVBA作成
⑥ F_編集(フォーム)の「登録」ボタンクリック時のVBA作成

スポンサーリンク

① T_dataテーブルの作成

今回はExcelでデータを用意し、Accessへインポートして住所録データのテーブルを作成しました。
※住所録データの内容はダミーデータ生成サイトで作成した実在しないデータです。

AccessVBA-T_dataテーブルのデータシートビュー表示
T_dataテーブルのデータシートビュー表示

ID列はデータ更新時のKEYに使用するため、オートナンバー型で作成しています。

AccessVBA-T_dataテーブルのデザインビュー表示
T_dataテーブルのデザインビュー表示

作成したテーブルは保存して閉じておいてください。

スポンサーリンク

② Q_data(クエリ)の作成

①で作成したT_dataテーブルを元にクエリを作成します。
新規でクエリを作成し、T_dataのフィールドをセットするだけでOKです。

AccessVBA-Q_一覧クエリのデザインビュー表示
Q_一覧クエリのデザインビュー表示

作成したクエリは保存して閉じておいてください。

スポンサーリンク

③ F_一覧(フォーム)の作成

②で作成したQ_dataクエリを元にした一覧フォームを作成します。

帳票フォームのプロパティでレコードソースを「Q_data」を選択します。

AccessVBA-F_一覧フォームのデザインビュー表示(フォームのプロパティ)
F_一覧フォームのデザインビュー表示(フォームのプロパティ)

左端に「編集」ボタンを作成し、IDから順に横並びにテキストボックスを配置します。
名前はフィールド名と同じ名前で設定しています。

AccessVBA-F_一覧フォームのデザインビュー表示(テキストボックスのプロパティ)
F_一覧フォームのデザインビュー(テキストボックスのプロパティ)

後程⑤の手順で編集ボタンのVBAを作成します。
この時点ではまだ編集ボタンは押しても何も反応しませんが、一旦レイアウトビュー表示にしてみます。

↓のようになります。

AccessVBA-F_一覧フォームのレイアウトビュー表示
F_一覧フォームのレイアウトビュー表示

作成したフォームは一旦保存して閉じておいてください。

スポンサーリンク

④ F_編集(フォーム)

③の編集ボタンクリック時のVBAはまだ作成せず、続いて先にもう1つのフォームを作成します。

今回はテキストボックスを非連結で配置し、値の反映はVBAを使用して反映させます。

また右上に「登録」ボタンを配置します。「登録」ボタンをクリックすると①で作成した「T_data」テーブルの値を上書きで更新するようにします。VBAの作成方法は手順⑥で紹介します。

AccessVBA-F_一覧フォームのデザインビュー表示
F_編集フォームのデザインビュー表示

作成したフォームは一旦保存して閉じておいてください。

スポンサーリンク

⑤ 一覧フォームから編集フォームを開くVBAの作成

手順③で作成した「F_一覧」フォームの「編集」ボタンをクリックしたときの動きをVBAで作成していきます。

まずは「F_一覧」フォーム側に選択したデータのIDを「F_編集」フォームに受け渡しながら「F_編集」フォームを開くコードを記述します。

「F_一覧」フォームを開いてデザインビュー表示にして、「編集」ボタンのプロパティでクリック時に動くマクロを設定します。

AccessVBA-F_一覧フォームのデザインビュー表示(編集ボタンのプロパティ)
F_一覧フォームのデザインビュー表示(編集ボタンのプロパティ)

「イベント」タブの「クリック時」の右にある「…」を押して、ビルダーの選択ウィンドウで「コードビルダー」を選択します。

AccessVBA-F_ビルダーの選択ウィンドウ
ビルダーの選択ウィンドウ

「コードビルダー」を選択して「OK」を押すとVBAの編集画面が開きます。

「編集」ボタンをクリックしたら「F_編集」フォームを開き、選択したIDのデータを表示させるようにするため、フォームのオープンメソッドでIDを引数に設定します。

AccessVBA-F_一覧の編集ボタンクリック時のコード
F_一覧の編集ボタンクリック時のコード

↓コードはこちらからコピーできます。

Private Sub 編集ボタン_Click()

 '一覧フォームを開く
 DoCmd.OpenForm "F_編集", acNormal, , , , acDialog, Me.ID

End Sub

コードを記述したら「F_一覧」フォームは保存して閉じてOKです。

さらに次は「F_編集」フォーム側にフォームを開くときの動きを作成していきます。
「F_編集」フォームのフォームのプロパティから「読み込み時」の動きを作成します。

はじめに作成したVBAで「F_一覧」フォームからIDの値を受け取り、IDの値を使用して「T_data」テーブルからSQLで値を抽出し、「F_編集」フォームに反映していきます。

AccessVBA-F_編集フォームを開くときのコード-VBE画面
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_一覧」を再表示させています。※一覧フォームの値は再読み込みさせないとデータ更新前の情報になってしまいます。

AccessVBA-F_編集フォームで登録ボタンをクリックしたときのコード-VBE画面
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パターンにすぎませんが、フォーム同士を連携させたデータ更新の際には使い勝手が良いので今回の方法をよく使用しています。

kufuuさん
kufuuさん

Excelのユーザーフォームを使用して同じ動作を行う方法はこちら↓の記事で紹介しています。

スポンサーリンク

※コードのコピー利用について

・コードのコピーは自由におこなっていただけます。
・気を付けて作成はしていますがコードには誤りがある可能性があります。
・自身の環境で動作確認をしていますが、すべての方の環境で同様に動くことは保証できません。
・データの破損等の責任は負いかねますのでご自身の責任のもとお使いください。

タイトルとURLをコピーしました