この記事ではPower Automate for desktopを使って、キーワードリストに列挙したキーワードにマッチしたファイルをフォルダから抽出して取得する方法について学習します。
この記事のゴール
- KeywordList.xlsxに開きたいファイル名を列挙して保存しておきます。
- Power Automate for desktopでKeywordListを読み込んで「Excelファイル格納フォルダ」からキーワードリストをファイル名に含むExcelファイルを探して開きます。
フロー完成図
Power Automate for desktopフロー作成手順
Excelファイルを読み込む処理
フローを作成していきます。まずはKeywordListのExcelファイルを読み込む処理を作ります。
▲パラメータを入力します。
- Excelの起動:次のドキュメントを開く
- ドキュメントパス:C:\Users\user\Desktop\KeywordList.xlsx
- インスタンスを表示する:オン
- 読み取り専用として開く:オン
▲パラメータを入力します。
- Excelインスタンス:%ExcelInstance%
- 次と共にワークシートをアクティブ化:インデックス
- ワークシートインデックス:1
このアクションはExcel内に複数のワークシートがある場合に重要です。
▲パラメータを入力します。
- Excelインスタンス:%ExcelInstance%
- 列:A
KeywordListのA列目(1列目)に何個のデータが入っているかを取得するためのアクションです。このアクションで書き込まれている行数がわかります。
▲パラメータを入力します。
- Excelインスタンス:%ExcelInstance%
- 取得:セル範囲の値
- 先頭列:1
- 先頭行:1
- 最終列:1
- 最終行:%FirstFreeRowOnColumn – 1%
%FirstFreeRowOnColumn%は「最初の空の行」であって最終行ではありません。最終行として使用する場合は必ずマイナス1するのを忘れないようにしましょう。
▲パラメータを入力します。
- Excelインスタンス:%ExcelInstance%
- Excelを閉じる前:ドキュメントを保存しない
▲パラメータを入力します。
- データテーブル:%ExcelData%
- 列名またはインデックス:0
「Excelワークシートから読み取り」アクションで取得したExcelDataはDatatable型変数(2次元配列)になっています。このままでは扱いづらいのでA列のみを切り取ってリスト(1次元配列)にします。
フォルダー内のファイルをフィルターしてリストに取得する処理
ここからはExcelから取得したキーワードの一覧をもとにファイルフィルターを開きます。
ファイルフィルターを使って「フォルダー内のファイルを取得」アクションを使うことで特定のファイルだけをピックします。
▲パラメータを入力します。
- 結合するリストを指定:%ColumnAsList%
- リスト項目を区切る区切り記号:カスタム
- カスタム区切り記号:*;
このアクションを実行すると、
- アクション実行前は、[ ‘りんご’ , ‘ばなな’ , ‘いちご’ ]が、
- アクション実行後は、[ ‘りんご*;ばなな*;いちご’ ]になります。
3つ格納されていた文字列を1つの文字列につなぎます。つなぐ理由は「フォルダー内のファイルを取得」アクションのパラメータに渡すためです。リスト型変数をそのままパラメータに渡すことができないので1つの文字列にしています。あわせてキーワードに「*(ワイルドカード)」をつけて取得できるファイル名に含みを持たせています。
- ワイルドカードを付けない場合どのファイルにもマッチしません。「いちご」に完全一致するファイルは存在し得ないからです。なぜなら「いちご」というExcelファイルは実際には「いちご.xlsx」だからマッチしません。
- ワイルドカードを付ける場合、「いちご*」に部分一致する「いちご.xlsx」や「いちご-20220122.xlsx」、「いちごいちごいちご.xlsx」などがマッチします。
セミコロンを使っている理由は下記のファイルフィルターの仕様のとおり複数のファイルフィルターを使用するときはセミコロンを使います。
複数のファイルフィルターを使えるようにするには、選択した項目をセミコロンで区切ります。(例:*.txt ; *.exeなど)。
フォルダー内のファイルを取得アクションのファイルフィルターのヘルプ
▲パラメータを入力します。
- 設定:%fileFilter%
- 宛先:%JoinedText + ‘*’%
先ほど作成した文字列は[‘りんご*;ばなな*;いちご’]でした。ご覧いただくとわかるように「いちご」にだけ「*(ワイルドカード)」がついていません。これでは「いちご.xlsx」にはマッチしますが「いちご2022-01-01.xlsx」とか「いちごいちご.xlsx」にマッチしません。このアクションを使って念のためいちごにもアスタリスクをつけています。
▲パラメータを入力します。
- フォルダー:C:\Users\user\Desktop\Excelファイル格納フォルダ
- ファイルフィルター:%fileFilter%
- サブフォルダーを含める:オフ
これまでのアクションで作成した%fileFilter%をファイルフィルターのパラメータとして渡します。これによってフォルダからキーワードでフィルタしてファイルを取得することができます。
取得したファイルリストをもとにループし、ファイルリストのファイルを1つずつ開く処理
ここまでのアクションでターゲットとするExcelファイルだけのファイル名が格納されたFiles変数を取得できているはずなので、Files変数をループを使って1個ずつ取り出します。
▲パラメータを入力します。
- 反復処理を行う値:%Files%
▲パラメータを入力します。
フロー完成図
実行してみた
▲KeywordListに図の3つのアイテムを入力しました。(「りんご、ばなな、いちご」)
▲フローを実行すると「フォルダー内のファイルを取得」アクションが生成する「Files」変数には、ターゲットとするファイルのみが取得されます(上図)。このFiles変数をもとにFor eachを作っているので狙ったExcelファイルだけが1つずつ開きます。
Robinソースコード
Excel.LaunchExcel.LaunchAndOpen Path: $'''C:\\Users\\user\\Desktop\\KeywordList.xlsx''' Visible: True ReadOnly: True LoadAddInsAndMacros: False Instance=> ExcelInstance Excel.SetActiveWorksheet.ActivateWorksheetByIndex Instance: ExcelInstance Index: 1 Excel.GetFirstFreeRowOnColumn Instance: ExcelInstance Column: $'''A''' FirstFreeRowOnColumn=> FirstFreeRowOnColumn Excel.ReadFromExcel.ReadCells Instance: ExcelInstance StartColumn: 1 StartRow: 1 EndColumn: 1 EndRow: FirstFreeRowOnColumn - 1 ReadAsText: False FirstLineIsHeader: False RangeValue=> ExcelData Excel.CloseExcel.Close Instance: ExcelInstance Variables.RetrieveDataTableColumnIntoList DataTable: ExcelData ColumnNameOrIndex: 0 ColumnAsList=> ColumnAsList Text.JoinText.JoinWithCustomDelimiter List: ColumnAsList CustomDelimiter: $'''*;''' Result=> JoinedText SET fileFilter TO JoinedText + '*' Folder.GetFiles Folder: $'''C:\\Users\\user\\Desktop\\Excelファイル格納フォルダ''' FileFilter: fileFilter IncludeSubfolders: False FailOnAccessDenied: True SortBy1: Folder.SortBy.NoSort SortDescending1: False SortBy2: Folder.SortBy.NoSort SortDescending2: False SortBy3: Folder.SortBy.NoSort SortDescending3: False Files=> Files LOOP FOREACH CurrentItem IN Files Excel.LaunchExcel.LaunchAndOpen Path: CurrentItem Visible: True ReadOnly: True LoadAddInsAndMacros: False Instance=> ExcelMatched # ここにマッチしたExcelファイルに行うアクションを追加してください。 Excel.CloseExcel.Close Instance: ExcelMatched END
▲フローデザイナーにコードをコピペすると、ここで作成したフローを自分のPCで再現できます。
開いたExcelを使って転記する方法は?
以下の記事が参考になるかと思います。
テキストファイルをキーワードリストにする方法は?
今回キーワードリストとしてExcelを使いましたがテキストファイルをキーワードリストとして使用する場合は下記の記事が参考になるかと思います。
まとめ
この記事ではキーワードリストに列挙したキーワードにマッチしたファイルをフォルダから抽出して取得する方法について学習しました。
このブログではRPA・ノーコードツール・VBA/GAS/Pythonを使った業務効率化などについて発信しています。
参考になりましたらブックマーク登録お願いします!
Power Automate学習教材
▲Kindleと紙媒体両方提供されています。デスクトップフロー、クラウドフロー両方の解説がある書籍です。解説の割合としてはデスクトップフロー7割・クラウドフロー3割程度の比率となっています。両者の概要をざっくり理解するのにオススメです。
▲Power Automate for Desktopの基本をしっかり学習するのにオススメです。この本の一番のメリットはデモWebシステム・デモ業務アプリを実際に使ってハンズオン形式で学習できる点です。本と同じシステム・アプリを使って学習できるので、本と自分の環境の違いによる「よく分からないエラー」で無駄に躓いて挫折してしまう可能性が低いです。この点でPower Automate for desktopの一冊目のテキストとしてオススメします。著者は日本屈指のRPAエンジニア集団である『ロボ研』さんです。
▲Power Automate クラウドフローの入門書です。初心者の方には図解も多く一番わかりやすいかと個人的に思っています。
Microsoft 365/ Power Automate / Power Platform / Google Apps Script…
▲Udemyで数少ないPower Automateクラウドフローを主題にした講座です。セール時は90%OFF(1200円~2000円弱)の価格になります。頻繁にセールを実施しているので絶対にセール時に購入してくださいね。満足がいかなければ返金保証制度がありますので安心してご購入いただけます。