Power Automate DesktopでExcelとWordを動かす！～書類作成の自動化～

こんにちは！
デジタル学び始めて2ヶ月、駆け出しプログラマーのおみえです。

普段パソコンで作業していて、「これ、地味に手間だなぁ」と感じたことはありませんか？
例えば、前に作成したデータをコピーして、中身を手作業で修正するような場合です。
以前、この春異動してきた新人さんに、今やってる業務で手間だなと思うことは何かあるかを聞いたところ、「書類を郵送する時に、住所調べたり、送付状作ったり、封筒準備したりやることが以外に多く手間です！」と答えていたのを思い出し、自動で作成できないかと考えました。

そこで、既存のExcelデータから値を抽出して、Wordのテンプレートに自動で転記する方法をPower Automate Desktopを使用して作成してみました。

　　　　　　<img width=500 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754093/53dbed15-bd98-b022-779c-2490bbd60b80.png>

# やりたいこと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754093/a147996f-f292-f864-5ef3-3bb9a269c8a7.png)


# 使用ツール
・Power Automate Desktop
・Excel
・VBA
・ChatGPT
・Word

# 完成品
https://x.com/hoshiee38/status/1797643640694882567

# 各データの準備・設定
<b>①　読み取るExcelデータ</b>
既存のExcelデータから、Ａ列に作成する行を指定する列を挿入しました。
`1`の記入がある行のデータのみ抽出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754093/08a7c695-e716-e063-79be-28c0d9a5f6b9.png)
<b>②　転記用Excelデータ</b>
このExcelにはWordテンプレートに書き出すVBAを組み込んでいます。
スクリプトは今後追加や編集がしやすいようにWordのテンプレートごとにモジュールを分けており、スクリプトはChatGPTに書いてもらいました。
※以前ChatGPTにスクリプトを書いてもらう記事を投稿していますので参考にしてください。

https://qiita.com/hoshieee/items/e6a13c3e8531507aa933

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754093/bd3b4712-1e78-6de1-c313-17c0c94d9618.png)
<b>③　Wordテンプレート</b>
Wordテンプレートのどの部分に②に転記した値を入れるかを指定する為、②のExcel1行目の項目を`<<項目名>>`で指定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754093/401101bf-7367-a6e1-4e2f-48b76f3ce5f6.png)

# Power Automate Desktopのフロー
<details><summary><b>フロー全体</b></summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754093/3665f1ac-1f57-d63f-ff28-ca40488bf4b2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754093/b3b92279-3883-0297-1fa3-40ac673bd529.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754093/19b7d795-e9e3-108e-c556-1ca079576725.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754093/e4974a33-d8b5-8b3c-5ae1-916015c78629.png)
</details>
<details><summary><b>フローのソースコード</b></summary>
下記のソースコードをコピーしてPower Automate Desktopのフロー画面に貼り付けるとフローをコピーできます。
※ファイルの保存先、ファイル名、マクロ指定は任意の名前に指定してください。

~~~md:Robin
DateTime.GetCurrentDateTime.Local DateTimeFormat: DateTime.DateTimeFormat.DateAndTime CurrentDateTime=> CurrentDateTime
Text.ConvertDateTimeToText.FromCustomDateTime DateTime: CurrentDateTime CustomFormat: $'''yyyy-MM-dd''' Result=> FormattedDateTime
Folder.Create FolderPath: `` FolderName: FormattedDateTime Folder=> NewFolder
File.Copy Files: $'''C:\\保存先指定\\template1.docx''' Destination: NewFolder IfFileExists: File.IfExists.DoNothing CopiedFiles=> CopiedFiles
File.Copy Files: $'''C:\\保存先指定\\template2.docx''' Destination: NewFolder IfFileExists: File.IfExists.DoNothing CopiedFiles=> CopiedFiles2
File.Copy Files: $'''C:\\保存先指定\\\\template3.docx''' Destination: NewFolder IfFileExists: File.IfExists.DoNothing CopiedFiles=> CopiedFiles3
File.Copy Files: $'''C:\\保存先指定\\〇〇.xlsm''' Destination: NewFolder IfFileExists: File.IfExists.DoNothing CopiedFiles=> CopiedFiles4
Excel.LaunchExcel.LaunchAndOpenUnderExistingProcess Path: $'''C:\\保存先指定\\〇〇.xlsx''' Visible: True ReadOnly: False Instance=> ExcelInstance
Excel.GetFirstFreeColumnRow Instance: ExcelInstance FirstFreeColumn=> FirstFreeColumn FirstFreeRow=> FirstFreeRow
Excel.ReadFromExcel.ReadCells Instance: ExcelInstance StartColumn: 1 StartRow: 1 EndColumn: FirstFreeColumn EndRow: FirstFreeRow ReadAsText: False FirstLineIsHeader: False RangeValue=> ExcelData
Excel.CloseExcel.Close Instance: ExcelInstance
Folder.GetFiles Folder: NewFolder FileFilter: $'''*.xlsm''' IncludeSubfolders: False FailOnAccessDenied: True SortBy1: Folder.SortBy.NoSort SortDescending1: False SortBy2: Folder.SortBy.NoSort SortDescending2: False SortBy3: Folder.SortBy.NoSort SortDescending3: False Files=> Files
Excel.LaunchExcel.LaunchAndOpenUnderExistingProcess Path: Files[0] Visible: True ReadOnly: False Instance=> ExcelInstance2
Excel.GetFirstFreeRowOnColumn Instance: ExcelInstance2 Column: $'''A''' FirstFreeRowOnColumn=> FirstFreeRowOnColumn
SET cnt TO 0
LOOP FOREACH CurrentItem IN ExcelData
    IF CurrentItem[0] = 1 THEN
        Excel.WriteToExcel.WriteCell Instance: ExcelInstance2 Value: FormattedDateTime Column: $'''A''' Row: FirstFreeRowOnColumn + cnt
        Excel.WriteToExcel.WriteCell Instance: ExcelInstance2 Value: CurrentItem[1] Column: $'''B''' Row: FirstFreeRowOnColumn + cnt
        Excel.WriteToExcel.WriteCell Instance: ExcelInstance2 Value: CurrentItem[6] Column: $'''C''' Row: FirstFreeRowOnColumn + cnt
        Excel.WriteToExcel.WriteCell Instance: ExcelInstance2 Value: CurrentItem[13] Column: $'''D''' Row: FirstFreeRowOnColumn + cnt
        Excel.WriteToExcel.WriteCell Instance: ExcelInstance2 Value: CurrentItem[11] Column: $'''E''' Row: FirstFreeRowOnColumn + cnt
        Excel.WriteToExcel.WriteCell Instance: ExcelInstance2 Value: CurrentItem[39] Column: $'''F''' Row: FirstFreeRowOnColumn + cnt
        Variables.IncreaseVariable Value: cnt IncrementValue: 1
    END
END
Excel.RunMacro Instance: ExcelInstance2 Macro: $'''TransferDataToWord_Template1'''
Excel.RunMacro Instance: ExcelInstance2 Macro: $'''TransferDataToWord_Template2'''
Excel.RunMacro Instance: ExcelInstance2 Macro: $'''TransferDataToWord_Template3'''
Excel.CloseExcel.CloseAndSave Instance: ExcelInstance2
~~~
</details>
<details><summary><font color="red"><b>アクション設定時の主な注意点</b></font></summary>

<b>2．datetimeをテキストに変換</b>
取得した現在の日時をテキストに変換する際、カスタム形式に`/`を使用してしまうと階層と認識されそれぞれのフォルダが作成されてしまいます。
`yyyy-MM-dd`とすることで（例）`2024-06-01`のフォルダが作成されます。
<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754093/c6f90d8f-4bfd-12ac-130c-ac029a3d3f91.png>
<b>15．変数の設定／24.変数を大きくする</b>
読み取ったデータを転記する際、次の行への書き込みを指定する為、変数の設定が必要です。書き込む前に変数`0`を設定し、1行書き込んだら変数`1`を追加すると次の行に書き込みされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754093/3154d617-05b2-3bbd-b431-6cd07eb73e81.png)
<b>17．if</B>
読み取るデータの１列目に`1`がついている行だけを抽出します。
<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754093/729bde9d-2d2c-2382-1dec-2ecc054b84ff.png>
<b>18～23．Excelワークシートに書き込む</b>
書き込む行を指定する際、15で設定した変数をプラスして指定します。
<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754093/85885ec8-7d33-3342-848e-d6da6c8512a5.png>
<b>27～29．Excelマクロの実行</b>
転記用Excelに組み込んだマクロ名を指定します。
<img width=400 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754093/4d1f0603-a986-11f7-83ad-d1b6481302f2.png>
</details>
<details><summary><b>作成されたWordデータ</b></summary>
赤字部分が抽出されたデータから転記された部分です。きちんと転記されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754093/d43b0496-6e47-946b-06b9-0b439f0bcddd.png)


</details>



# 作成したものを使ってもらってみた感想と課題
部署内のメンバーに実際使ってもらい感想を聞いてみました。

## 作成意図説明
:::note
テンプレートにExcelから作成したい行を指定するだけで、ボタン１つで自動でWordデータを作成してくれるツールを作りました！これを発展させれば契約書も自動で作れると思うんです。使ってみた感想を教えてください！
:::
### 外出が多く事務作業にあまり時間をかけたくない同僚
:::note warn
テンプレートコピーしてくれるのありがたい！
作るデータごとに作成ツールを別々で開くのは手間なので、１つのツールを開いて、テンプレートを指定して作成できるといい。
:::
今回はテンプレートの指定はできない為、個々に作成したいテンプレートが選択できる機能があると、いろんなデータを開かなくてもいいかもしれません。

### 封筒に手書きで宛名書きしていたこの春異動してきた新人さん
:::note warn
おおー！今、一番デジタルを感じています！封筒の宛名テンプレートも欲しいです。さらに印刷まで自動でしてくれるとありがたいです！
:::
印刷までは想定外でした。”Wordを開いて印刷ボタンを押す”までも自動化すべきか悩むところですが、単純な宛名や送付状であれば作成されたデータの中身確認は必要ないかもしれません。契約書であると確認は必要なのでいきなり印刷までしてしまうと紙の無駄になる可能性も。テンプレートによって設定が分けれないか検討してみます。
Power Automate Desktop、もしくはVBAで印刷機能も試しに追加してみようと思います。

# 課題
* 今回、データがフォルダに投稿されたら自動的に書類作成がスタートする機能を作りたかったのですが、Power Automate Desktopではトリガーが設定できません。Power Automateであれば〇〇が発生した時のようなトリガー設定ができます。一度そちらでも試してみようと思います。
* 抽出するデータ量が多いほど`For each`の繰り返しアクションが多くなる為、処理時間が長くなってしまいます。繰り返しの時間短縮方法や、データ抽出方法の検討も必要だと感じました。
* Power Automate Desktopは、インストールが必要で、メンバーのPCにインストールしてもらう必要があります。アカウント設定等が必要になるので、普段使い慣れているExcelのみで完結できるツールである方が使用しやすいかもしれません。

# 作成してみて感じたこと
今回はPower Automate Desktopを使用して自動化するツールを作成しましたが、ExcelのVBAのみでもできるのではないか、Power Automate Desktopを使用する必要があるのか？と感じていました。実際にテンプレートに書き出すのはVBAで設定しており、Excel上でボタンを設定すればExcelのみで完結できます。
自動化したけれども、その前や後の作業部分も自動化できるんじゃないかと他の人の意見や自分の思考を追加していき、また、様々な作成方法を知っているからこそ、より効率的にするには何を選ぶべきかを考えていくことが業務改善には必要だと感じました。
今回Power Automate Desktopを使用してみて思考力がさらに鍛えられました💪