マイクロソフトのRPA(自動化ツール)である「Power Automate Desktop」を使ってExcelに入力されたデータの最終行を自動的に検出し、リストの最後まで繰り返し処理を行うフローのサンプルです。
これまでにも、WebサイトのデータをExcelに保存するなどのExcelを操作するオートメーションのサンプルをご紹介してますが、今回のように、Excelにリストアップされた複数行のリストに対して繰り返し自動処理を行うようなフローも需要の高い例ではないかと思われます。
ここではPower Automate Desktopの基本的な設定方法や動作の中心となるアクションについて解説していますので、ぜひ参考に自動化にチャレンジしてみてください。
自動化フローの概要
事前に用意されたExcelファイルを使い、そのワークシートの内容を読み取ってメッセージボックスに表示します。
Excelシートの内容を読み取り全行に対しての繰り返し処理を行う例して、ワークシートの内容は何行であってもかまいません。最終行までの行数をフローが自動的に算出して処理を行います。
Excelで入力されている最後の行のアドレス(座標)を探す方法がポイントとなります。
また、Excelの場合、1行目が見出しになっているため2行目から最終行まで処理をしたい、といったようなケースも多いかと思いますが、このような場合の例についても後述の設定のポイントで解説します。
事前準備
ここで紹介している自動化フローを利用するには、マイクロソフトのWindows 10向け無料RPA(プロセス自動化)ツールの「Power Automate Desktop」が必要です。
「Power Automate Desktop」のインストールやChrome向けの拡張機能の導入など、基本的な導入と使い方については以下をご参照ください。
また、「Power Automate Desktop」でExcelデータを取り扱う場合、デスクトップ版のExcelアプリケーションがインストールされている必要があります。
自動化フローの使い方
フローの実行の前に、ひとつExcelファイルを用意しておきます。
このExcelファイルの内容はどのようなものでも構いませんが、今回のフローはこのExcelファイルの先頭にあるシートの内容を最後まで読み取って画面に表示するため、数行程度のデータ量の少ないサンプルを用意することをお勧めします。
例として以下のようなファイルを使用します。
まず、フローを実行するとファイルを開くダイアログが表示されます。
ここで事前に準備したExcelファイルを選択し、[開く] をクリックすると、Excelが自動的に起動し、指定したファイルを開いて内容を読み取ります。
読み取られた内容がメッセージボックスに表示されます。
今回のサンプルフローの動作はこれだけですが、このメッセージボックスの内容を作るアクション部分はExcelデータを1行ごとに取り出して行っていますので、このフローをさまざまなアクションに置き換えることで、Excelのデータ全行を対象とした自動化フローを作ることが可能です。
自動化フロー内容
フロー一覧スクリーンショット
作成したフローのスクリーンショットです。
Robin言語ソースコード
以下は今回のサンプルのRobin言語ソースコードです。
コードをコピーし、Power Automate Desktopの編集画面に張り付けると今回のフローのアクションをそのまま登録することができます。
Display.SelectFile Title: $'''ファイルを開く''' IsTopMost: False CheckIfFileExists: False SelectedFile=> SelectedFile ButtonPressed=> ButtonPressed2
Excel.LaunchAndOpen Path: SelectedFile Visible: True ReadOnly: False LoadAddInsAndMacros: False Instance=> ExcelInstance
Excel.ActivateWorksheetByIndex Instance: ExcelInstance Index: 1
Excel.GetFirstFreeColumnRow Instance: ExcelInstance FirstFreeColumn=> FirstFreeColumn FirstFreeRow=> FirstFreeRow
Excel.ReadCells Instance: ExcelInstance StartColumn: 1 StartRow: 1 EndColumn: FirstFreeColumn - 1 EndRow: FirstFreeRow - 1 ReadAsText: False FirstLineIsHeader: False RangeValue=> ExcelData
Variables.CreateNewList List=> List
LOOP FOREACH CurrentItem IN ExcelData
Variables.AddItemToList Item: $'''%CurrentItem[0]% / %CurrentItem[1]% / %CurrentItem[2]%''' List: List NewList=> List
END
Display.ShowMessage Title: $'''Excelの内容''' Message: List Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed
フロー設定のポイントなど
Excelのワークシートからデータを読み取る
「Power Automate Desktop」Excelのデータを変数やリスト(データテーブル)として取得して処理するには、「Excelワークシートから読み取り」アクションなどを使って行います。
この「Excelワークシートから読み取り」アクションでは、事前に開いたExcelのインスタンスから特定のセルの値や、指定したセル範囲の値を取り出すことができます。
ここで、「セル範囲の値」を取得する際には下記のように「先頭列」「先頭行」から「最終列」「最終行」を指定する必要があります。
これらの値は「1」「2」「3」や「A」「B」「C」のように、Excelスプレッドシートのセル参照や行番号を直接指定することもできますが、データの行数や列数がその時々で異なるようなワークシートの場合に直接値を指定してしまうと、取り出すデータが不足してしまったり、余計な空白データまでを取り出してしまう場合があります。
このような場合は、最終列や最終行の値を直接指定せず、アクションから取得した変数を使って指定します。
Excelの最終行、最終列を算出してデータを取り出す
Excelの最終行、最終列を算出してデータを収録するには以下の3つのアクションを使って行います。
アクティブなExcelワークシートの設定
まずは「アクティブなExcelワークシートの設定」アクションを配置します。これは複数のワークシートを持つExcelファイルを開いた際、誤って別のワークシートを読み取らないためにアクティブ化するシートを固定するためのアクションとして使います。
ここでは今回の例として、1番目のワークシートをアクティブにするため [次とともにワークシートをアクティブ化] の「インデックス」を選択し、[ワークシートインデックス] に「1」を入力しています。これによってExcelファイルの1番目のワークシート(一番左のタブ)のシートが必ずアクティブになります。
Excelワークシートから最初の空の列や行を取得
次に「Excelワークシートから最初の空の列や行を取得」アクションを配置します。
このアクションは、アクティブなワークシートの最初の空の列や行番号を取得するためのアクションでです。このアクションを実行することで、最初の空の列番号と行番号がそれぞれ%FirstFreeColumn%
と%FirstFreeRow%
変数に格納されます。
通常、このアクションはExcelのワークシートに追記するための行、列を取得するために利用されますが、見方を変えるとこの情報は「どこまでデータが入力されているか」として読み取ることもできます。
入力されているExcelデータの最後のセルの座標は、最初の空白行である%FirstFreeRow%
と、最初の空白列である%FirstFreeColumn%
のそれぞれからマイナス1を計算した値となります。
%~%
で囲まれた数値の変数は数値同士で足し算、引き算、割り算、掛け算などの演算を行うことができますので、%FirstFreeRow - 1%
、%FirstFreeColumn - 1%
のようにすることで、ひとつ前のセルの座標などを指定することが可能です。
上記により、入力データの最終行、最終列がわかったので、「Excelワークシートから読み取り」アクションの設定で、[最終列] ボックスに%FirstFreeColumn - 1%
、[最終行] ボックスに %FreeFirstRow - 1%
と入力し [保存] します。
こうすることで、Excelの最終行、最終列までを%ExcelData%
データテーブル変数として取り出し、繰り返し処理に使うことができるようになります。
Excelのデータ行数分処理を繰り返す
前述までに取得したExcelデータを使い、全行に対して繰り返し処理を行うには「For each」アクションを使用します。
「For each」アクションを配置し、[反復処理を行う値] に取得したデータテーブル名(ここでは%ExcelData%
)を入力します。
以上で繰り返し処理は完了です。配置された「For each」と「End」アクションの間に置かれたアクションが全行に対して繰り返し実施されます。
今回の例ではExcelの1行ごとに各列の値を取り出してリストに格納しています。
データテーブルに格納されたExcelデータなどから、列を指定して値を取り出すには角カッコ[ ]
を使います。
%CurrentItem[0]%
、%CurremtItem[1]%
のように、角カッコで列番号を指定することで各セルの内容を取り出すことが可能です。
以上で今回のサンプルの解説は終了です。こちらのフローを参考にぜひいろいろなアイデアを基に自動化にチャレンジしてみてください。
余談:ハードコーディングについて
セル参照や行番号を「1」「2」「3」や「A」「B」「C」のように、変数を使わず直接指定するような方法を「ハードコーディング」と言います。
よくあるハードコーディングの例として、消費税率のように時期や状況によって値が異なる可能性のある情報や、パスワードのように利用者により異なる情報、ファイル名や保存フォルダのように環境により変更される可能性のある情報などを直接指定することなどが挙げられます。
このような情報はアクションにハードコーディングで入力するのではなく、変数などを使うことで更新を一元管理したり、都度入力ダイアログなどを使って情報を取得することで、どのような環境でもフローが動作をするよう考慮されることが好ましいとされています。このように、フローの実行時に外部から情報を取得したり、自動的に生成したりして進行させる方法をソフトコーディングと呼びます。
今回は、ソフトコーディングによるExcelのシートに応じたデータの取り出し方の一例をご紹介しました。(今回のフローにはその他のアクションで一部ハードコーディングに該当する要素が残っています)
「Power Automate Desktop」ではこのようなハードコーディングを意識せずとも簡単に自動化処理を行えることが魅力のソフトウェアではありますが、ハードコーディングは前述のパスワードのように、深刻な情報漏洩につながるような情報をフローの中に紛れ込ませてしまうリスクもあるため、念のため用心が必要です。
お読みくださりありがとうございました。今回の内容が少しでもお役に立てば幸いです。
コメント