VBAを使って外部Excelブックからデータを取得したい場面があります。しかし、外部ブックを開いたままでは作業が重くなったり、意図しない変更を加えてしまうリスクがあります。ファイルを開かずに安全にデータを取得できれば、業務効率が格段に向上します。この記事では、VBAとADO接続を使い、外部Excelファイルを開かずにデータを取得する具体的な手順を解説します。
Excel VBAで外部ファイルからデータを読み込む際、通常はWorkbooks.Openメソッドを使用してファイルを開きます。しかし、大量のファイルを処理する場合や、他のユーザーがファイルを編集中の場合に、ファイルを開く操作は時間がかかったり、エラーの原因になったりすることがあります。また、ファイルを開くことで、意図せずブックの内容を変更してしまう可能性も否定できません。このような問題を回避し、安全かつ効率的に外部データを取得する方法として、ADO(ActiveX Data Objects)接続が有効です。ADOを利用することで、Excelファイルを開かずに、まるでデータベースのように外部ブック内のシートやテーブルからデータを直接取得できます。
【要点】VBAとADO接続で外部Excelファイルを開かずにデータ取得
- ADO接続の設定: VBAエディタでMicrosoft ActiveX Data Objectsライブラリを参照設定する。
- 接続文字列の作成: 読み込みたいExcelファイルのパスを指定した接続文字列を作成する。
- SQLクエリの実行: ADOオブジェクトを使用し、外部ブックのシートやテーブルからデータを取得するSQL文を実行する。
ADVERTISEMENT
目次
ADO接続で外部Excelファイルを開かずにデータを取得できる仕組み
ADOは、データベースへのアクセスを抽象化するオブジェクトモデルです。Excelファイルも、ADOにとってはOLE DBプロバイダーを介してアクセスできるデータソースの一つとみなされます。具体的には、「Microsoft.ACE.OLEDB.12.0」や「Microsoft.Jet.OLEDB.4.0」といったOLE DBプロバイダーを利用することで、Excelファイルのシートや名前付き範囲をテーブルのように扱えます。これにより、VBAからSQL文を発行して、ファイルを開くことなくデータを参照・取得することが可能になります。この仕組みにより、実行速度の向上や、ファイルを開くことによるリスクの回避が実現されます。
VBAでADO接続を設定し、外部ブックからデータを取得する手順
- VBAエディタでライブラリを参照設定する
ADO機能を利用するには、まずVBAエディタで必要なライブラリを参照設定する必要があります。
1. VBAエディタ(Alt + F11)を開きます。
2. 「ツール」メニューから「参照設定」を選択します。
3. 一覧から「Microsoft ActiveX Data Objects 6.1 Library」(または6.0、2.8など、利用可能なバージョン)を探してチェックを入れ、「OK」をクリックします。 - ADO接続オブジェクトを宣言する
VBAコード内でADO接続とレコードセットを操作するための変数を宣言します。
“`vba
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim strConn As String
Dim strSQL As String
Dim strFilePath As String
Dim wsName As String
“` - 接続文字列を作成する
読み込みたいExcelファイルのパスを指定した接続文字列を作成します。Excelのバージョンによって使用するプロバイダーが異なります。
・Excel 2007以降(.xlsx, .xlsmなど)の場合:
“`vba
strFilePath = “C:\Data\Source.xlsx” ‘ 読み込みたいファイルのフルパスを指定
wsName = “Sheet1” ‘ 読み込みたいシート名を指定
strConn = “Provider=Microsoft.ACE.OLEDB.12.0;Data Source=” & strFilePath & “;Extended Properties=’Excel 12.0 Xml;HDR=YES’;”
“`
・Excel 97-2003(.xls)の場合:
“`vba
‘ strFilePath = “C:\Data\Source.xls” ‘ 読み込みたいファイルのフルパスを指定
‘ wsName = “Sheet1” ‘ 読み込みたいシート名を指定
‘ strConn = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” & strFilePath & “;Extended Properties=’Excel 8.0’;”
“`
補足: HDR=YESは、シートの1行目をヘッダー(列名)として扱うことを意味します。ヘッダーがない場合はHDR=NOを指定します。 - SQLクエリを作成する
取得したいデータを指定するSQLクエリ文を作成します。シート名をテーブル名のように扱います。
“`vba
strSQL = “SELECT * FROM [” & wsName & “$]”
‘ 特定の列だけ取得したい場合:
‘ strSQL = “SELECT Column1, Column2 FROM [” & wsName & “$] WHERE Column3 = ‘特定の値'”
“`
注意: シート名にスペースが含まれる場合は、`[シート名$]`のように角括弧とドル記号で囲む必要があります。 - ADO接続を開き、レコードセットを取得する
作成した接続文字列とSQLクエリを使用して、ADO接続を開き、データをレコードセットとして取得します。
“`vba
Set cnn = New ADODB.Connection
cnn.Open strConnSet rst = New ADODB.Recordset
rst.Open strSQL, cnn, adOpenStatic, adLockReadOnly
“` - 取得したデータをExcelシートに貼り付ける
レコードセットには取得したデータが格納されているため、これをExcelシートにコピーします。 - オブジェクトを解放する
処理が終わったら、使用したADOオブジェクトを解放し、接続を閉じます。
“`vba
If rst.State = adStateOpen Then rst.Close
Set rst = NothingIf cnn.State = adStateOpen Then cnn.Close
Set cnn = Nothing
“`
完全なVBAコード例
上記の手順をまとめたVBAコード例です。このコードは、指定した外部Excelファイルの特定のシートからデータを取得し、アクティブなシートのA1セルから貼り付けます。
【コード例】
“`vba
Sub GetDataFromExternalExcel()
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim strConn As String
Dim strSQL As String
Dim strFilePath As String
Dim wsName As String
Dim targetSheet As Worksheet
Dim targetCell As Range
‘ — 設定項目 —
strFilePath = “C:\Data\Source.xlsx” ‘ ★読み込みたいExcelファイルのフルパスを指定
wsName = “Sheet1” ‘ ★読み込みたいシート名を指定
Set targetSheet = ThisWorkbook.ActiveSheet ‘ ★データを貼り付けるシートを指定
Set targetCell = targetSheet.Range(“A1”) ‘ ★データを貼り付ける開始セルを指定
‘ —————-
‘ Excelのバージョンに応じてプロバイダーを選択
‘ .xlsx, .xlsmなどの場合は “Excel 12.0 Xml”
‘ .xlsの場合は “Excel 8.0”
strConn = “Provider=Microsoft.ACE.OLEDB.12.0;Data Source=” & strFilePath & “;Extended Properties=’Excel 12.0 Xml;HDR=YES’;”
‘ strConn = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” & strFilePath & “;Extended Properties=’Excel 8.0’;” ‘ (.xlsファイル用)
‘ SQLクエリを作成 (シート名をテーブル名のように扱う)
strSQL = “SELECT * FROM [” & wsName & “$]”
On Error GoTo ErrorHandler
‘ 接続オブジェクトとレコードセットオブジェクトを作成
Set cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
‘ 接続を開く
cnn.Open strConn
‘ レコードセットを開く (データを取得)
‘ adOpenStatic: 全てのレコードをメモリに読み込む
‘ adLockReadOnly: 読み取り専用でロックする
rst.Open strSQL, cnn, adOpenStatic, adLockReadOnly
‘ 取得したデータをExcelシートに貼り付ける
If Not rst.EOF Then ‘ データが存在する場合
‘ データを直接セル範囲に書き込む
targetCell.Resize(rst.RecordCount, rst.Fields.Count).Value = rst.GetRows
MsgBox “データの取得が完了しました。”, vbInformation
Else
MsgBox “指定されたシートにデータが見つかりませんでした。”, vbExclamation
End If
ExitHandler:
‘ オブジェクトを解放する
If rst.State = adStateOpen Then rst.Close
Set rst = Nothing
If cnn.State = adStateOpen Then cnn.Close
Set cnn = Nothing
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description,
vbCritical
Resume ExitHandler
End Sub
“`
ADVERTISEMENT
ADO接続で外部ブックからデータを取得する際の注意点とよくある失敗
プロバイダーが存在しない、またはバージョンが合わない
「’Microsoft.ACE.OLEDB.12.0′ プロバイダーは登録されていません。」といったエラーが表示される場合、OLE DBプロバイダーがインストールされていないか、Excelのバージョンと合わないプロバイダーを指定している可能性があります。64bit版Officeと32bit版Officeでプロバイダーの互換性がない場合もあります。その場合は、Officeのbit数に合わせたプロバイダー(Microsoft Access Database Engine Redistributable)を別途インストールする必要があります。
パスやファイル名が間違っている
指定したファイルのパスやファイル名が間違っていると、「外部テーブル ‘…’ へのクエリは、正しく形式化されていません。」のようなエラーが発生します。ファイルのフルパスが正しいか、ファイル名に間違いがないか、大文字・小文字を含めて正確に確認してください。また、ファイルがパスワードで保護されている場合も、この方法では直接開けません。
シート名やテーブル名が正しくない
SQLクエリの `FROM` 句で指定するシート名が間違っている場合もエラーになります。シート名にスペースや特殊文字が含まれる場合は、必ず `[シート名$]` の形式で指定してください。名前付き範囲(テーブル)を読み込みたい場合は、`[名前付き範囲名]` のように指定します。
HDR=YES/NOの設定ミス
接続文字列の `Extended Properties` 内にある `HDR` オプションの設定が間違っていると、データが正しく取得できません。1行目をヘッダー(列名)として扱いたい場合は `HDR=YES`、1行目も含めてデータとして取得したい場合は `HDR=NO` を指定します。これが原因で、ヘッダー行がデータとして取り込まれたり、データが1行ずれたりすることがあります。
32bit版Excelと64bit版Excelの互換性問題
32bit版Officeで作成したVBAコードを64bit版Officeで実行したり、その逆を行ったりする場合、ADOのプロバイダーの互換性問題が発生することがあります。特に、`Microsoft.ACE.OLEDB.12.0` プロバイダーは、Officeのbit数と一致させる必要があります。64bit版Office環境で32bit版Office用のプロバイダー(`Microsoft.Jet.OLEDB.4.0`)を使おうとするとエラーになることがあります。確実なのは、Officeのbit数に合ったプロバイダーを使用することです。
ADO接続と他の方法(Workbooks.Open)の比較
| 項目 | ADO接続 | Workbooks.Open |
|---|---|---|
| ファイルを開くか | 開かない | 開く |
| 処理速度 | 一般的に高速 | ファイルサイズや内容による |
| VBAコードの複雑さ | やや複雑(参照設定、接続文字列、SQL) | 比較的容易(Workbooks.Open, Range.Valueなど) |
| 他のユーザーによる編集中の影響 | 影響を受けにくい | ロックされる、エラーが発生する可能性 |
| パスワード保護されたファイル | 直接は対応不可 | パスワードを指定して開ける |
| 利用シーン | 大量データ取得、バックグラウンド処理、安全なデータ参照 | ファイルを開いて確認・編集したい場合、パスワード保護されたファイル |
ADO接続は、ファイルを開かずにデータを取得できるため、大量のデータを効率的に処理したい場合や、他のユーザーの作業を妨げたくない場合に非常に有効です。一方、Workbooks.Openメソッドは、ファイルを開いて内容を確認したり、パスワードで保護されているファイルを扱ったりする場合には適しています。それぞれの方法のメリット・デメリットを理解し、状況に応じて使い分けることが重要です。
ADVERTISEMENT
超解決 Excel・Word研究班
企業のDX支援や業務効率化を専門とする技術者チーム。20年以上のExcel・Word運用改善実績に基づき、不具合の根本原因と最短の解決策を監修しています。ExcelとWordを使った「やりたいこと」「困っていること」「より便利な使い方」をクライアントの視点で丁寧に提供します。
Office・仕事術の人気記事ランキング
- 【Word】差し込み印刷で数字の桁を整える!金額にカンマ(桁区切り)を入れる設定
- 【Teams】メッセージを「保存済み」にして後で読む!重要なチャットをブックマークして整理する技
- 【Outlook】宛先が「オートコンプリート」に出ない・間違っている時の修正手順|履歴の削除と再構築
- 【Excel】矢印キーで「セルが動かず画面がスクロールする」!ScrollLockの解除方法(ノートPC対応)
- 【Outlook】メールの受信が数分遅れる!リアルタイムで届かない時の同期設定と送受信グループ設定
- 【Outlook】予定表の「祝日」が表示されない!最新カレンダーの追加と二重表示の修正手順
- 【Outlook】「メール送信を5分遅らせる」設定!誤送信を防ぐ最強のディレイ機能
- 【Word】校閲機能の基本!赤字(変更履歴)とコメントで修正を見える化する
- 【神技】保存せずに閉じたExcel・Wordファイルを復元する!消えたデータを復活させる4つの救出法
- 【Excel】文字がセルの枠からはみ出す・隠れる!「折り返して表示」と「縮小して全体を表示」の使い分け
