🌰

Power Automate Desktop ExcelファイルをSQLで操作する

2024/01/06に公開

Excelデータからデータテーブルに読み込んで操作するならSQL接続を使うと便利かも

はじめに

以前、PADでデータテーブルを操作するのにこんなにアクションが少なくて何が出来るの?
と言いました。……そこまでは言ってなかったかな?

ともかく、SQLを使えば良かったんですね。

ExcelデータをSQLで操作する方法について、下記の記事が大変参考になりました。
Zero Sys(@sys_zero)さん、ありがとうございました。

参考
https://qiita.com/sys_zero/items/2a68575d6ccd82bed902
https://qiita.com/sys_zero/items/f84e8b1eb492dd4a2dd1

公式サイト
https://learn.microsoft.com/ja-jp/power-automate/desktop-flows/how-to/sql-queries-excel

この記事はここでおしまいです。あとはおまけ。


詰まったところ

あいまい検索

パターンマッチングしたくて以下のコードを記述したら0件になって悩みました。
(*) 使えないの?

(*) じゃなくて (%) でした。上の記事のその2に書いてありました。

PAD SQLステートメント NG
SELECT * FROM [%Sheet%$] WHERE [列名] LIKE "*中央区"
PAD SQLステートメント OK
SELECT * FROM [%Sheet%$] WHERE [列名] LIKE "%%中央区"

しかも、PADで (%) は変数を表す特殊文字として使用されているので、パターン文字列の (%) を (%) でエスケープする必要があって (%%) になると。どっと疲れました。

っていうかなんで%? *で良くない?
自分の知っているのはこれ。

文字 説明
* 任意の数の文字
? 任意の1文字
# 任意の1文字の数字
[文字リスト] 文字リスト内の1文字
[!文字リスト] 文字リスト以外の1文字
[文字1-文字2] 文字1~2の範囲の1文字
[!文字1-文字2] 文字1~2の範囲以外の1文字

……いま手持ちの本を見てたら 重要 表記で書いてありました。[1]

  • ANSI-89は、通常のデータベースファイルに対してクエリを実行するときや「DAO」というオブジェクトを用いてデータにアクセスする際に使用されます。
  • ANSI-92は、Microsoft SQL Serverに接続されたデータベースファイルに対してクエリを実行するときや「ADO」というオブジェクトを用いてデータにアクセスする際に使用されます。
ANSI-89 ANSI-92 説明
* % 任意の数の文字
? - 任意の1文字
[!文字リスト] [^文字リスト] 文字リスト以外の1文字

日付の比較

関数で日付を入力する方法はわかりやすい。

PAD
SELECT * FROM [%Sheet%$] WHERE [列名] < DATE()

ついでに

改行する/しないは好きに。

PAD
SELECT * FROM [%Sheet%$] 
WHERE [F22] = "未登録"
AND [F21] < DATE()

「列番号」は、Column1~ではなくF1~です。実際に動かしてフロー変数を見て確認しましたが、書籍の方にもExcelブックへの接続の項目で「列番号」について書いてありました。

「列番号」には、抽出条件に指定するフィールドを「F+番号」の形式で記述します。たとえば、1列目のフィールドなら「F1」を、2列目のフィールドなら「F2」を記述します。[2]

ヘッダー

ヘッダーに改行があるデータをこれで読み込んだ場合に、改行なしになってデータテーブルになるのは何気に良いなと思いました。
Excelのアクションで読み込んだ場合は、改行ありのままヘッダーになってその後の処理で困るので。
そもそもヘッダーで改行使わないでって話なんですけどね。

良いなと書いたけど、CSVデータの頭から数行に余計な記述があって
HDR=YESでSQL接続を開けないファイルが多いのが困ったものです。


実際に使ってみると……

ここまで試してきて、いざ実際に使ってみようとするとうまくいきませんでした。SQL以外の要因で。
業務で利用するファイルは秘密度ラベルで情報管理を適切に設定することが必須になっていて、そういったファイルはSQL接続ではエラーになり開けませんでした。

こういうの。

秘密度🏷

情報
https://support.microsoft.com/ja-jp/office/ファイルとメールに秘密度ラベルを適用する-2f96e7cd-d5a4-403b-8bd7-4cc636bae0f9?ns=excel&version=90&ui=ja-jp&rs=ja-jp&ad=jp

一旦Excelを開いてデータを読み取り→新規ブックに書き込んで保存→SQL接続を開く→SQLステートメントの実行→SQL接続を閉じる→ブックを削除→みたいにすると出来そう。

あとは他の方法でなんとかするしか。


あとがき

SQL接続が使えればExcelを開いて読み取るよりもサクッと行けてとても良さげなので、データテーブルを操作する手段のひとつとしてSQL良いかも。と思いました。サクッと行けてないですが。

引用した書籍のリンク
https://vbae.odyssey-com.co.jp/study/textsearch.html#a_standard

脚注
  1. 武藤 玄.VBAエキスパート公式テキスト Access VBA スタンダード.オデッセイ コミュニケーションズ,2021,p.168-169. ↩︎

  2. 武藤 玄.VBAエキスパート公式テキスト Access VBA スタンダード.オデッセイ コミュニケーションズ,2021,p.228. ↩︎

Discussion