データベースに接続する際のソースはこんな感じである。ADOを参照設定しておく必要はあるが、その辺は今回省く。過去に作ったものなので、標準モジュールにコピーしても動くとは思う。


Option Explicit

Public Con As ADODB.Connection
Public Cmd As ADODB.Command
Public Rs As ADODB.Recordset
Public ERR As ADODB.Errors
Private Const CI_TIMEOUT As Integer = 30

'----------------------------------------
'# DB OPEN処理
'----------------------------------------
Public Sub openDB()

'----ログインチェックは省略
Set Con = New ADODB.Connection

'★ポイント
Con.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & "\TestAccess.mdb;"

Set Rs = New ADODB.Recordset
Set Cmd = New ADODB.Command

With Cmd
.ActiveConnection = Con
.CommandType = adCmdText
.CommandTimeout = CI_TIMEOUT
End With

End Sub

'----------------------------------------
'# DB CLOSE処理
'----------------------------------------
Private Sub closeDB()

On Error Resume Next

Con.Close
Set Con = Nothing

Exit Sub

PROC_ERR:
ERR.Refresh
Resume Next

End Sub


★ポイント と書いた部分を変更すれば、AccessだろうがPostgreSQLだろうが、対応さえしていればアクセス可能になる。

これを標準モジュールで行うと、このコーディングひとつで1セッション分しか接続できない。このソースをコピーして使うにも、Publicで定義している変数名を変えてやるとか、手を加えなければならないところが多く、煩雑である。これをクラスモジュール化してしまえば必要なときに、必要なだけ作り、いらなくなれば破棄するという処理ができるので似たようなコードがたくさんできることはなくなり、メンテナンス性が向上する。

次回はクラスモジュールのサンプルコードを書いてみようと思う。
VBA でデータベース接続処理を書いた事のある方、いらっしゃることだろう。

データベースを読み込む箇所では毎回接続処理を書いたりしているのではないだろうか?仮に「DBアクセス共通処理」を作ったとしても、ある箇所で既に使用し、セッションを使っていたら利用できないから共通化なんて無理!と言われるかもしれない。

いやいや、ところが共通化はできるのである。そのキーワードは「クラスモジュール」の利用である。

クラスモジュールは、必要なときに必要なだけ、コピーを取って利用することができる。そう、テストの答案用紙の原紙があるとしよう。
・生徒が3人やってきたら3枚コピーし、名前を書いて貰う。 
  ⇒クラスモジュールは必要に応じてコピーをする。ただし、識別できる名前を付ける必要がある。
・生徒に問題を解かせる。もちろん、ある生徒が書いた回答が別の生徒の回答に影響を与えることはない。
  ⇒クラスモジュールはそれぞれのコピーは独立しており、互いに干渉しない。
こんなような関係なので、クラスモジュールで共通処理を作り、接続するところでそれぞれの名前を付けてコピー(生成)し、使い終わったら破棄する、というようにすればよい。

このあたりはソースコード付きで近く解説したいと思う。
最近、ソフトウェアの現場でも As-Is やら To-Be やらの言葉が聞かれるようになってきた。
EAも浸透してきたのかな、と思いきや、なんだか違う。

周りの人が使っていて「現状」「あるべき姿」を表す言葉として使っているのは正しい。しかし、As-IsをBA,DA,AA,TA に分解するわけでもなく、To-Beをそこから導き出すわけでもない。

ただ「知っている言葉を使っている」だけなのだ。

それ以上勉強するわけではないから、ただの用語として使うにとどまる。
ある意味、尊敬する。そんなので仕事しているんだから。