ExcelでRDB(リレーショナルデータベース)を操作してみようという連載のその17です。前回の記事はこちらです。
クラスモジュールの見直し
前回でAccessファイル確認ツールはひととおりの完成を見ました。
そしてその中で、クラスモジュールの内容を少しだけ修正しました。クラスの全体については以下で公開しています。
修正したのは以下の2点です。
遅延バインディングから事前バインディングに変更
今まで何もわからないで遅延バインディングを使っていました。しかしながら、とくに問題がないかぎり事前バインディングを使用するのがセオリーの様ですね。事前バインディングと遅延バインディングの違いについては以下が詳しいです。
フィールドタイプをプロパティーで取得
今まではツールのコード内で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 ドライブ
修正が簡単
クラスモジュールを作った経験はあまりないのですが、今回の様な修正を行ってみるとクラスモジュールの利点が見えてきたような気がします。修正作業は簡単ですし、プログラムの管理も容易になる感じがしました。
次回もクラスモジュール
いかがでしょうか。今回の経験でクラスモジュールに対する理解が少し深まったような気がしました。そして、他にも機能を追加してみたくなりました。次回はこちらに挑戦してみようと思います。お楽しみに!!