LoginSignup
3
9

More than 1 year has passed since last update.

PowerQuery でセルの値をパラメーター変わりに使う

Last updated at Posted at 2021-10-27

PowerQueryのパラメーター

PowerQueryにパラメーターというものがあるが、
使い勝手を知らない人には説明しづらいため、
セルに入力した値をPowerQuery内のSQLクエリに反映する方法を探した。

パラメーターをつくる

入力セルを決める

まずはパラメーターを入力する箇所を作り、テーブル化する。
「ID」がヘッダー、「neko.cat」は任意の値。
excel6.png

セルを取り込む

テーブルにカーソルを合わせて、データ⇒テーブルまたは範囲から を押すと、
PowerQuery内の数式に以下が入力される。

= Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content]

これではテーブルとして認識されているため、以下のようにする
0番目(テーブルの1行目)だけを取り出した状態になる。

= Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content]{0}[ID]

SQLを用意する

実行したいSQLを用意して、パラメーターに使いたい箇所に、
任意の文字列を入力する。
今回はWHEREの「--PARAM--」の位置にパラメーターを使う。

SELECT
    *
FROM
    (values
    ('NEKO'),('CAT'),('neko.cat'),('cat.neko')
    ) as cat_neko_table (nekocat_id)
WHERE
    nekocat_id = '--PARAM--'

クエリに取り込む

上記で用意してきたものを組み合わせて、1つのクエリにしていく。

let
/*先ほど取り込んだセルの式を入れる*/
PARAM = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content]{0}[ID],

/*先ほど書いたSQLを入れる*/
BASESQL = "
SELECT
    *
FROM
    (values
    ('NEKO'),('CAT'),('neko.cat'),('cat.neko')
    ) as cat_neko_table (nekocat_id)
WHERE
    nekocat_id = '--PARAM--'",

/*--PARAM--」の文字列を、PARAM(セルの値)にReplaceする*/
SQL = Text.Replace(BASESQL, "--PARAM--", PARAM),

ソース = Sql.Database("サーバー名", "データベース名", 
        [Query=SQL])
/* ODBCなら「ソース = Odbc.Query("dsn=DSN", SQL) */
in
    ソース

閉じて読み込みデータを出力すると、パラメーターに入力された内容で
条件付けがされていることがわかる。
image.png

パラメーターを「CAT」に変えて更新してみると、出力データも変わった。
image.png

結果

日付の期間指定をする場合は2つパラメーターが必要である。
PowerQueryの相対日付フィルターなどでよいのでは?と思う場面もあるが、
データ量が多い場合は、SQLから期間指定をしたほうが都合がよい時がある。

難点としては、毎回更新する度に「ネイティブクエリ実行の許可」を
しなくてはならない。

本来パラメーターとして用意されている機能も、
よく調べたらユーザーライクに使えるものなのかもしれない。

3
9
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
3
9