この記事ではPower Automate for desktopでExcelを読み込んだ時に生成されるDatatable型変数をループで1行ずつ取り出す方法について学習します。
前回のおさらい
前回の記事では、Excelファイルから表領域を読み込み、読み込んだDatatable型変から値を取り出す方法について学習しました。この記事ではループ処理を組み合わせてDatatable型変数を操作する方法について学習します。
使用するテスト用ダミーデータ
使用するダミーデータ
列1 | 社員番号 | 名前 | 性別 | 生年月日 | 電話番号 | 携帯番号 | メール | 郵便番号 | 住所 |
1 | 00001 | 田中 戴三 | 男 | 1989/3/9 | 03-3388-3419 | 070-6029-5912 | taizou89@example.com | 132-0023 | 東京都江戸川区西一之江4-8-1-8F |
2 | 00002 | 松野 勝司 | 男 | 1977/7/2 | 090-0866-3992 | ntm6048341@goo.ne.jp | 604-8341 | 京都府京都市中京区岩上町4-1-3 | |
3 | 00003 | 小倉 幸四郎 | 男 | 1994/3/2 | 018-536-4457 | 070-5908-3506 | k-ogura@goo.ne.jp | 018-1617 | 秋田県南秋田郡八郎潟町イカリ8-11-6 |
4 | 00004 | 宮下 秋徳 | 男 | 1987/6/13 | 078-408-7352 | akinorimiyasita@goo.ne.jp | 674-0082 | 兵庫県明石市魚住町中尾8-6-6 |
▲前回と同様の上のダミーデータを使って検証していきます。このままExcelに張り付けると表組みを維持したまま張り付けることができます。テスト用にお使いください。
使用するフロー
前回の記事で作成したExcelをDatatableとして読み込むフローをベースに検証していきます。
Excel.LaunchExcel.LaunchAndOpen Path: $'''C:\\Users\\user\\Desktop\\アドレスリスト.xlsx''' Visible: False ReadOnly: True LoadAddInsAndMacros: False Instance=> ExcelInstance Excel.SetActiveWorksheet.ActivateWorksheetByIndex Instance: ExcelInstance Index: 1 Excel.GetFirstFreeRowOnColumn Instance: ExcelInstance Column: $'''B''' FirstFreeRowOnColumn=> FirstFreeRowOnColumn Excel.ReadFromExcel.ReadCells Instance: ExcelInstance StartColumn: 1 StartRow: 1 EndColumn: $'''J''' EndRow: FirstFreeRowOnColumn - 1 ReadAsText: False FirstLineIsHeader: True RangeValue=> ExcelData Excel.CloseExcel.Close Instance: ExcelInstance
▲フローデザイナーに張り付けてフローを再現することができます。
1行ずつ取り出す方法
Datatableをループ処理するにはFor eachループを使う方法があります。
▲「ループ」グループの中の「For each」アクションを追加します。
▲パラメータを入力します。
- 反復処理を行う値:%ExcelData%
- 保存先:CurrentRowに名前を変更しました。(デフォルトの名前はCurrentItem)
▲このようにループ処理が追加されました。
▲この「For each」と「End」のアクションの間にアクションを追加して1行ずつデータを表示させてみたいと思います。
▲「メッセージボックス」グループの中の「メッセージを表示」アクションを追加します。
▲パラメータを入力します。
- 表示するメッセージ:%CurrentRow%
▲フローを実行すると1行ずつデータがメッセージボックスに表示されます。
%CurrentRow%と入力すると行を取り出すことができました。
1行ずつ特定の列だけ取り出す方法
CurrentRowに[インデックス]か[列名]を渡すことで特定の値を取り出すことができます。例えば各行の[名前]列と[メール]列だけ取り出してみます。
▲パラメータを下記のように入力しました。
- 表示するメッセージ:%CurrentRow[‘名前’]%さんのメールアドレスは%CurrentRow[‘メール’]%です。
▲フローを実行すると各行の名前列とメール列だけを使って文章をつくることができました。
For eachを使うとDatatableから1行ずつリスト型変数として取り出せる
▲For eachを使うとDatatableから1行ずつリスト型変数として取り出すことができます。リスト型の変数は[インデックス]や[‘列名’]と指定することで値を1個ずつ取り出すことができます。
フローが実際に動いている動画
Robinソースコード
Excel.LaunchExcel.LaunchAndOpen Path: $'''C:\\Users\\user\\Desktop\\アドレスリスト.xlsx''' Visible: False ReadOnly: True LoadAddInsAndMacros: False Instance=> ExcelInstance Excel.SetActiveWorksheet.ActivateWorksheetByIndex Instance: ExcelInstance Index: 1 Excel.GetFirstFreeRowOnColumn Instance: ExcelInstance Column: $'''B''' FirstFreeRowOnColumn=> FirstFreeRowOnColumn Excel.ReadFromExcel.ReadCells Instance: ExcelInstance StartColumn: 1 StartRow: 1 EndColumn: $'''J''' EndRow: FirstFreeRowOnColumn - 1 ReadAsText: False FirstLineIsHeader: True RangeValue=> ExcelData Excel.CloseExcel.Close Instance: ExcelInstance LOOP FOREACH CurrentRow IN ExcelData Display.ShowMessageDialog.ShowMessage Message: $'''%CurrentRow['名前']%さんのメールアドレスは%CurrentRow['メール']%です。''' Icon: Display.Icon.Information Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed END
1行ずつ全セル取り出す方法(ループのネスト)
▲For eachの中にもう一個For eachを追加してネスト(入れ子)にします。
▲For eachアクションのパラメータを下記のように入力します。
- 反復処理を行う値:%CurrentRow%
- 保存先:CurrentDataと記入します。
▲「メッセージを表示」アクションを2つ目のループの中にドラッグ&ドロップで移動します。
▲移動できました。
▲「メッセージを表示」アクションのパラメータを下記のように入力します。
- 表示するメッセージ:%CurrentData%と入力します。
▲フローを実行するとデータを1個ずつ取り出すことができます。
Robinソースコード
Excel.LaunchExcel.LaunchAndOpen Path: $'''C:\\Users\\user\\Desktop\\アドレスリスト.xlsx''' Visible: False ReadOnly: True LoadAddInsAndMacros: False Instance=> ExcelInstance Excel.SetActiveWorksheet.ActivateWorksheetByIndex Instance: ExcelInstance Index: 1 Excel.GetFirstFreeRowOnColumn Instance: ExcelInstance Column: $'''B''' FirstFreeRowOnColumn=> FirstFreeRowOnColumn Excel.ReadFromExcel.ReadCells Instance: ExcelInstance StartColumn: 1 StartRow: 1 EndColumn: $'''J''' EndRow: FirstFreeRowOnColumn - 1 ReadAsText: False FirstLineIsHeader: True RangeValue=> ExcelData Excel.CloseExcel.Close Instance: ExcelInstance LOOP FOREACH CurrentRow IN ExcelData LOOP FOREACH CurrentData IN CurrentRow Display.ShowMessageDialog.ShowMessage Message: CurrentData Icon: Display.Icon.Information Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed END END
特定の行だけを取り出す方法
とある製品番号を基に、商品マスタから該当の製品のレコード(行)を照会するというケースを想定したいと思います。条件分岐を使って「製品番号列が〇〇だったら」というように処理を作成します。
今回はダミーデータを使って社員番号が「00003」の社員の名前を照会したいと思います。
▲先ほど追加した2個目のFor eachは今回不要なので削除します。ループを削除したので「メッセージを表示」アクションにエラーがでていますが一旦無視しましょう。
▲「条件」グループの中の「If」アクションを追加します。
▲Ifアクションのパラメータを下記のように入力します。
- 最初のオペランド:%CurrentRow[‘社員番号’]%
- 演算子:と等しい(=)
- 2番目のオペランド:00003
▲「メッセージを表示」アクションを2つ目のループの中にドラッグ&ドロップで移動します。
▲移動できました。
▲「メッセージを表示」アクションのパラメータを下記のように入力します。
- 表示するメッセージ:社員番号00003の社員は%CurrentRow[‘名前’]%さんです。
▲フローを実行するとデータを1個ずつ取り出すことができます。
Robinソースコード
Excel.LaunchExcel.LaunchAndOpen Path: $'''C:\\Users\\user\\Desktop\\アドレスリスト.xlsx''' Visible: False ReadOnly: True LoadAddInsAndMacros: False Instance=> ExcelInstance Excel.SetActiveWorksheet.ActivateWorksheetByIndex Instance: ExcelInstance Index: 1 Excel.GetFirstFreeRowOnColumn Instance: ExcelInstance Column: $'''B''' FirstFreeRowOnColumn=> FirstFreeRowOnColumn Excel.ReadFromExcel.ReadCells Instance: ExcelInstance StartColumn: 1 StartRow: 1 EndColumn: $'''J''' EndRow: FirstFreeRowOnColumn - 1 ReadAsText: False FirstLineIsHeader: True RangeValue=> ExcelData Excel.CloseExcel.Close Instance: ExcelInstance LOOP FOREACH CurrentRow IN ExcelData IF CurrentRow['社員番号'] = $'''00003''' THEN Display.ShowMessageDialog.ShowMessage Message: $'''社員番号00003の社員は%CurrentRow['名前']%さんです。''' Icon: Display.Icon.Information Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed EXIT LOOP END END
Datatableを扱ったその他の記事
まとめ
以上、この記事ではDatatable型変数をループ処理で処理する方法について学習しました。
このブログでは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円弱)の価格になります。頻繁にセールを実施しているので絶対にセール時に購入してくださいね。満足がいかなければ返金保証制度がありますので安心してご購入いただけます。