ExcelVBA-Excelファイルをデータベースとして使う-その8です。 前回の記事はこちらになります。
hirocom777.hatenadiary.org
クラスモジュール
今回は、前回構想を練ったクラスをご紹介します。(2021/1/11修正しました)
Option Explicit
'Excelファイルのデータベースコントロールのクラスです。
Private dbFileName_ As String 'データベースファイル名
Private dbTableName_ As String 'テーブル名
Private dbFieldList_() As Variant 'フィールドリスト
Private adoCn As Object
Private adoRs As Object
'初期化
Private Sub Class_Initialize()
Set adoCn = CreateObject("ADODB.Connection")
adoCn.Provider = "Microsoft.ACE.OLEDB.12.0"
adoCn.Properties("Extended Properties") = "Excel 12.0"
Set adoRs = CreateObject("ADODB.Recordset")
adoRs.CursorLocation = adUseClient
End Sub
'終了処理
Private Sub Class_Terminate()
If Err.Number <> 0 Then
adoCn.RollbackTrans
MsgBox "データベース接続に失敗しました"
Else
adoCn.CommitTrans
End If
adoRs.Close
adoCn.Close
End Sub
'ファイル名を設定します
Public Property Let dbFileName(ByVal fileName As String)
Select Case True
Case dbFileName_ <> ""
MsgBox "ファイル名は途中で変更できません"
Case Dir$(fileName) = ""
MsgBox "ファイルが見つかりません"
Case Else
dbFileName_ = fileName
End Select
End Property
'ファイル名を取得します
Public Property Get dbFileName() As String
dbFileName = dbFileName_
End Property
'テーブル名を設定します
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
adoCn.BeginTrans
'フィールドリストを設定します
Dim adoField As ADODB.Field
Dim i As Long
ReDim dbFieldList_(adoRs.Fields.Count - 1)
For i = 0 To UBound(dbFieldList_)
dbFieldList_(i) = adoRs.Fields.Item(i).Name
Next
End Select
End Property
'テーブル名を取得します
Public Property Get dbTableName() As String
dbTableName = dbTableName_
End Property
'フィールドリストを取得します
Public Property Get dbFieldList() As Variant()
dbFieldList = dbFieldList_
End Property
'Excelデータベースにレコードを追加します
Public Sub AddRecord(recordData() As Variant)
adoRs.AddNew dbFieldList_, recordData
adoRs.Update
End Sub
動かしてみよう!!
では、動かしてみましょう!!準備は以下になります。データベースとして使う-その6と同じ条件で実行しますがおさらいです。
1.任意フォルダにxlsmファイルを作成して空のクラスモジュールを作成。上記クラスのコードをコピーします。
2.上記ファイルのSheet1に下記サイトから静岡県データ(CSVファイル-約3700件)をコピーして下さい。
jusyo.jp
3.Sheet1には、以下のコードを配置してください。クラスモジュールからデータベースコントロールオブジェクトを作成して操作するコードです。
Option Explicit
'データベースコントロールクラスを使用してデータをコピーします。
Private Sub AddDataByClass()
Dim recordData() As Variant
Dim i As Long
Debug.Print Now
Dim db As clsExcelDbase
Set db = New clsExcelDbase
db.dbFileName = ThisWorkbook.Path & "\Sizuoka.xlsx"
db.dbTableName = "sizuoka"
i = 2
Do While Me.Cells(i, 1) <> ""
recordData() = Range(Me.Cells(i, 1), Me.Cells(i, 22))
recordData() = WorksheetFunction.Transpose(WorksheetFunction.Transpose(recordData))
db.AddRecord recordData()
i = i + 1
Loop
Debug.Print Now
End Sub4.コピー先のファイル『Sizuoka.xlsx』を同じフォルダに作成します。シート名は『sizuoka』としてシートの1行目にはフィールド名のみ入力しておきます。
この状態で、Sheet1のAddDataByClassを実行してみましょう。結果は、……約3秒!!。爆速です!!
やっぱり、レコードごとにデータベース接続ON/OFFしなければデータベースの圧勝です!!
クラスモジュールはちょっと長めになっちゃいましたけれど、一度作ってしまうと色々応用がきくんですよ!!
と、いう訳で次回はクラスの詳細解説をします。お楽しみに!!
hirocom777.hatenadiary.org
ExcelVBA-Excelファイルをデータベースとして使う連載はコチラからどうぞ!!