こんにちは、なかぜんです。
Accessで本格的な業務システムを構築していると、「フォームの動作が重い」「一部のデータしか更新したくないのに全部ロックされる」といった悩みに直面すること、ありませんか?
今回は、そんな悩みを解消できる「非連結フォーム設計」についてご紹介します。業務システムに柔軟性と安定性をもたらすこの設計手法、ぜひ習得しておきましょう!
非連結フォームとは?
「連結」と「非連結」の違い
Accessのフォームには、コントロールをテーブルやクエリと「連結」させて自動的にデータを反映させる方法が一般的です。一方、「非連結」フォームは、データソースを持たず、すべての入力・出力・更新処理をVBAコードで制御します。
なぜ非連結設計を使うのか
- パフォーマンスの向上(特に大量データ環境)
- 複雑な入力制御やバリデーションの実現
- トランザクション処理による整合性確保
- 同時編集・ロック競合のリスク低減
非連結フォームの実装方法
フォームの構造設計
データを直接表示するサブフォームなどは使わず、主にテキストボックスやコンボボックスを配置します。フォームの「レコードソース」プロパティは空にしておくのが基本です。
VBAでのロード処理
' 初期表示処理(データ読込)
Private Sub Form_Load()
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT * FROM T_顧客 WHERE 顧客ID = 1")
If Not rs.EOF Then
Me.txt顧客名.Value = rs!顧客名
Me.txt電話番号.Value = rs!電話番号
End If
rs.Close
Set rs = Nothing
End Sub
解説:
フォーム読み込み時に必要なレコードをDAOで取得し、コントロールに手動で値を設定しています。これにより、不要なレコードの読込やロックが発生しません。
保存処理の実装
' 保存ボタンでデータ更新
Private Sub btn保存_Click()
Dim strSQL As String
strSQL = "UPDATE T_顧客 SET 顧客名 = '" & Me.txt顧客名 & "', 電話番号 = '" & Me.txt電話番号 & "' WHERE 顧客ID = 1"
CurrentDb.Execute strSQL, dbFailOnError
MsgBox "保存しました!", vbInformation
End Sub
解説:
ボタンを使って明示的にUPDATE文を発行しています。ユーザーが意図したタイミングでのみデータが更新されるので、ミスや誤操作の防止にもつながります。
注意点とよくあるミス
- DAOやSQL発行のエラー処理をしっかり入れること(例:dbFailOnError)
- トランザクション管理が必要なケースでは、BeginTrans/CommitTransを活用
- NULL値や未入力状態の考慮を忘れずに
- 全体の更新対象が明示的であることを意識(誤UPDATEに注意)
応用ポイント:複数フォーム連携や一時保存
非連結設計を活かすと、以下のような応用も可能になります。
- 複数フォームの連携:フォームAで入力→フォームBで確定など
- 一時保存と本保存の分離:一時テーブルや配列でステージング管理
- Excel連携:フォーム内容を即座にExcelへ出力しやすい
まとめ:非連結設計でAccessフォームをもっと自由に
今回は、Accessフォームの非連結設計について詳しく解説しました。
- 読み込みや保存をVBAで完全コントロールできる
- ユーザー操作の安全性と柔軟性が高まる
- パフォーマンス改善にもつながる
非連結設計は最初こそ手間に感じるかもしれませんが、一度身につけるとフォームの設計が格段に自由になります。「今のフォーム、ちょっと使いづらいかも…」と思ったら、ぜひ一部でも非連結方式を取り入れてみてくださいね。
それでは、また次の記事でお会いしましょう。
¥2,420 (2025/05/28 21:29時点 | Amazon調べ)
