Power Automate for Desktop: Excelのテーブルを読み取る
Power Automate for Desktopを使っていると Excel のテーブルにあるデータを取得したくなると思います。その際面倒くさいのが範囲の指定です。
Power Automate for Desktopの「Excelワークシートから読み取る」アクションに「D」や「5」などと直接書き込むのは簡単ですが、変更に対して弱いフローになってしまいます。
データ行数が可変なら即アウトですし、ユーザーが列を追加してもアウトです。
マクロと併用する方法
簡単な方法として、Excelに次のようなマクロを用意しておいて実行し、選択されたセルを読み込むという方法が考えられます。
対象のテーブル名が「テーブル1」であることが前提です。
ThisWorkbook.ActiveSheet.ListObjects("テーブル1").Range.Select
End Sub
マクロの意味は、マクロがあるワークブックの現在表示されているシートの「テーブル1」という名前のテーブルのすべてのセルを選択、です。
フローは次のような感じです。
2ステップ目でマクロを実行した後に、3で「Excelワークシートから読み取る」アクションを実行し、取得対象として「選択範囲の値」を指定しています。
Excel上のテーブルは次の通りです。
実行結果は次の通りです。
この方法は、シンプルですがマクロが必要という大きな難点があります。
アドレスを持つセルを用意する
マクロを使わずにテーブル範囲を取得するには、特定のセルにテーブルの座標を表示しておくという方法が考えられます。
次の例では、A1セルとB1セルにテーブルの左上と右下のアドレスを表示しています。
それぞれ、次のような式を使えば、テーブルの行数が変化しても、列が増えても、テーブル自体が移動したとしても対応できることでしょう。
=CELL("address", テーブル1[[#見出し],[列1]])
=CELL("address", OFFSET(テーブル1[[#見出し],[列1]],ROWS(テーブル1[#すべて]) - 1, COLUMNS(テーブル1[#すべて]) - 1))
フローの全体は次の通りです。
1 はExcelのオブジェクトを取得しているだけです。
2のアクションは次の通りでA1セルからテーブル左上のアドレスを読み取っています。
今回の例だと $A$2 が読み取られています。変数名は uUpperLeftにしてあります。
3 では、$A$2 を $ で分割し、リストにします。リストの名前は uUpperLeftListとしてあります。
同様に4, 5 のステップで右下の座標をリストにします。変数名はそれぞれ、uLowerRight、uLowerRightListです。
あとは、「Excelワークシートから読み取る」アクションにアドレスを指定するだけです。
指定したパラメーターは次の通りです。
先頭列: %uUpperLeftList[1]%先頭行: %uUpperLeftList[2]%
最終列: %uLowerRightList[1]%
最終行: %uLowerRightList[2]%
実行するとExcelDataに次のデータが読み込まれます。
ついでにExcelDataを処理する例も追加してみました。フローは次の通りFor each でExcelDataを読み取り、CurrentItem に代入するループです。
メッセージ表示では %CurrentItem['列2']%のようにテーブルデータの値を参照します。このように列名称で参照できるので、テーブルに列が追加されたとしてもフローは影響をうけません。
実行すると次のように、列2の値を次々表示します。
テーブルのアドレスを示すセルの指定は決め打ちにするしかないと思いますが、テーブルの変化に対応できるので良いのではないかと思います。
よく、空白セルを除いてデータ範囲を取得するサンプルを見ますが、それだとユーザーが余白のセルにメモを書いたり、計算に使ったりすると、即破綻します。計算列等を途中に追加しても同様です。
Excelのデータ処理はテーブルを使うのが基本だと思っています。
Power Automate for Desktopでテーブルや名前付きセルの操作ができる日が来ることを願っています。
ご参考までに。
コメント
コメントを投稿