一気読みと、1件ずつ読み込むのとの処理時間の違い

抽出条件を指定し、CopyFromRecordsetで一気に読み込む時間と、セルの行列を指定し1件ずつ読み込むのとではどれくらい時間の差があるのか調査してみます。
時間計測は、2000件登録済みの顧客マスターを使用しました。

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

Excel Tipsメニューに戻る

スポンサードリンク





■■■
このサイトの内容を利用して発生した、いかなる問題にも一切責任は負いませんのでご了承下さい
■■■
当ホームページに掲載されているあらゆる内容の無許可転載・転用を禁止します


関連コンテンツ

Copyright (c) Excel-Excel ! All rights reserved