クラスの見直し_1(ExcelでRDBその17)

ExcelRDB(リレーショナルデータベース)を操作してみようという連載のその17です。前回の記事はこちらです。

hirocom777.hatenadiary.org

クラスモジュールの見直し

前回でAccessファイル確認ツールはひととおりの完成を見ました。

f:id:HiroCom777:20220404083937j:plain

そしてその中で、クラスモジュールの内容を少しだけ修正しました。クラスの全体については以下で公開しています。

hirocom777.hatenadiary.org

修正したのは以下の2点です。

遅延バインディングから事前バインディングに変更

今まで何もわからないで遅延バインディングを使っていました。しかしながら、とくに問題がないかぎり事前バインディングを使用するのがセオリーの様ですね。事前バインディングと遅延バインディングの違いについては以下が詳しいです。

excel-ubara.com

フィールドタイプをプロパティーで取得

今まではツールのコード内でADOXを使ってフィールドタイプ(フィールドのデータ型)情報を取得していましたが、ADOでも取得できることがわかりました。テーブルが決まればフィールドの情報も決まるので、フィールドタイプの情報をプロパティーの形で取得するようにしました。

変更と追加内容

以上の修正により、クラスモジュールの冒頭部分は以下の様になりました。機能は追加したのですが、ずいぶんすっきりしたと思いませんか?

Option Explicit
'Accessファイルのデータベースコントロールのクラスです

Private dbFileName_ As String 'データベースファイル名
Private dbTableName_ As String 'テーブル名
Private dbFieldList_() As Variant 'フィールドリスト
Private dbFieldType_() As Variant  'フィールドタイプ
Private dbTrans_ As Boolean 'トランザクション状態

Private adoCn As New ADODB.Connection
Private adoRs As New ADODB.Recordset
Private adoSelectRs As New ADODB.Recordset

'初期化
Private Sub Class_Initialize()
  adoCn.Provider = "Microsoft.ACE.OLEDB.12.0"
  adoRs.CursorLocation = adUseClient
  adoSelectRs.CursorLocation = adUseClient
  dbTrans_ = False
End Sub

また、テーブルを設定した際にフィールドタイプのプロパティーも設定するようにしました。

'テーブル名を設定します
Public Property Let dbTableName(ByVal tableName As String)
  Select Case True
  Case Dir$(dbFileName_) = ""
    MsgBox "データベースファイルを指定してください"
  Case dbTableName_ <> ""
    MsgBox "テーブル名は途中で変更できません"
  Case Else
    adoCn.Open dbFileName_
    adoRs.Open tableName, adoCn, adOpenKeyset, adLockOptimistic
    dbTableName_ = tableName
    'フィールドリストを設定します
    Dim adoField As ADODB.Field
    Dim i As Long: i = 0
    ReDim dbFieldList_(adoRs.Fields.Count - 1)
    ReDim dbFieldType_(adoRs.Fields.Count - 1)
    For Each adoField In adoRs.Fields
      dbFieldList_(i) = adoField.Name
      dbFieldType_(i) = adoField.Type
      i = i + 1
    Next
  End Select
End Property

そして、フィールドタイプのプロパティーを取得するコードを追加しました。

'フィールドタイプを取得します
Public Property Get dbFieldType() As Variant
  dbFieldType = dbFieldType_
End Property

クラスモジュールの全体は以下をダウンロードして確認してみてください。

16_Accessファイル確認ツール④.zip - Google ドライブ

修正が簡単

クラスモジュールを作った経験はあまりないのですが、今回の様な修正を行ってみるとクラスモジュールの利点が見えてきたような気がします。修正作業は簡単ですし、プログラムの管理も容易になる感じがしました。

次回もクラスモジュール

いかがでしょうか。今回の経験でクラスモジュールに対する理解が少し深まったような気がしました。そして、他にも機能を追加してみたくなりました。次回はこちらに挑戦してみようと思います。お楽しみに!!

hirocom777.hatenadiary.org

ExcelVBAでAccessファイルを操作する連載はコチラから