一気読みと、1件ずつ読み込むのとの処理時間の違い
抽出条件を指定し、CopyFromRecordsetで一気に読み込む時間と、セルの行列を指定し1件ずつ読み込むのとではどれくらい時間の差があるのか調査してみます。
時間計測は、2000件登録済みの顧客マスターを使用しました。
Homeに戻る >
Excel データベースのTipsへ
実行画面
CopyFromRecordsetを使用し実行した画面です。
処理時間は、2.075秒でした。抽出の処理時間としては満足な時間かと思います。
1件ずつ読み込んだ結果です。
処理時間は、14.321秒でした。
一気読みとは7倍ぐらいの時間が掛かりました。プログラムで使用するには、なるべくCopyFromRecordsetを使用した方がいいようです。
コード
■一気読み
Option Explicit
'Windowsが起動してからの経過時間 API
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Sub ExAccdbSelectImport()
Dim db As ADODB.Connection
Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command
Dim SQL As String
Dim st As Long
Dim et As Long
'苗字が「山本」を抽出
SQL = "SELECT *FROM T_顧客マスター2000件 WHERE 顧客名 LIKE '山本%'"
'開始時間を取得
st = GetTickCount
'顧客管理のACCDBファイルに接続します
Set db = New ADODB.Connection
db.Provider = "Microsoft.Ace.OLEDB.12.0"
db.Open "C:\MyHP\excel2007\Tips\顧客管理.accdb"
'レコードセットを開きます
Set rs = New ADODB.Recordset
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = db
'SQLをセット
cmd.CommandText = SQL
Set rs = cmd.Execute
If rs.EOF Then
MsgBox "抽出した結果、顧客のレコードが見つかりません。"
Else
'レコードをシートへ貼り付ける
Range("B7").CopyFromRecordset rs
End If
rs.Close
Set rs = Nothing
Set db = Nothing
DoEvents
'終了時間を取得
et = GetTickCount
MsgBox (et - st) / 1000 & " 秒"
End Sub
Private Sub CommandButton1_Click()
ExAccdbSelectImport
End Sub
■一件ずつ
Option Explicit
'Windowsが起動してからの経過時間 API
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Sub ExAccdbSelectImport()
Dim db As ADODB.Connection
Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command
Dim SQL As String
Dim lrow As Long
Dim st As Long
Dim et As Long
'苗字が「山本」を抽出
SQL = "SELECT *FROM T_顧客マスター2000件 WHERE 顧客名 LIKE '山本%'"
'開始時間を取得
st = GetTickCount
'顧客管理のACCDBファイルに接続します
Set db = New ADODB.Connection
db.Provider = "Microsoft.Ace.OLEDB.12.0"
db.Open "C:\MyHP\excel2007\Tips\顧客管理.accdb"
'レコードセットを開きます
Set rs = New ADODB.Recordset
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = db
'SQLをセット
cmd.CommandText = SQL
Set rs = cmd.Execute
If rs.EOF Then
MsgBox "抽出した結果、顧客のレコードが見つかりません。"
Else
'読込みを開始する行位置
lrow = 7
'最終レコードまで
While Not rs.EOF
Cells(lrow, 2) = rs("顧客ID")
Cells(lrow, 3) = rs("顧客名")
Cells(lrow, 4) = rs("TEL")
Cells(lrow, 5) = rs("FAX")
Cells(lrow, 6) = rs("郵便番号")
Cells(lrow, 7) = rs("住所")
Cells(lrow, 8) = rs("メモ")
'次の行
lrow = lrow + 1
'次のレコード
rs.MoveNext
Wend
End If
rs.Close
Set rs = Nothing
Set db = Nothing
DoEvents
'終了時間を取得
et = GetTickCount
MsgBox (et - st) / 1000 & " 秒"
End Sub
Private Sub CommandButton1_Click()
ExAccdbSelectImport
End Sub
Homeに戻る >
Excel データベースのTipsへ
■■■
このサイトの内容を利用して発生した、いかなる問題にも一切責任は負いませんのでご了承下さい
■■■
当ホームページに掲載されているあらゆる内容の無許可転載・転用を禁止します
Copyright (c) Excel-Excel ! All rights reserved