0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Power Query × INI設定ファイルでExcel自動化を環境対応させる技

Last updated at Posted at 2025-10-31

1. はじめに

Excel業務の自動化と“起動時制御”の課題

Excelのブックを開くだけで、自動的に処理を開始させることができます。

ただし、Accessと違い Excelでは「自動実行を制御する仕組み」が標準ではありません。
ブックを開くたびに必ず処理が始まるので、メンテナンスや検証の際にはやや不便です。

「起動時に自動実行するか」を設定ファイルに記載し、起動時にこのファイルに従って制御すると、この問題が解消できます

2. 外部設定ファイル(INI)の準備

Excelの起動設定を制御するため、.ini ファイルに設定値をまとめて管理します。

INIファイルとは

セクションという単位( [●●●] )ごとに、キー名称と値をそれぞれ設定できます。
今回は test セクションの中の OpenExeF(起動時実行フラグ)を読み取ります。

[default]
; テンプレート(共通定義)
ApiKey =
OpenExeF =  


[test]
ApiKey = test-api-key-123
; 自動実行フラグ(1=自動実行、0=手動)
OpenExeF =    0


3. 起動時の自動実行を制御する(VBAトリガー)

起動制御のベースとなるのは、Excelブックの Workbook_Open() イベントです。

処理の流れは次のとおりです。
1.Power Queryの更新を開始する
2.INIの設定値を取得する
3.後続処理(今回はメッセージポップアップ)します

今回はまったこととして、Power Queryの更新は非同期のため、
クエリ完了を待たずに次の処理へ進み、設定が正しく反映されないことがありました。

そのため、クエリの更新完了を待機する一行を入れておきます。

Private Sub Workbook_Open()
    Application.EnableEvents = False
    Application.ScreenUpdating = False

    ' 設定読込クエリを更新 → 完了待ち
    ThisWorkbook.Queries("設定読込").Refresh
    Application.CalculateUntilAsyncQueriesDone

    ' 例:結果表示(任意。設定読込シートC2にModeなどを出す想定)
    On Error Resume Next
    MsgBox "現在の設定は " & Worksheets("設定読込").Range("C2").Value & " です"
    On Error GoTo 0

    Application.ScreenUpdating = True
    Application.EnableEvents = True
End Sub

4. Power Query によるiniファイルの呼出

Power QueryでINIファイルを読み込み、指定セクションとキーの値を抽出します。
Power Query エディターで「詳細エディター」を開き、以下のコードを貼り付けます。

※なお、クエリ名は「設定読込」と設定しておきましょう。

パワークエリ(M言語)コード

※1行目と2行目のファイル名とフォルダパス、及び最終数行のフィルタについては、環境に合わせて適宜修正してください

let
    // パス設定
    フォルダーパス = "C:\Users\kenic\Downloads\2025.10.31_自動実行制御\",
    ファイル名 = "test.ini",
    INIパス = (if Text.EndsWith(フォルダーパス, "\") then フォルダーパス else フォルダーパス & "\") & ファイル名,

    // INI読み込みと整形
    行データ = Lines.FromBinary(File.Contents(INIパス)),
    空白除去 = List.Transform(行データ, each Text.Trim(_)),
    有効行 = List.Select(空白除去, each _ <> "" and not Text.StartsWith(_, ";") and not Text.StartsWith(_, "#")),

    // セクション・キー・値の抽出
    抽出結果 =
        List.Accumulate(
            有効行,
            [セクション = null, 行リスト = {}],
            (状態, 行) =>
                if Text.StartsWith(行, "[") and Text.EndsWith(行, "]") then
                    [セクション = Text.BetweenDelimiters(行, "[", "]"), 行リスト = 状態[行リスト]]
                else if Text.Contains(行, "=") then
                    [セクション = 状態[セクション],
                     行リスト = 状態[行リスト] & {
                        [セクション = if 状態[セクション] = null then "default" else 状態[セクション],
                         キー = Text.Trim(Text.BeforeDelimiter(行, "=")),
                         値 = Text.Trim(Text.AfterDelimiter(行, "="))]
                     }]
                else 状態
        )[行リスト],

    // テーブル化と重複処理
    INI表 = Table.FromRecords(抽出結果),
    逆順 = Table.ReverseRows(INI表),
    重複除去 = Table.Distinct(逆順, {"セクション", "キー"}),
    元順序 = Table.ReverseRows(重複除去),

    // 絞り込みと型変換
    抽出行 = Table.SelectRows(元順序, each ([セクション] = "test") and ([キー] = "OpenExeF")),
    型変換 = Table.TransformColumnTypes(抽出行, {{"値", type number}})
in
    型変換

5. 応用

設定を外だしすることで、今回のように起動時の制御をするだけでなく
複数のブックから共通の設定を参照できます。

たとえば――

  • パス設定管理:ログファイルの保存先を指定可能
  • APIキーを共通管理:ブックを配布しても内部にキーを残さず、安全に共有可能
  • APIキーの定期変更にも対応.ini ファイルを入れ替えるだけで反映可能

このように、設定をExcel外に切り出してPower Queryで読み込む構成は、
「起動制御」だけでなく 環境管理・機密管理の基盤 としても活用できます。


6. まとめ

.ini ファイルは、Excel業務自動化のための設定の中核です。
各ブックが起動時に参照できるため、
最新の設定情報を外部から柔軟に制御できます。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?