<Excel>[Excel Application Scope]を入れ子にできますか?

[Excel Application Scope]内で【ExcelファイルA】を編集中に、
2つ目の[Excel Application Scope]を定義して【ExcelファイルB】を
編集したいと考えています。

ひとまず構想をそのまま実装してみたところ、
全ての処理が【ExcelファイルA】内で処理されてしまい、
”ExcelファイルBを開いて編集”が実現できませんでした。

■質問
[Excel Application Scope]を入れ子に出来ないのでしょうか?

基本的には「できない」です。何しろRead Range等は「Excel Application Scopeの内側で、そのExcelを使う」のが前提なので、入れ子にすると「どっちのExcelを参照しているか」がわかりにくくなりますし。

厳密に言うなら、Invoke Workflow Fileで他のWorkflowでの処理とする、あるいはParallelを使うことで擬似的に複数同時に処理することは可能ではありますが、前者は処理が煩雑になりますし、後者は事実上のマルチスレッドプログラミングになるので、非常に注意深く実装する必要が出てしまいます。

UiPathのExcelまわりの(現状の)設計思想で考えると、複数のExcelにまたがって処理したいときは、

  1. 必要なExcelファイルのデータは全て最初に読み取る(DataTableに格納する)
  2. ファイルを跨ぐ転記なども含めて、処理はExcel Application Scopeの外でやる
  3. 処理が終わったデータを纏めて(再びExcel関連アクティビティで)書き出す

という順番になるのかな、と思います。

この方法は利点と欠点があって、
・利点
値を処理・転記しているときにデータ異常など、想定外のエラーで終了しても、元のファイルに中途半端に上書きがされた状態が発生しない

・欠点
人間が直接Excelを処理するのとは違うロジックになることもある、処理中のデータが見れない

でしょうか。
大規模集中的に、あるいは人間が直接監視しているわけではない状態でロボットを動かす場合に、利点がかなり効いてくると思います。

(追記です)
参考までに、2つのExcel Application Scopeを、Parallel Activityで同時に開き、もう片方のExcelから取得した値を用いて追記するサンプルをアップロードしておきます。
この方法だと「反対側の処理がどこまで進んでいるか要所要所で把握する」必要が出てくる上、待機のつけかたを間違うと「双方が反対側の処理が終わるまでの待機になり、どちらも進まなくなる(いわゆるデッドロック)」等のトラブルにもなるので、基本的にはお勧めできません。

ExcelAppScopeTest.zip (14.5 KB)

2 Likes

@Honoka さん
よく分かりました。
解説&サンプル作成頂き、ありがとうございます。
確認させて頂きます。

1 Like