なかぜんです。Accessアプリを長く・安心して運用するためには、保守性の高い設計が欠かせませんよね。「使える」だけじゃなく、「直しやすい」「拡張しやすい」を目指して、今回は上級者向けに厳選した設計テクニックを7つご紹介します。業務で即使えるコード例や具体的なヒント盛りだくさんでお届けしますので、ぜひ最後まで読んで「自分でもできそう!」を感じていただけたら嬉しいです!
目次
- 1. モジュール分割と命名規則の徹底
- 2. 共通処理用のユーティリティクラス
- 3. 定数&列挙型による魔法値の排除
- 4. エラーハンドリングの統一
- 5. コメントとドキュメント生成
- 6. フォーム設計の標準化
- 7. データモデル変更へのトレーサビリティ確保
- まとめと次のステップ
1. モジュール分割と命名規則の徹底
Accessのモジュール(標準モジュールやクラスモジュール)は「何をやるか」で整理しましょう。たとえば:
' モジュール名: modDatabaseOperations
Public Function GetCustomerByID(ByVal custID As Long) As DAO.Recordset
' 処理本体…
End Function
ポイント:
- モジュール名に「mod~」「cls~」などを統一。
- 関数名にも処理内容を明確に。「Get」「Update」「Delete」など動詞+対象。
こうすることで、どこに何があるかすぐわかる構成になります。
実際のコード例
' 標準モジュール: modUserManagement
Public Function GetUserByUserID(ByVal userID As Long) As DAO.Recordset
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb()
Set rs = db.OpenRecordset("SELECT * FROM Users WHERE UserID=" & userID)
Set GetUserByUserID = rs
End Function
※命名も整理もできていて、呼び出す側もわかりやすいですね。
2. 共通処理用のユーティリティクラス
たとえばログ出力やエラーロギング、設定管理など、繰り返し使う機能は **ユーティリティクラス** にまとめましょう。
' クラス名: clsLogger
Private m_LogFilePath As String
Public Sub Init(ByVal logPath As String)
m_LogFilePath = logPath
End Sub
Public Sub Log(msg As String)
Dim f As Integer
f = FreeFile()
Open m_LogFilePath For Append As #f
Print #f, Now & ": " & msg
Close #f
End Sub
どこでも使えるロガーが一つあると、あとからログ仕様を変更するときにも楽になります。
3. 定数&列挙型による魔法値の排除
VBAでは「魔法値(magic number)」— たとえば `If x = 1 Then …` のような意味不明な数値 — はトラブルのもとです。必ず定数や列挙型で意味付けしましょう。
Public Enum OrderStatus
osNew = 0
osInProgress = 1
osComplete = 2
End Enum
If currentStatus = osInProgress Then
' 処理
End If
こうするとコード読解が楽になりますし、後からステータスを追加・変更するときも管理しやすいです。
4. エラーハンドリングの統一
VBAでは `On Error GoTo` によるエラーハンドリングが定石ですが、処理部とログ部を統一したスタイルにしておくことで保守性が一気に上がります。
Public Sub ProcessSomething()
On Error GoTo ErrHandler
' ここに処理本体…
ExitHere:
Exit Sub
ErrHandler:
Call gLogger.Log "Error in ProcessSomething: " & Err.Number & " - " & Err.Description
Resume ExitHere
End Sub
`gLogger` は tip2 で作成したロガーのインスタンスです。
5. コメントとドキュメント生成
コードには必ず目的・引数・戻り値をコメントとして書いておきましょう。後から見たときに助かります。
'=== GetUserByUserID ===
' 目的:指定されたユーザーIDのレコードセットを取得
' 引数:userID - ユーザーID(Long)
' 戻り値:ユーザーのDAO.Recordset。該当なしならEOF。
Public Function GetUserByUserID(ByVal userID As Long) As DAO.Recordset
'...
End Function
加えて、ドキュメント化ツール(VBAのDocコメントや外部ツール)を使えば、HTMLやPDFで一覧化できて便利です。
6. フォーム設計の標準化
Accessアプリは UI の構成もメンテナンス性に影響します。フォームは共通レイアウトテンプレートをベースに作成して、変更点だけカスタマイズする方式を取りましょう。
- ナビゲーション用フォーム(例:フォーム間の共通ヘッダー)
- 共通コントロール配置(例:検索ボックス+コマンドボタン)
フォームの「Load」「Close」イベントには共通処理も置いておき、設計規約を守るようにすれば、複数人チームの運用でも安心です。
7. データモデル変更へのトレーサビリティ確保
テーブル構造を変更したときの内容や日付、対応したモジュールなどを記録しておく仕組みがあると、あとから「あのバージョンではどうなってた?」というときに大助かり。
' 移行用モジュール例:modMigration
Public Sub Migrate_AddFieldToCustomers()
' 変更内容:Customers テーブルに Email フィールドを追加
Dim db As DAO.Database
Set db = CurrentDb()
db.Execute "ALTER TABLE Customers ADD COLUMN Email TEXT(255);"
Call gLogger.Log "Application of Migrate_AddFieldToCustomers succeeded."
End Sub
こうした「いつ・何を・どう変更したか」をマイグレーションモジュールで管理していくと、将来のトラブルや調査に強い構成になります。
まとめと次のステップ
今回は、Accessシステムの保守性を高めるための7つの設計ポイントをご紹介しました。
- モジュール分割+命名規則でコードが見つけやすく
- ユーティリティクラスで共通処理を一本化
- 定数・列挙で意味を明確に
- エラーハンドリングは統一フォーマットでしっかり
- コメント/ドキュメントで誰でも理解できるコードに
- フォーム設計をテンプレート化してUI整備
- マイグレーションモジュールで変更履歴も管理
これらを取り入れると、「動くけど混乱を招く」から「動いてわかりやすく、伸ばしやすい」へ進化できるはずです。
次のステップとしてはぜひ:
- 小さな既存プロジェクトに一つずつ適用してみる
- チームで設計ルールを共有してみる
- ドキュメント化やコード整理の習慣化をはかる
なかぜんも応援しています!ぜひ「自分でもできそう!」という感覚を大事に、少しずつ改善していきましょう。それでは次回もお楽しみに。
