Robo1号の実践レシピ:フォルダ内のExcelを1つに集計する

PowerAutomateDesktop
Robo1号
Robo1号

うわーん、今月も支店から売上のExcelが10個も届いたよ…。全部開いて、コピーして、貼り付けて…。これだけで午前中が終わっちゃう!

Robo2号
Robo2号

Robo1号、それこそPADの出番です。今回から始まる新シリーズ「Robo1号の実践レシピ」では、これまで紹介したアクションを組み合わせて、実際の業務で使えるフローを作っていきます。

Robo2号
Robo2号

第1回は「フォルダ内のExcelを1つに集計する」フローです。

Robo1号
Robo1号

それ、まさにやりたかったやつ!よろしくね!

完成イメージ

フォルダに入っている複数のExcelファイルのデータを、1つのExcelファイルにまとめます。

  • 集計前:「売上データ」フォルダに、支店ごとのExcel(大阪支店.xlsx、京都支店.xlsx、神戸支店.xlsx …)が入っている
  • 集計後:全支店のデータが縦につながった「集計結果.xlsx」ができる

事前準備

フローを作る前に、次の2つを用意しておきます。

① 集計したいExcelを1つのフォルダにまとめる

今回は例として、C:\RPA\売上データ フォルダに集計したいExcelを入れておきます。

  • どのファイルも1行目が見出し、2行目からデータになっていること
  • どのファイルも列の並び(日付・商品名・数量・金額など)が同じであること

② 見出しだけ入れた「集計テンプレート」を作る

C:\RPA\集計テンプレート.xlsx を作り、1行目に見出しだけを入力しておきます。PADはこのテンプレートの2行目から下に、各ファイルのデータを書き足していきます。

Robo2号
Robo2号

テンプレートは「売上データ」フォルダの外に置いてください。フォルダの中に置くと、テンプレート自身も集計対象になってしまいます。

フローの全体像

使うアクションは次のとおりです。過去に解説したアクションは、リンク先で詳しく説明しています。

順番アクションやること
1変数の設定集計したいフォルダの場所を変数に入れる
2フォルダー内のファイルを取得フォルダ内のExcelファイルの一覧を取得する
3Excelの起動集計テンプレートを開く
4For eachファイルの数だけ、5~9を繰り返す
5Excelの起動支店のExcelを1つ開く
6Excelワークシートから読み取る支店のExcelのデータを読み取る
7Excelワークシートから列における最初の空の列や行を取得テンプレートの空いている行を調べる
8Excelワークシートに書き込み読み取ったデータを空いている行に書き込む
9Excelを閉じる支店のExcelを閉じる
10Excelを閉じる(名前を付けて保存)集計結果を別名で保存する

フローの作り方

1.変数の設定

「変数」→「変数の設定」を追加し、集計したいフォルダの場所を入れておきます。

  • 変数名:FolderPath
  • 値:C:\RPA\売上データ
Robo2号
Robo2号

フォルダの場所を変数にしておくと、あとで別のフォルダを集計したいときも、ここを1か所変えるだけで済みます。

2.フォルダー内のファイルを取得

「フォルダー」→「フォルダー内のファイルを取得」を追加します。

  • フォルダー:%FolderPath%
  • ファイル フィルター:*.xlsx
  • 生成された変数:Files(ファイルの一覧が入ります)

3.Excelの起動(集計テンプレートを開く)

「Excel」→「Excelの起動」を追加します。

  • Excelの起動:次のドキュメントを開く
  • ドキュメント パス:C:\RPA\集計テンプレート.xlsx
  • インスタンスを表示する:オン(動きを確認したいので表示しておきます)
  • 生成された変数:ExcelInstance

4.For each(ファイルの数だけ繰り返す)

「ループ」→「For each」を追加します。

  • 反復処理を行う値:%Files%
  • 保存先:CurrentItem(今処理しているファイルが入ります)

ここから先の5~9は、For each と End の間に入れます。

5.Excelの起動(支店のExcelを開く)

もう一度「Excelの起動」を追加します。

  • Excelの起動:次のドキュメントを開く
  • ドキュメント パス:%CurrentItem%
  • インスタンスを表示する:オフ
  • 読み取り専用として開く:オン(元のファイルをうっかり書き換えないため)
  • 生成された変数:ExcelInstance2
Robo2号
Robo2号

集計テンプレート(ExcelInstance)と支店のExcel(ExcelInstance2)で、インスタンスを分けているのがポイントです。インスタンスについては「PAD:インスタンスのお話」で詳しく説明しています。

6.Excelワークシートから読み取る

「Excel」→「Excelワークシートから読み取る」を追加します。

  • Excelインスタンス:%ExcelInstance2%
  • 取得:ワークシートに含まれる使用可能なすべての値
  • 詳細 →「範囲の最初の行に列名が含まれています」:オン
  • 生成された変数:ExcelData
Robo2号
Robo2号

「範囲の最初の行に列名が含まれています」をオンにすると、見出し行は列名として扱われ、データ部分だけが読み取られます。見出しはテンプレートに入っているので、ここでは見出しを読み取らないようにします。

7.最初の空の行を取得

「Excel」→「Excelワークシートから列における最初の空の列や行を取得」を追加します。

  • Excelインスタンス:%ExcelInstance%(集計テンプレートのほう)
  • 生成された変数:FirstFreeColumn、FirstFreeRow

FirstFreeRow に「データが入っていない最初の行の番号」が入ります。1つ目のファイルのときは 2、次のファイルのときはその続きの行番号になります。

8.Excelワークシートに書き込み

「Excel」→「Excelワークシートに書き込み」を追加します。

  • Excelインスタンス:%ExcelInstance%
  • 書き込む値:%ExcelData%
  • 書き込みモード:指定したセル上
  • 列:1
  • 行:%FirstFreeRow%

9.Excelを閉じる(支店のExcel)

「Excel」→「Excelを閉じる」を追加します。

  • Excelインスタンス:%ExcelInstance2%
  • Excelを閉じる前:ドキュメントを保存しない

10.Excelを閉じる(集計結果を保存)

最後に、For each の End の下に「Excelを閉じる」を追加します。

  • Excelインスタンス:%ExcelInstance%
  • Excelを閉じる前:名前を付けてドキュメントを保存
  • ドキュメント パス:C:\RPA\集計結果.xlsx
Robo2号
Robo2号

「名前を付けて保存」にすることで、テンプレートは見出しだけの状態のまま残ります。次回もそのまま使えます。保存については「PADアクション:Excelの保存」もご覧ください。

コピペ用フロー

下のコードをコピーして、PADのフローデザイナーに貼り付けると、今回のフローがそのまま再現できます。フォルダやファイルの場所は、ご自分の環境に合わせて変更してください。

動作確認はVer2.73です。

SET FolderPath TO $'''C:\\RPA\\売上データ'''
Folder.GetFiles Folder: FolderPath FileFilter: $'''*.xlsx''' 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: $'''C:\\RPA\\集計テンプレート.xlsx''' Visible: True ReadOnly: False Instance=> ExcelInstance
LOOP FOREACH CurrentItem IN Files
    Excel.LaunchExcel.LaunchAndOpenUnderExistingProcess Path: CurrentItem Visible: False ReadOnly: True Instance=> ExcelInstance2
    Excel.ReadFromExcel.ReadAllCells Instance: ExcelInstance2 GetCellContentsMode: Excel.GetCellContentsMode.TypedValues FirstLineIsHeader: True RangeValue=> ExcelData
    Excel.GetFirstFreeColumnRow Instance: ExcelInstance FirstFreeColumn=> FirstFreeColumn FirstFreeRow=> FirstFreeRow
    Excel.WriteToExcel.WriteCell Instance: ExcelInstance Value: ExcelData Column: 1 Row: FirstFreeRow
    Excel.CloseExcel.Close Instance: ExcelInstance2
END
Excel.CloseExcel.CloseAndSaveAs Instance: ExcelInstance DocumentFormat: Excel.ExcelFormat.FromExtension DocumentPath: $'''C:\\RPA\\集計結果.xlsx'''

うまく動かないときは

「~$」で始まるファイルでエラーになる

集計したいExcelを開いたままにしていると、フォルダに「~$大阪支店.xlsx」のような一時ファイルができ、それも読み込もうとしてエラーになります。実行前に、対象のExcelはすべて閉じておきましょう。

列がずれて書き込まれる

ファイルによって列の並びが違うと、データがずれてしまいます。すべてのファイルで、列の並びがテンプレートと同じになっているか確認してください。

途中に空白行があるとデータが上書きされる

「最初の空の行」は、データの途中に空白行があるとそこを空き行と判断することがあります。各ファイルのデータに空白行がないか確認しておくと安心です。

エラーで止まるとExcelが開きっぱなしになる

途中でエラーになると、非表示で開いたExcelが残ることがあります。その場合はタスクマネージャーからExcelを終了してから、もう一度実行してください。

応用アイデア

  • どの支店のデータかわかるように、ファイル名を列に追加する
  • 保存するファイル名に日付を入れて「集計結果_20261103.xlsx」のようにする
  • 集計が終わったら、元のファイルを「処理済み」フォルダに移動する

このあたりは、今後のレシピで紹介していく予定です。

Robo1号の感想

Robo1号
Robo1号

できたー!今までコピペで午前中かかってた作業が、ボタン1つで数十秒で終わったよ!Robo1号のなやみで書いた「大量のExcelデータ処理」も、これでだいぶ楽になりそうだね。事前にテンプレートを用意しておくのと、元のファイルは読み取り専用で開くのがコツだね。これで今日も定時で退社だ!

タイトルとURLをコピーしました