Power Query を VBA から追加すると、CSV やテキストファイルの読み込みをワンクリックで再実行できるようになり、日々のデータ更新が簡素化されます。本記事では WorkbookQuery オブジェクト を利用し、CSV データ接続を登録するサンプルコードとポイントを解説いたします。
目次
使用環境
| 項目 | 内容 | 
|---|---|
| Excel | Microsoft 365 / 2019 / 2016 | 
| 言語 | VBA(Visual Basic for Applications) | 
| 対象ファイル | sales_data_utf8.csv(UTF‑8 形式) | 
サンプルコード
Sub AddPowerQueryConnection()
    
    Dim csvPath  As String    ' 読み込む CSV ファイルのフルパス
    Dim mCode    As String    ' Power Query (M 言語) のコード
    
    ' ファイルパスを組み立て
    csvPath = ThisWorkbook.Path & "\sales_data_utf8.csv"
    
    ' **********  Power Query (M) コード  **********
    mCode = "let" & vbCrLf & _
            "    Source = Csv.Document(" & _
            "File.Contents(""" & csvPath & """)," & _
            "[""Delimiter"","",""," & _
            """Encoding"",""65001""])" & vbCrLf & _
            "in" & vbCrLf & _
            "    Source"
    ' **********************************************
    
    ' 既存クエリと重複しないよう、存在チェック
    Dim qryName As String: qryName = "PQ_CSVImport"
    Dim qry     As WorkbookQuery
    
    On Error Resume Next
    Set qry = ThisWorkbook.Queries(qryName)
    On Error GoTo 0
    
    If qry Is Nothing Then
        ' クエリが存在しない場合は新規追加
        ThisWorkbook.Queries.Add Name:=qryName, Formula:=mCode
    Else
        ' 存在する場合は上書き更新
        qry.Formula = mCode
    End If
    
    MsgBox "Power Query の登録が完了しました。", vbInformation
    
End Sub
コード解説
| 項目 | 説明 | 
|---|---|
Csv.Document | Delimiter と Encoding=65001(UTF‑8)を指定し、文字化けを防ぎます。 | 
WorkbookQuery | ThisWorkbook.Queries.Add でクエリを新規登録、Formula で上書き更新が可能です。 | 
| 重複チェック | 既存クエリ名と重複する場合、上書きすることで管理を簡素化します。 | 
応用アイデア
| 要件 | 実装例 | 
|---|---|
| 別シートへテーブルとして読み込み | ActiveWorkbook.Connections.Add2 と ListObject.QueryTable を組み合わせます。 | 
| 区切り文字や列型を動的変更 | Delimiter や Columns の定義部分を文字列操作で置換します。 | 
| 複数ファイルの一括登録 | ファイル名を配列管理し、For Each でクエリ名を変えてループ追加します。 | 
まとめ
WorkbookQueryを使用すると、Power Query の M コードを VBA から直接挿入・更新できます。- CSV など外部データの再読込がボタン 1 つで完結し、月次・週次レポートの更新が効率化します。
 - 既存クエリ名を先に確認してから追加・上書きすると、ブック内のクエリ管理が容易です。
 
Power Query と VBA を組み合わせ、手作業のデータ更新を自動化してみてはいかがでしょうか。
