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関連要素をまとめていますので、よければ一覧記事もご覧ください。