番号からExcelの行範囲を特定する方法

固有の各番号から行番号を指定してデータテーブルを処理する方法について

以下のようなエクセルのデータファイルから特定の番号から特定の番号までの間の行を処理したいと思っています(実際は何万行もあります)

しかし、LookUp Rangeアクティビティでは部分一致しか検索できないため、例えば番号「18」の行を特定したいのに「118」の行を見つけてしまうという不具合が起こる可能性があります。
screenshot_2021-04-29

実際の処理としては添付画像のようなデータのうち、特定の番号から特定の番号までの行をdatatableとして取得し、行ごと(商品ごと)に処理をした後に売上と利益のところに「Write Cell」アクティビティを使用してデータを書き込みたいと思っています。
速度向上のためセル書き込みは行ごとの繰り返しが完全に終わった後にExcelを開いて一気にまとめて行います。

また、商品が何万個もあるためできるだけ速く処理できる方法を探しています。
最初の特定行から特定行までテーブルに取り込む方法について今考えています(上記の通り範囲内で検索 (LookUp Range)アクティビティでは部分一致のため正確に行えません)。

未熟で情けないのですがこの点についてご相談にのっていただけないでしょうか。

こんにちは

処理速度を重視するなら、書き込むセルの数にもよりますが、WriteCellではなく、WriteRangeで
一括で書き込んだほうが速いケースが多いかと思います。
またForEachRow等のアクティビティでのループは結構遅いので、LINQやInvoke Codeを使うと
高速になるケースもあります。

あと要件がわかりずらいのですが、番号(列)はユニークではなく重複するデータがあるという
ことでしょうか?例では番号列に「3」が2つあるので、かならず同じ番号が列内に2つあり、
一つの番号を指定するということでしょうか?このあたり具体例を示していただけると
コメントしやすくなると思います。

1 Like

ご助言ありがとうございます。
失礼しました。
番号は重複しません(3が2つあるのは完全にミスです。混乱させてしまい申し訳ないです)。

WriteRange、使用した経験はあるのですが完全に見落としていました。
その場合、現在売上と利益を連想配列要素(キーが番号で値が二次元配列(array(1)です)で取得しているので、売上と利益をdatatableで持つように変更する必要がありますが、WriteRangeの方が一発書き込みなので速いですね

もとの質問点なのですが、特定行を特定する方法はないでしょうか。
今考えているのは「データテーブルを検索」アクティビティで行番号も特定できるのか実際に検証してみようと思っています。

こんにちは

まず対象全体をDataTableと取得して、検索対象のデータがある行番号を探すことになると思います。
その方法の一つとして、「データテーブルを検索」アクティビティを利用する方法も「あり」と思います。

1 Like

ありがとうございます。
最初はいったんdatatableとして取り込んでから、「データテーブルを検索」でいけるのですね。
そちらなら狂いなく指定した番号の行を取り出せそうです。

完全に見落としてましたが、調べたらLINQ、invoke codeとは、C#、.net(関係のUiPathの機能?)のことでしょうか?
私はそれらの言語をほぼ全く経験がないですが、調べながら実装してみるのもありかもしれません
(ただ学習コストを考えると今回は時間的に厳しいかもしれません)

こんにちは

完全に見落としてましたが、調べたらLINQ、invoke codeとは、C#、.net(関係のUiPathの機能?)のことでしょうか?

Invoke Codeはアクティビティ内でVb.net またはC#のコードを記述・実行できるアクティビティです。
LINQは以下参照ください。

これらを使わずとも、アクティビティだけでも仕様通りに実装できると思いますが
パフォーマンスの視点が入ると、状況によっては必要なケースが出てきます。