Excelファイルデータベースの書込みスピードは?(Excelデータベースその6)

ExcelVBA-Excelファイルをデータベースとして使う-その6です。 前回の記事はこちらになります。
hirocom777.hatenadiary.org

書き込みスピードを確認する

さて、今回はデータベース接続の書き込みスピードについて確認してみたいと思います。
読込ではデータベース接続のほうが速かったのですが、書き込みではどうでしょう?
同じデータにアクセスしてスピードを比べてみようと思います。

今回も、以下のサイトからデータをいただいて使わせてもらおうと思います。
jusyo.jp

こちらの静岡県データ(CSVファイル-約3700件)をシートにコピーして使わせていただきます。ありがとうございます!!
今回は、シート上のデータをフィールドだけ入力した『Sizuoka.xlsx』のシート『sizuoka』にコピーする時間を比べたいと思います。

ADOでやってみる

それではやってみましょう。書き込みには以下で紹介したAddRecordを使えばいいですね。
hirocom777.hatenadiary.org
データをコピーしたシートに以下のプロシージャをコピーしてください。

Option Explicit

Private Sub AddData_ADO()
Dim vrnField() As Variant
Dim vrnData() As Variant
Dim i As Long
  Debug.Print Now
  vrnField() = Me.Range("$A$1:$V$1")
  vrnField() = WorksheetFunction.Transpose(WorksheetFunction.Transpose(vrnField))

  i = 2
  Do While Me.Cells(i, 1) <> ""
    vrnData() = Range(Me.Cells(i, 1), Me.Cells(i, 22))
    vrnData() = WorksheetFunction.Transpose(WorksheetFunction.Transpose(vrnData))
    AddRecord ThisWorkbook.Path & "\Sizuoka.xlsx", "sizuoka", vrnField(), vrnData()
    i = i + 1
  Loop
  Debug.Print Now
End Sub

『 WorksheetFunction.Transpose(WorksheetFunction.Transpose(vrnData))』ですが、これは2次元配列を1次元配列に直す裏ワザです。
レンジ範囲を配列にコピーすると1行でも2次元配列になっちゃうんです。1レコードのデータを表すので1次元配列じゃないといけません。
結果は?……約12分!!え?すごい遅い!!秒じゃなくて分!!どうしてこうなった??

VBAでは?

VBAではどうなんでしょ。今度はシートに以下のプロシージャを配置して実行してみてください。

Option Explicit

Sub AddData_VBA()
Dim wbk As Workbook
Dim rngRange As Range
Dim i As Long

  Debug.Print Now
  Application.ScreenUpdating = False
  
  Set wbk = Workbooks.Open(FileName:=ThisWorkbook.Path & "\Sizuoka.xlsx")
  
  i = 2
  For i = 2 To Me.Range("A:A").Count
    If Me.Cells(i, 1) = "" Then Exit For
    Set rngRange = Range(Me.Cells(i, 1), Me.Cells(i, 22))
    rngRange.Copy wbk.Sheets("sizuoka").Range(rngRange.Address)
  Next
  wbk.Close SaveChanges:=True
  
  Application.ScreenUpdating = True
  Debug.Print Now
End Sub

結果は、……約50秒!!。て、言うかこれやってることは前回とほぼ一緒。データを別のファイルにコピーしているだけだからあまり変わらないんですよね。検索していない分こちらのほうがちょっとだけ早いかな。

どうしてこうなった

遅い。なんでこんなに遅いんだ・・って原因は分かってます。レコードの書き込み1回ごとにデータベース開いて閉じてますからね。前回の読込の時はSQLで絞ったデータを1度に読んでるから早いんです。

データベースを開く⇒データをまとめて書き込む⇒データベースを閉じる

って手順でやれば早くなるはずです。でも、データの渡し方とか考えるとちょっとめんどくさいんですよね。

まぁ、データ登録なんて大概1レコードずつだし、まとめて書き込むことなんてあまりないから・・・って
悔しいな!!
なんかいい方法はないのかね。

と、いう訳で次回はこの問題の解決方法について検討したいと思います。
hirocom777.hatenadiary.org
ExcelVBA-Excelファイルをデータベースとして使う連載はコチラからどうぞ!!