リモートワークで導入して良かったツール詳しく見る

【PAD】読み込んだExcel表を1行ずつループで取り出す方法の解説

じょじお

この記事ではPower Automate for desktopでExcelを読み込んだ時に生成されるDatatable型変数をループで1行ずつ取り出す方法について学習します。

目次

前回のおさらい

前回の記事では、Excelファイルから表領域を読み込み、読み込んだDatatable型変から値を取り出す方法について学習しました。この記事ではループ処理を組み合わせてDatatable型変数を操作する方法について学習します。

使用するテスト用ダミーデータ

使用するダミーデータ

列1社員番号名前性別生年月日電話番号携帯番号メール郵便番号住所
100001田中 戴三1989/3/903-3388-3419070-6029-5912 taizou89@example.com  132-0023東京都江戸川区西一之江4-8-1-8F
200002松野 勝司1977/7/2 090-0866-3992 ntm6048341@goo.ne.jp  604-8341京都府京都市中京区岩上町4-1-3
300003小倉 幸四郎1994/3/2018-536-4457070-5908-3506 k-ogura@goo.ne.jp018-1617秋田県南秋田郡八郎潟町イカリ8-11-6
400004宮下 秋徳1987/6/13078-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ループを使う方法があります。

STEP
「For each」アクションを追加します。
Power Automate for desktop Datatable

▲「ループ」グループの中の「For each」アクションを追加します。

Power Automate for desktop Datatable

▲パラメータを入力します。

  • 反復処理を行う値:%ExcelData%
  • 保存先:CurrentRowに名前を変更しました。(デフォルトの名前はCurrentItem)
STEP
ループ処理が追加されたことを確認します。
Power Automate for desktop Datatable

▲このようにループ処理が追加されました。

Power Automate for desktop Datatable

▲この「For each」と「End」のアクションの間にアクションを追加して1行ずつデータを表示させてみたいと思います。

STEP
ループ処理の間に「メッセージを表示」アクションを追加します。
Power Automate for desktop Datatable

▲「メッセージボックス」グループの中の「メッセージを表示」アクションを追加します。

Power Automate for desktop Datatable

▲パラメータを入力します。

  • 表示するメッセージ:%CurrentRow%
STEP
フローを実行してみます。
Power Automate for desktop Datatable

▲フローを実行すると1行ずつデータがメッセージボックスに表示されます。

じょじお

%CurrentRow%と入力すると行を取り出すことができました。

1行ずつ特定の列だけ取り出す方法

CurrentRow[インデックス][列名]を渡すことで特定の値を取り出すことができます。例えば各行の[名前]列と[メール]列だけ取り出してみます。

STEP
「メッセージを表示」アクションのパラメータを変更します。
Power Automate for desktop Datatable

▲パラメータを下記のように入力しました。

  • 表示するメッセージ:%CurrentRow[‘名前’]%さんのメールアドレスは%CurrentRow[‘メール’]%です。
STEP
フローを実行してみます。
Power Automate for desktop Datatable
Power Automate for desktop Datatable

▲フローを実行すると各行の名前列とメール列だけを使って文章をつくることができました。

For eachを使うとDatatableから1行ずつリスト型変数として取り出せる

Power Automate for desktop Datatable

▲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行ずつ全セル取り出す方法(ループのネスト)

STEP
「For each」アクションを先程追加した「For each」の中に追加します。
Power Automate for desktop Datatable

▲For eachの中にもう一個For eachを追加してネスト(入れ子)にします。

Power Automate for desktop Datatable

▲For eachアクションのパラメータを下記のように入力します。

  • 反復処理を行う値:%CurrentRow%
  • 保存先:CurrentDataと記入します。
STEP
「メッセージを表示」アクションをループの中に移動してパラメータを変更します。
Power Automate for desktop Datatable

▲「メッセージを表示」アクションを2つ目のループの中にドラッグ&ドロップで移動します。

Power Automate for desktop Datatable

▲移動できました。

Power Automate for desktop Datatable

▲「メッセージを表示」アクションのパラメータを下記のように入力します。

  • 表示するメッセージ:%CurrentData%と入力します。
STEP
フローを実行してみます。
Power Automate for desktop Datatable
Power Automate for desktop Datatable
Power Automate for desktop Datatable

▲フローを実行するとデータを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」の社員の名前を照会したいと思います。

STEP
「If」アクションをFor eachの中に追加します。
Power Automate for desktop Datatable

▲先ほど追加した2個目のFor eachは今回不要なので削除します。ループを削除したので「メッセージを表示」アクションにエラーがでていますが一旦無視しましょう。

Power Automate for desktop Datatable

▲「条件」グループの中の「If」アクションを追加します。

Power Automate for desktop Datatable

▲Ifアクションのパラメータを下記のように入力します。

  • 最初のオペランド:%CurrentRow[‘社員番号’]%
  • 演算子:と等しい(=)
  • 2番目のオペランド:00003
STEP
「メッセージを表示」アクションを「If」の中に移動してパラメータを変更します。
Power Automate for desktop Datatable

▲「メッセージを表示」アクションを2つ目のループの中にドラッグ&ドロップで移動します。

▲移動できました。

Power Automate for desktop Datatable

▲「メッセージを表示」アクションのパラメータを下記のように入力します。

  • 表示するメッセージ:社員番号00003の社員は%CurrentRow[‘名前’]%さんです。
STEP
「ループを抜ける」アクションを追加します。
Power Automate for desktop Datatable
STEP
フローを実行してみます。
Power Automate for desktop Datatable

▲フローを実行するとデータを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型変数をループ処理で処理する方法について学習しました。

ぽこがみさま

このブログではPower Automate などのRPAツールやVBA/GAS/Pythonを使った業務効率化ツールの作成などについて発信しています。
参考になりましたらブックマーク登録お願いします!

Power Automate学習教材

Power AutomateをKindleで学びたい方はコチラ

▲Kindleと紙媒体両方提供されています。デスクトップフロー、クラウドフロー両方の解説がある書籍です。解説の割合としてはデスクトップフロー7割・クラウドフロー3割程度の比率となっています。両者の概要をざっくり理解するのにオススメです。

Power Automate for Desktopの基本をしっかり学習するのにオススメです。RPA界隈では有名なRPAエンジニア集団である『ロボ研』さんが監修されている解説書です。テスト用の業務Webシステム/デスクトップ業務アプリを使いながら実践形式で学習できる点が一番のメリットかなぁと思います。

Power Automateを動画で学びたい方はコチラ

▲Udemyで数少ないPower Automateクラウドフローを主題にした講座です。セール時は90%OFF(1200円~2000円弱)の価格になります頻繁にセールを実施しているので絶対にセール時に購入してください。満足がいかなければ返金保証制度がありますので安心してご購入いただけます。

ノンプログラマーでも自動化スキルを身につける。

よかったらシェアしてね!
URLをコピーする
URLをコピーしました!
目次
閉じる