PowerAutomateDesktop「SQLステートメントの実行」でExcelデータを操作する

##概要
「SQLステートメントの実行」を用いたExcelデータの操作方法の紹介です。


　オンプレミスで自動処理を行う場合、フローにExcelデータの加工を組み込む場面があるかと思います。
PowerAutomateDesktopにはExcel操作アクションがいくつか用意されていますが、用意されたアクションで足りない場合は別の手段を使うことになります。

「列と行」のExcelデータに対してSQL文を使うことで、複数条件でのフィルター処理など標準アクションでは難しい部分を補うことができます。
通常のアクションだけでは困ったときに役立てればと思って書きました。

##注意事項と前提条件
PowerAutomateDesktopはプレビュー版のため仕様が変更される可能性があります。
~~2020年11月の情報になります。~~
2021年8月に更新しました

* PowerAutomateDesktop ~~（プレビュー）バージョン2.1.20312.19572~~ 2.12.171.21216
* Windows10Pro ~~20H2~~ 21H1

参考　
WinAutomation　Examples SQL With Excel

##デモシナリオ
マイクロソフトの[Power BI 用の Excel の財務サンプル ブック](https://docs.microsoft.com/ja-jp/power-bi/create-reports/sample-financial-download)を使わせていただきます。
入力した値(Year)でフィルターをかけ、Salesの値を集計してメッセージに表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/7a77ea1c-bff6-a527-d34a-c793811e6d1b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/7a8a7ca8-c350-7f8a-842c-5df477394021.png)

![excelsql.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/b947ac05-a74c-d852-7d9d-5437533c8184.gif)
Excelを開かずPAD内ですべて処理します
##準備
マイクロソフトのPower BI 用の Excel の財務サンプル ブックのダウンロードから「財務サンプル Excel ブック」をダウンロードしてデスクトップに置いておきます。
https://docs.microsoft.com/ja-jp/power-bi/create-reports/sample-financial-download

##フローを作成
#### 適当な名前を付けてフローを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/ee43e7bd-1124-ef3a-3aa5-f1b9116bbb82.png)
####1. 特別なフォルダーを取得
![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/d7fc80e3-f798-1298-6806-2c5cf0444098.jpeg)
####2. 入力ダイアログの表示
フィルターの数値入力変数の設定（今回はYear)用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/8be99fef-00d5-8fee-bd84-b5f94be8862c.png)

####3. デスクトップにおいたサンプルExcelファイルのパスを設定
変数名：``%ExcelPath%``
宛先：``%SpecialFolderPath%\Financial Sample.xlsx``
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/2cfe7ad6-0ba7-5ad8-051f-28024311a93b.png)

####4. SQL接続を開く　OLE DBプロバイダー接続文字列を設定 
OLE DBはマイクロソフトの設計したAPIです。
APIに接続するための文字列を設定します。
%ExcelPath%の部分は3で設定したExcelファイルのパスが代入されます。

変数名デフォルト　%SQLConnection%　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/2704d473-afe8-09b6-c9e2-0dc4239c656c.png)


接続文字列

```
Provider=Microsoft.ACE.OLEDB.16.0;Data Source=%ExcelPath%;Extended Properties="Excel 12.0 Xml;HDR=YES"; 
```

####5. SQLステートメントの実行を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/43d768f4-02fe-0d9e-12f0-e89beb9f4bcb.png)




接続の取得方法:　`SQL接続変数`
接続文字列: `%SQLConnection%`
今回は入力したYearの値でフィルターを行いSalesを合計したいのでSQLステートメントは以下のように設定します。

```
Select sum([ Sales]) as [合計]
from [sheet1$]
where Year = "%UserInput%"
```
注意　サンプルデータのSales列名はSの前に半角スペースが開いています。[ ]内に記述するときに同様に記述しないとエラーが出ます。

**変数名は%QueryResult%自動的に設定されます。**
**%QueryResult%に返されるデータは2次元配列（行と列データ）になります。**
**列名を除いたデータ部分が返されます。**
**Excelと違いindexが0から始まります。**
**ExcelでいうA1セルは%QueryResult[0][0]%となります。**
**%QueryResult[行index][列index]%の表記になっています。**


Excel(A1) = %QueryResult[0][0]%　　Excel(B1) = %QueryResult[0][1]%
Excel(A2) = %QueryResult[1][0]%　　Excel(B2) = %QueryResult[1][1]%

のような対応関係です。

####6.SQL接続を閉じる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/df696829-cbfc-269f-b91a-90c24f3926bd.png)

####7.メッセージの表示
最後に集計値をメッセージで表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/55a87bf4-e328-81d4-55cb-88cecb369656.png)


##完成
今回のプロセスは以下の通りとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680039/cf89bdc9-6c16-ddae-49fc-fe9d4e252fab.png)



空のフローを作成後、以下のコードを貼りつけて試すこともできます。
以下のコードを実行するには [サンプルxlsx](https://docs.microsoft.com/ja-jp/power-bi/create-reports/sample-financial-download)をデスクトップに置いて下さい。

```
Folder.GetSpecialFolder SpecialFolder: Folder.SpecialFolder.DesktopDirectory SpecialFolderPath=> SpecialFolderPath
Display.InputDialog Title: $'''PowerAutoDesktop''' Message: $'''集計年を入力してください''' InputType: Display.InputType.SingleLine IsTopMost: False UserInput=> UserInput ButtonPressed=> ButtonPressed
SET ExcelPath TO $'''%SpecialFolderPath%\\Financial Sample.xlsx'''
Database.Connect ConnectionString: $'''Provider=Microsoft.ACE.OLEDB.16.0;data source=%ExcelPath%;extended properties=\"Excel 12.0 xml;HDR=yes\";''' Connection=> SQLConnection
Database.Execute Connection: SQLConnection Statement: $'''Select sum([ Sales]) as [合計]
from [sheet1$]
where Year = \"%UserInput%\"''' Timeout: 30 Result=> QueryResult
Database.Close Connection: SQLConnection
Display.ShowMessage Title: $'''PowerAutomateDesktop''' Message: $'''%UserInput%年の売上は＄%QueryResult[0][0]%です。''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed2
```

##まとめ
構造化されたExcelデータに対してSQLステートメントを実行することでExcel標準アクションでは行えないフィルター処理などの操作が可能です。
Insert や Update等も使えるので活用の幅が広がると思います。

SQL編その2に続きます。

https://qiita.com/sys_zero/items/f84e8b1eb492dd4a2dd1

追記　2021年8月ループを使用しないフローに変更しました。