
Excel帳票内の繰り返しデータを別の表にコピーする【3/4】
Power Automate for desktopは、Windows 11に標準搭載のRPAです。マイクロソフト自身がより高機能な有償版を販売していますが、無償版のPower Automateでもほとんどのことは間に合います。シリーズの前回では、複数のExcelファイルを1枚の表に集約するフローの骨格部分を説明しました。
第3回 Excel帳票内の繰り返しデータを別の表にコピーする(今回)
前回までにできたこと
フローとして実現したい処理は以下のとおりでした。打ち消し部分は前回までに説明済みですので、今回は3〜5の説明です。
集約先のExcelファイルを開く元のExcelファイルのあるフォルダを開く元のExcelファイルを開く(すべてのExcelファイルを読み終えたら6に進む)
元のExcelシートのセルをコピーし、集約先のExcelシートに貼り付ける
4を繰り返し、作業が終わったら3に戻る
集約先のExcelファイルを保存して閉じる
ここまでの説明で、以下のようなフローを作成しました。

上の画面写真の6のアクション(赤枠の直前のアクション)では、フォルダー内にある拡張子が.xlsxのファイルリストを取得し、SourceFilesという変数に格納しています。SourceFilesの内容は、
C:\Users\…\消防立入検査\集約対象ファイル\20241022_立会検査結果通知書.xlsx
C:\Users\…\消防立入検査\集約対象ファイル\20241023_立会検査結果通知書.xlsx
C:\Users\…\消防立入検査\集約対象ファイル\20241024_立会検査結果通知書.xlsx
のような、集約対象になるファイルのリストです。集約対象に選んだフォルダ内に*.xlsxファイルが100件あれば100件、1000件あれば1000件のリストになります。また、「サブフォルダーを含める」スイッチをONにすれば、サブフォルダー内の該当ファイルもまとめてリストになります。「フォルダー内のファイルを取得する」アクションには並べ替えのオプションもありますので、ファイル名順、サイズ順、作成日時順に処理したい、といった細かい設定もできます。
処理対象のファイルリストが手に入ったので、いよいよRPAらしい処理を設定します。「ループ」アクショングループから「For each」アクションを選んで設定しましょう。

「For each」アクションの設定は、繰り返し対象のリスト変数を選ぶだけです。ここではSourceFilesが処理対象ですので「反復処理を行う値」に「%SourceFiles%」を設定、保存先変数を「SourceFile」にします。ほぼ同じ用途の変数ですが、複数形と単数形で使いわけています。
「For each」は、リスト内の値を一巡するまで同じ処理を繰り返したいときに使うループ処理用のアクションです。SourceFilesリストの先頭からファイルを順に取り出し、SourceFile変数に格納してくれます。SourceFile変数の内容が順に変わるので、For eachアクション内に繰り返したい処理内容を書けばよいのです。ただし、リストを取得したあとでファイルが何かのきっかけで削除されてしまうと、このあとの処理を実行できません。そこで、「ファイル」アクショングループから「ファイルが存在する場合」アクションを選び、「For each」アクションの内側(水色のバンド内)にドラッグ・アンド・ドロップし、以下のように設定します。

「%SourceFile%」が「存在する」ことを確認してから、いよいよ実際の繰り返し処理を設定します。
Excelでファイルを開いて値を読み取る
ここから設定する内容をもう一度確認します。いまから設定したいのは以下の処理です。
集約先のExcelファイルを開く元のExcelファイルのあるフォルダを開く元のExcelファイルを開く(すべてのExcelファイルを読み終えたら6に進む)
元のExcelシートのセルをコピーし、集約先のExcelシートに貼り付ける
4を繰り返し、作業が終わったら3に戻る
集約先のExcelファイルを保存して閉じる
そして、ここまでの設定で、Power Automateは下のような編集画面になっているはずです。

ここからは、集約対象のExcelファイルの内容を読んで、データを集約先に転記する作業です。まずは元のExcelファイルを開きます。「Excel」アクショングループから「Excelの起動」アクションを選び、下のように設定してください。

変数「%SourceFile%」には集約対象のExcelファイルのパス(ファイルの場所+ファイル名)が入っていますので、SourceFile変数を指定してExcelを起動します。さらに、ここで起動したExcelワークシートのインスタンスを変数として扱えるように変数名をSourceBookに変更しました。
ここまでの段階で、処理がまたひとつ実現しました。
集約先のExcelファイルを開く元のExcelファイルのあるフォルダを開く元のExcelファイルを開く(すべてのExcelファイルを読み終えたら6に進む)元のExcelシートのセルをコピーし、集約先のExcelシートに貼り付ける
4を繰り返し、作業が終わったら3に戻る
集約先のExcelファイルを保存して閉じる
次は、「4. 元のExcelシートのセルをコピーし、集約先のExcelシートに貼り付ける」のうち、「元のExcelシートのセルをコピーし、」の部分を作ります。
SourceBook変数を使うと、いま開いているExcelブックをPower Automateで指定できるようになります。データを転記したいExcelファイルは以下です。

ここから先の設定はとても地味です。読み取りたいセルのアドレスを調べて、読み取った値を個々の変数に格納していきます。たとえば、文書の右上の「I1」セルにある文書番号を読み取るには、「Excel」アクショングループから「Excelワークシートから読み取る」アクションを選んで、下のように設定します。

Excelインスタンスには、集約対象のExcelファイルを示す%SourceBook%変数を指定します。先頭列には「I」、先頭行には「1」を指定し、格納先の変数名は「DocNum」にします。
この例は、実は説明用にはわかりにくいです。反省しています。先頭列の「I」はアルファベットの大文字アイです数字の1ではないです。Excelではセルのアドレスを左上のA1から列方向にアルファベット、行方向に数字を割り当てて指定します。このアクションで指定しているのは、先頭列「I」、先頭行「1」は、Excelワークシート内の「I1」セルから値を取ってきてください、という処理です。
今回は説明用にもっとも基本的な「単一セルの値」を取得するアクションにしていますが、特定の範囲を一度に読み取って、リストのように扱って処理することもできます。アクションの実行は時間がかかるので、いちいちExcelワークシートから値を取得するより、Power Automate内で変数を読み取った方が早くなることもあります。この辺りは、お手持ちのExcelワークシートの状況によって最適解が変わりますので、試行錯誤して経験値をためてください。
このあとは、取得したいセルをひとつづつ読み取って、個々の変数に格納する地味な作業の連続です。正直いって飽きてくるし、昼食後だと眠くなります。集中力が保てる状態のとき、一気に進めるのがよいです。
読み取った値を転記する
「4. 元のExcelシートのセルをコピーし、集約先のExcelシートに貼り付ける」のうちの前半ができました。以下では、「集約先のExcelシートに貼り付ける」を処理を設定します。
集約先のExcelワークシートは、変数%TargetBook%で指定できます。このワークシートの表に、集約対象のExcelワークシートの値を行として追加することで、たくさんのファイルを1枚の表に集約できます。
では「行として追加する」とは何でしょうか? 表の値を読み取るときは「I1」のようにセルのアドレスを直接指定できました。しかし、行を追加すると、毎回行が増えてしまい、アドレスでは指定できません。そこで「Excel」アクショングループから「Excelワークシートから最初の空の行や列を取得」アクションを選び、以下のように設定します。

「Excelワークシートから最初の空の行や列を取得」アクションを使うと、指定したExcelインスタンスにある、値のない最初のセルのアドレスを変数「FirstFreeColumn」「FirstFreeRow」に取得できます。FirstFreeColumnは列ですのでアルファベット、FirstFreeRowは行ですので整数が入ります。ただし、今回は取得した集約対象のExcelワークシートの値を行にするのが目的ですので、FirstFreeColumnは使いません。
集約先のExcelワークシートは、以下のようになっています。

表なので、列のアドレスは固定で、新規行が何行目なのかわかればよいのです。上の画面では、表にはまだ何も値が入っていません。この状態で取得したFirstFreeRowには「2」が格納されます。文書番号はA列に入れることになっていますから、DocNum変数に格納されている「第0000045588号」という値を書き込む先は「A2」セルです。そこで「Excel」アクショングループから「Excelワークシートに書き込む」アクションを選び、以下のように設定します。

値を書き込む先のワークシートとして「%TargetBook%」、書き込む値は「%DocNum%」、書き込みモードとして「指定したセル上」を選び、列に「A」、行に「%FirstFreeRow%」を指定します。いま、「%TargetBook%」には集約先のインスタンス、「%DocNum%」には「第0000045588号」、%FirstFreeRow%には「2」が格納されていますので、この設定をExcelの言葉で言い直すと、「集約先のワークシートの2行目のA列に”第0000045588号”を書き込む」になります。処理そのものはとても単純なのに、アクションの設定を説明しようとすると小難しくなってしまいます。でも、処理そのものはとてもシンプルです。値を読み取って、読み取った値を書く。それだけのことです。
こうして、読み取りたいセルを読み、表に書き込む処理を繰り返し、ループの最後に到達したら、集約対象のExcelファイルを閉じましょう。「Excel」アクショングループから「Excelを閉じる」アクションを選んで、以下のように設定します。

Excelインスタンスには、集約対象のExcelワークシートである「%SourceBook%」を指定します。集約対象は編集しませんので、Excelを閉じる前には「ドキュメントを保存しない」を選びます。
以上で、個々のファイルの処理は終わりました。ファイルリストを読み取って、まだ未処理のファイルが残っていれば同じ処理を繰り返し、すべて処理し終えたらフローが完了し、集約対象のExcelファイルを保存して終了します。今回設定したアクションを実行すると、以下のように動作します。
以下は操作動画です。
Power Automateのフローの実行によって、Excel帳票3ファイルが、以下のような表に変換できました。

次回は、表の内容を生成AIで処理する方法について紹介します。
本記事は、[株式会社ビジー・ビー]の許諾を得て転載しています。
ビジー・ビーでは生成AIを活用したコメントデータ分析や、Excel業務の効率化を支援するツールやソリューションを提供しています。
ご質問、ご相談は、以下のフォームからお問い合わせください。
マガジン:無料のRPA(PowerAutomate)の使い方
Windows 11標準搭載の「Power Automate for desktop」活用術や、Excel業務効率化の最新テクニックを具体的な事例で紹介します。また、生成AIを活用したデータ分析や予測、業務効率化に関する記事も充実。月4回程度の更新で、初心者からプロフェッショナルまで幅広い層に役立つ内容をお届けします。このマガジンで、新しいデジタルツールの活用法を学び、データ分析や業務効率化に挑戦してみませんか?