Excel業務を自動化していくと、避けて通れないのが外部データの取り込みです。
CSVファイル、テキストデータ、Web上のデータなどを毎回手作業で開いてコピーしていると、作業時間が増えるだけでなく、ミスの温床にもなります。
そこで多くの現場で使われているのが、VBAの QueryTables.Add メソッドです。
一方で、QueryTablesは
「とりあえず動くコードは書けたが、後から直せない」
「処理がブラックボックス化している」
という状態になりやすいのも事実です。
本記事では、QueryTables.Addを単なる取り込みテクニックとしてではなく、
実務で壊れにくく、再利用しやすい設計として使うための考え方と実装方法を解説します。
目次
- ✅ QueryTables.Addが活躍する実務シーン
- ✅ QueryTables.Addとは何か(基本の考え方)
- ✅ QueryTablesを使う前に決めておくべき設計方針
- ✅ QueryTables.Addの基本構成(設計意図つき)
- なぜこの書き方にしているのか
- ■ CSVファイルを取り込むVBAコード例
- ✅ コードの設計意図と処理の流れ
- ・なぜSubを分けているのか
- ・なぜQueryTablesを毎回削除しているのか
- ✅ 別の書き方と比べたときのメリット
- ・Open → Copy → Paste方式との比較
- ✅ 実務で使うときの注意点
- ・CSVの文字コードは必ず確認する
- ・加工処理は取り込み後に分離する
- ✅ 応用:複数CSVを順番に取り込む設計
- ✅ QueryTablesを「テクニック」で終わらせないために
- ✅ まとめ:QueryTables.Addは「取得専用」と割り切る
✅ QueryTables.Addが活躍する実務シーン
外部データ取得には複数の方法がありますが、QueryTablesは特に以下のような場面で力を発揮します。
- 定期的にCSV・テキストを取り込む業務
- フォーマットが毎回同じ外部データ
- 手動操作を完全に排除したい処理
逆に、この前提を理解せずに使うと、
「なぜこの処理がここにあるのか分からないコード」になりやすいため注意が必要です。
✅ QueryTables.Addとは何か(基本の考え方)
QueryTables.Add は、
外部データを“クエリ”としてExcelに取り込むための仕組みです。
ポイントは、
- 単に読み込む
- 値を貼り付ける
のではなく、
**「外部データとの接点をオブジェクトとして管理する」**点にあります。
この考え方を理解していないと、
処理の意味が分からないままコードだけが増えていきます。
✅ QueryTablesを使う前に決めておくべき設計方針
QueryTables.Addを使う前に、必ず整理しておきたいのが次の3点です。
- どこからデータを取得するのか
- どこに出力するのか
- 取得後に編集・加工するのか
これを曖昧にしたまま書くと、
「後から列が増えたら全部壊れる」コードになります。
✅ QueryTables.Addの基本構成(設計意図つき)
なぜこの書き方にしているのか
ここでは、
- CSVファイルを
- 指定したシートの指定セルに
- 毎回同じ形式で取り込む
という、最も実務で使われるケースを想定します。
■ CSVファイルを取り込むVBAコード例
Option Explicit
Public Sub ImportCsvWithQueryTable( _
ByVal csvFilePath As String, _
ByVal outputSheet As Worksheet, _
ByVal startCell As Range)
Dim queryTable As QueryTable
' 既存のQueryTableがあれば削除(再実行時の崩れ防止)
For Each queryTable In outputSheet.QueryTables
queryTable.Delete
Next queryTable
' QueryTableを追加
Set queryTable = outputSheet.QueryTables.Add( _
Connection:="TEXT;" & csvFilePath, _
Destination:=startCell)
With queryTable
.TextFileParseType = xlDelimited
.TextFileCommaDelimiter = True
.TextFilePlatform = 65001 ' UTF-8対応
.Refresh BackgroundQuery:=False
End With
End Sub
✅ コードの設計意図と処理の流れ
・なぜSubを分けているのか
この処理は、
- 取り込み元が変わる
- 出力先シートが増える
- 開始セルが変わる
といった変更が非常に起こりやすい処理です。
そのため、引数で条件を受け取るSubとして切り出しています。
・なぜQueryTablesを毎回削除しているのか
QueryTablesはオブジェクトとしてシートに残ります。
削除せずに使い回すと、
- 意図しないデータ更新
- 複数QueryTableの混在
といったトラブルが起きやすくなります。
再実行時の安全性を優先して、明示的に削除しています。
なお、CSVの取り込みは、
必ずしもVBAを使う必要があるとは限りません。
定型処理であれば、Excelのデータタブを使った方法の方が
シンプルで管理しやすいケースもあります。
VBAを使うべきかどうか迷った場合は、
「【Excel】CSVデータを自動で取り込む方法|データタブ活用と自動化テクニック」もあわせて確認してみてください。
✅ 別の書き方と比べたときのメリット
・Open → Copy → Paste方式との比較
| 方法 | 問題点 |
|---|---|
| 手動操作再現 | 処理が長く、壊れやすい |
| QueryTables | シンプル・再実行に強い |
QueryTablesは
「毎回同じ形式のデータを安定して取り込む」
という用途に特化しています。
✅ 実務で使うときの注意点
・CSVの文字コードは必ず確認する
UTF-8以外のCSVを扱う場合は、
.TextFilePlatform の設定を必ず見直してください。
・加工処理は取り込み後に分離する
QueryTablesの中に
- 加工
- 並び替え
- フィルター
を混ぜると、設計が一気に崩れます。
「取得」と「加工」は分離するのが基本です。
CSVの文字化けは、
VBA側の設定だけで完全に防げるとは限りません。
実務では、Excel自体の既定文字コード設定が影響しているケースもあり、
ここを理解していないと「コードは正しいのに直らない」状態に陥ります。
Excelの既定文字コードを含めた、より踏み込んだ対処については、
「【Excel】既定の文字コードを変更する方法(上級者向け)|UTF-8対応でCSV文字化けを防ぐ」で解説しています。
✅ 応用:複数CSVを順番に取り込む設計
QueryTables.AddをSub化しておくと、
以下のような拡張も簡単になります。
Sub ImportMultipleCsv()
Dim csvList As Variant
Dim i As Long
csvList = Array( _
"C:\Data\data1.csv", _
"C:\Data\data2.csv")
For i = LBound(csvList) To UBound(csvList)
ImportCsvWithQueryTable _
csvList(i), _
ThisWorkbook.Worksheets("Data"), _
ThisWorkbook.Worksheets("Data").Cells(1, 1)
Next i
End Sub
処理を分けているからこそ、
このような拡張が安全に行えます。
✅ QueryTablesを「テクニック」で終わらせないために
QueryTables.Addは、
「外部データを取れる便利なメソッド」
ではありません。
- どこで使うか
- どこまで任せるか
- どこから先を別処理にするか
これを判断できて初めて、
実務で使えるVBAになります。
QueryTables.Addは便利な手法ですが、
それ自体が目的になってしまうと、
「使っているはずなのに業務が楽にならない」状態に陥りがちです。
重要なのは、どのツールを使うかではなく、どこまで自動化すべきかを判断することです。
Excel業務改善における判断軸や、
ツール・自動化に迷う前に考えるべき設計思考については、
「Excel業務改善はどう判断すべきか?ツール・自動化に迷う前の設計思考」で整理しています。
✅ まとめ:QueryTables.Addは「取得専用」と割り切る
- QueryTables.Addは外部データ取得に特化した手法
- 取得条件・出力先を引数で管理する
- 再実行・保守を前提に設計する
- 加工処理は必ず分離する
QueryTables.Addを正しく使えるようになると、
外部データ取得は「不安要素」ではなく
安定した業務フローの一部になります。
ぜひ、
「動くコード」ではなく「育てられるコード」
という視点で、QueryTablesを使ってみてください。