Power Query(M言語)入門
ブック内のすべてのPower Queryをテキスト出力するVBA

生成AIの活用と研究の記録
公開日:2025-10-26 最終更新日:2025-10-26

ブック内のすべてのPower Queryをテキスト出力するVBA


Excelブック(ThisWorkbook)の中にあるすべてのPower Queryの「Mコード(WorkbookQueryのFormula)」を、クエリごとのテキストファイルとしてローカルに保存します。
併せて、保存したファイルへのハイパーリンク一覧をブック内の「クエリ一覧」シートに作成します。


「クエリ一覧」シート
ブック内のすべてのPower Queryをテキスト出力するVBA

「Query」フォルダ内にMコードのテキストを「クエリ名.txt」で出力。
「クエリ一覧」シートを作成し、A列にクエリ名を出力し、該当クエリへリンク。


手動での全クエリのMの詳細コード取得方法

全クエリのMの詳細コードを取得したいときは、「クエリと接続」のクエリ一覧で選択し、右クリックでコピーしてテキストエディタに貼り付けできます。

ブック内のすべてのPower Queryをテキスト出力するVBA

選択したすべてのクエリが一括でテキストエディタに貼りつきます。

ブック内のすべてのPower Queryをテキスト出力するVBA

各クエリの先頭に「// クエリ名」としてクエリ名が出力されます。
// Source_Base
// fn_CombineByA1Value


ブック内のすべてのPower Queryをテキスト出力するVBAコード

Sub ExportQueries()
  Const OUTPUT_FOLDER As String = "Query"
  Const QUERY_SHEET_NAME As String = "クエリ一覧"
  
  Dim wb As Workbook: Set wb = ThisWorkbook
  Dim fso As Object: Set fso = CreateObject("Scripting.FileSystemObject")
  
  Dim folderPath As String
  folderPath = wb.Path & "\" & OUTPUT_FOLDER & "\"
  
  ' フォルダ作成(存在しない場合のみ)
  If Not fso.FolderExists(folderPath) Then fso.CreateFolder folderPath
  
  ' クエリ一覧シートの準備
  Dim ws As Worksheet
  Set ws = GetOrCreateSheet(wb, QUERY_SHEET_NAME)
  ws.Cells.Clear
  ws.Cells(1, 1).Value = "クエリ名"
  
  ' クエリを出力
  Dim q As WorkbookQuery
  Dim filePath As String
  Dim row As Long: row = 2
  
  For Each q In wb.Queries
    filePath = folderPath & SafeFileName(q.name) & ".txt"
    
    ' ファイル書き込み(エラー処理含む)
    On Error GoTo WriteError
    Dim txt As Object
    Set txt = fso.CreateTextFile(filePath, True)
    txt.Write q.Formula
    txt.Close
    Set txt = Nothing
    
    ' シートにリンク作成
    ws.Hyperlinks.Add Anchor:=ws.Cells(row, 1), Address:=filePath, TextToDisplay:=q.name
    row = row + 1
    On Error GoTo 0
  Next q
  
  MsgBox "全てのクエリをエクスポートしました。", vbInformation
  Exit Sub

WriteError:
  MsgBox "クエリ '" & q.name & "' のエクスポートに失敗しました。" & vbCrLf & Err.Description, vbExclamation
  On Error GoTo 0
End Sub

'--- 補助関数:シートの存在確認と作成 ---
Private Function GetOrCreateSheet(wb As Workbook, aName As String) As Worksheet
  On Error Resume Next
  Set GetOrCreateSheet = wb.Sheets(aName)
  On Error GoTo 0
  
  If GetOrCreateSheet Is Nothing Then
    Set GetOrCreateSheet = wb.Sheets.Add
    GetOrCreateSheet.name = aName
  End If
End Function

'--- 補助関数:ファイル名に使えない文字を除去 ---
Private Function SafeFileName(ByVal aName As String) As String
  Dim badChars As Variant
  badChars = Array("\", "/", ":", "*", "?", """", "<", ">", "|")
  Dim i As Long
  For i = LBound(badChars) To UBound(badChars)
    aName = Replace(aName, badChars(i), "_")
  Next i
  SafeFileName = aName
End Function


ブック内のすべてのPower Queryをテキスト出力するVBAの解説

前提(事前に知っておくこと)

Excelのバージョン:Power Query(WorkbookQuery)が使えるExcelであること(Office 365 / Excel 2016 以降でPower Query機能がある環境が一般的)。
ブックの保存場所:ThisWorkbook.Path を使してフォルダを作るため、ブックがまだ保存されていない(Pathが空文字)の場合は対処が必要(下で対処法を示します)。
ファイル名の制約:Windowsのファイル名として使えない文字(\ / : * ? " < > |)をクエリ名から置換します(SafeFileName関数)。

全体の動作イメージ(ざっくり)

  1. 出力フォルダ(例:ブックがある場所\Query\)を作る(存在しないなら作成)。
  2. クエリ一覧 シートを得る(無ければ作成)して初期化。
  3. ブック中の Workbook.Queries を For Each で回し、各クエリの Formula(=Mコード)を .txt として保存。
  4. 保存したファイルへのハイパーリンクを クエリ一覧 シートに1行ずつ追加。
  5. エラーが起きたらそのクエリ名とエラー内容をメッセージ表示する(上書きや書き込みエラー等の通知)。

主要部分の詳細(行単位ではなく役割ごとに平易に)

出力フォルダの用意
folderPath = wb.Path & "\" & OUTPUT_FOLDER & "\"
If Not fso.FolderExists(folderPath) Then fso.CreateFolder folderPath
  • wb.Path(ブック保存先)直下に Query フォルダを作る。
  • Scripting.FileSystemObject(fso)でフォルダの存在確認と作成を行う。
注意点
wb.Path が空(ブック未保存)の場合、folderPath が "\Query\" のようになり失敗します。
VBA実行前に必ず保存しててください。

シートの準備(GetOrCreateSheet)
Set ws = GetOrCreateSheet(wb, QUERY_SHEET_NAME)
ws.Cells.Clear
ws.Cells(1, 1).Value = "クエリ名"
  • GetOrCreateSheet は「指定名のシートがあれば返す、なければ作る」という単純な補助関数。
  • シートは一度全部クリアしてから、1行目に見出しを入れます。

ファイル名の安全化(SafeFileName)
SafeFileName(q.Name)
  • クエリ名に含まれるとファイル作成で失敗する文字を "_“ 等に置換します。
  • 実装は Replace をループで適用するだけの単純な関数です。
注意点
置換した結果、別のクエリと同じファイル名になる(例:A:B と A/B が両方 A_B になる)可能性があります。
重複しないようにクエリ名をつけてください。

テキストファイルへの書き出し(ループ本体)
Set txt = fso.CreateTextFile(filePath, True)
txt.Write q.Formula
txt.Close
  • CreateTextFile(filePath, True) は上書き許可。既存ファイルがあれば上書きします。
  • q.Formula がMコード全文(文字列)です。クエリが大きい場合でもそのまま出てきます。
注意点
Excelの WorkbookQuery の Formula プロパティが何らかの理由で取得できない(権限や壊れたクエリ)場合、エラーになります。エラー処理で捕まえてメッセージに残すのがよいです(サンプルコードは捕捉済み)。

ハイパーリンク作成
ws.Hyperlinks.Add Anchor:=ws.Cells(row, 1), Address:=filePath, TextToDisplay:=q.Name
  • 各行にハイパーリンクを追加。クリックすれば .txt を開けます。
  • TextToDisplay は元のクエリ名(置換前)を表示するため、一覧は読みやすいです。

エラー処理
  • ループ内で On Error GoTo WriteError を使い、ファイル書き込みに失敗した場合は MsgBox で通知。
  • 重要:On Error Resume Next を乱用しない(不意の失敗を見逃してしまうため)。サンプルは必要箇所だけで使う構成です。

よくある落とし穴と対処法(実務的アドバイス)

  1. ブック未保存:ThisWorkbook.Path が空 → 実行前に保存させるか、代替パスを設定する。
  2. クエリ名に不正文字:SafeFileName で対処。ただし同名化に注意(重複処理の追加を推奨)。
  3. ファイルの上書き:CreateTextFile(..., True) は常に上書き。履歴を残したければ False にして重複名に数値付与する実装にする。
  4. 大量クエリで時間がかかる:画面更新・再計算をオフにする (Application.ScreenUpdating = False, Application.Calculation = xlCalculationManual) と速くなる。ただし終了時に元に戻すことを忘れずに。
  5. 権限やネットワークパス:フォルダがネットワーク上にある場合、書き込み権限があるか確認する。
  6. 改行コード:作成される .txt はWindowsの改行(CRLF)が入ります。別環境で使う場合は注意。


※この記事のVBAコードおよび解説文は生成AIを活用して作成し、その後に人間が確認してか掲載しています。





同じテーマ「PowerQuery(M言語)入門」の記事

列数不定のCSVの取り込み
CSVのA列が日付の行だけを取り込む
A列のヘッダー名を変更する
「売上」が数値の行のみ取り込む
2つのテーブルのマージ
グルーブ内の最小・最大
有効な最新単価の取得
新旧マスタの差異比較
シート関数のCOUNTIFS,SUMIFS,MAXIFSと同じ処理
セル値によるExcelシートの条件付き読み込みとデータ結合
ブック内のすべてのPower Queryをテキスト出力するVBA


新着記事NEW ・・・新着記事一覧を見る

AIは便利なはずなのに…「AI疲れ」が次の社会問題になる|生成AI活用研究(2026-02-16)
カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ