Excelシートの中身を高速で確認したい(VBAでADODB)

Workbook.Openでブックを開いてシートの中身を確認するのは重たいもの。
ADODB使って高速でやりたいじゃないか。

事前準備(参照設定)

VBAのメニューから[ツール(T)]→[参照設定(R)…]をクリックして、[Microsoft ActiveX Data Objects 6.1 Library]にチェックを入れて[OK]ボタンをクリックしておきます。

実装

とりあえず指定のシートのUsedRangeを総舐めするコードはこちら。
一応Excel2010以前(*.xls)でも動作するように分岐してます。

Sub Sample(strTargetFile As String)

On Error GoTo ErrorFunction

    Dim objCon As New ADODB.Connection  ' コネクション
    Dim objRecordSet As ADODB.Recordset ' データ取得結果格納左記
    Dim i As Long
    
    ' ファイルをOpen
    If 1 <= InStr(strTargetFile, ".xlsm") Or 1 <= InStr(strTargetFile, ".xlsx") Then
        objCon.Provider = "Microsoft.ACE.OLEDB.12.0"
        objCon.Properties("Extended Properties") = "Excel 12.0"
    Else
        objCon.Provider = "Microsoft.Jet.OLEDB.4.0"
        objCon.Properties("Extended Properties") = "Excel 8.0"
    End If
    Call objCon.Open(strTargetFile)
    
    ' 値を取得
    Set objRecordSet = New ADODB.Recordset
    Call objRecordSet.Open("SELECT * FROM [シート名$];", objCon, adOpenStatic, adLockReadOnly)
    
    ' 総出力
    Do While (Not objRecordSet.EOF)
        For i = 0 To objRecordSet.Fields.Count - 1
            Debug.Print objRecordSet.Fields(i).Value
        Next
        Call objRecordSet.MoveNext
    Loop

ErrorFunction:
    Set objRecordSet = Nothing
    Set objCon = Nothing
End Sub

ちなみに何もセットされていないセルは「Null」が出力されます。
取得したい範囲が予め決まっているのなら、対象範囲に名前を定義して、SELECT文をこんな感じにしても動作します。

SELECT * FROM 定義した名前 WHERE シート名 = 'シート名';

他にもニッチなIT関連要素をまとめていますので、よければ一覧記事もご覧ください。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)