読み込んだDataTableの文言と同じものを探して対象データを抽出したい

こんにちは。UiPath初心者です。
今回実行したい処理は以下の通りです。

① エクセルファイルを選択しDataTableに格納(複数カラムあり)
② ウェブサイトにある表形式のデータのなかでDataTableの3カラムと内容が一致するものを探す
③ 有 ⇒ 同一行の背番号を取得し変数に格納する
無 ⇒ 次へボタンを押下し次ページの表の中で探す(見つかるまで繰り返す)
④ ③で格納した値をExcelの背番号の行に記載する
…DataTableの各行繰り返す

image

現在DataTableへ格納するところまではできているのですが、
ウェブサイト上で複数項目を検出し、同一行・別の列の値を取得するのに苦戦しています。

よろしくお願いいたします。

こんにちは

要件がやや不明確と思います。
3カラムとは特定の3つのカラムでしょうか?あるいは任意のカラムのうち3つが一致すれば一致と見なすのでしょうか?
また複数行がマッチした場合はどのようにするのでしょうか?

上記が入力例を表しているのであれば、期待する出力もあわせて例示いただくと良いかと思います。

洋一さん

ありがとうございます。
特定の3つのカラム(row(“氏名”).ToString、row(“氏名カナ”).ToString、row(“年齢”).ToString)が完全に一致するものの
背番号の値を取得し、Excelに書き出したいです。

上記の添付画像でいうと、DataTableの背番号部分(実際に表記したいのはExcelなので
Excelアプリケーションスコープを使用し、変数に格納したウェブサイトの背番号を転記する想定です)

:point_down:期待する結果(背番号に値が入る)
image

よろしくお願いいたします。

こんにちは

2重ループを回すか、効率化悪そうなら例えば以下の様にDictionaryに入れてからループすると良いかもしれません。

dict = dt2.AsEnumerable.ToDictionary(Function(r) Tuple.Create(r("氏名").ToString,r("氏名カナ").ToString,r("誕生日").ToString),Function(r) r("背番号").ToString)

Sample
Sample20240925-2.zip (11.1 KB)

洋一さん

ありがとうございました。内容を確認させていただきましたm(__)m
添付していただいたものはどちらもExcelファイルを参照しているかと思いますが
今回追加したい機能はウェブサイトから対象のデータを見つけ出し
対象データの『背番号』を取得しExcelに吐き出すというものなので
少し違うかもしれません。こちらの質問の仕方が悪く申し訳ありません。

ウェブサイトにある表から抽出となると、
HTMLとかから判断するのでしょうか…?

実際に使用するサイトの表は載せられないので
同じようなサンプルを作成してみました。
対象データが無ければ『次へ』ボタンを押下し、対象データを検索…
対象データが見つかれば『背番号』を取得し、見つからなければ
『対象データが見つかりません』としたいです。

よろしくお願いいたします。

image

表抽出機能でDataTableに落とし込めば同様の手法が使えますが、他の方法を検討されていますでしょうか?

洋一さん

ありがとうございます。

特に方法にこだわりはございません!
初心者ですので『背番号』の取得ができれば何でもいいと思っております。

表抽出機能でDataTableに落とし込み、DataTable内をループして
対象データを探す…というようなイメージでしょうか?

よろしくお願いいたします。

基本的にはそうです。
状況によっては表抽出の代わりに繰り返し(各UI要素)アクティビティも使えるかもしれません。

初歩的な質問で申し訳ないのですが
表抽出自体どのように行えばいいのかわからず…
試しにカラムを選択したところ、表にあるすべてのカラムが選択されました。
きっとこれで表の抽出が行われDataTableに格納されたということでしょうか?

またExcelのrow(“氏名”).ToString、row(“氏名カナ”).ToString、row(“年齢”).ToStringと
表抽出したカラムの氏名、氏名カナ、年齢と同じもの…という条件の指定の仕方や
ループのやり方がいまいちよくわかりません。

表全体を抽出することもできますし、個別に抽出することもできます。

うまく取れていれば、上記サンプルの範囲読み込みアクティビティの代わりにウイザードで生成された、表抽出でのアクティビティを設置すれば良いかと思います。(デフォルトのDataTableの変数名が異なると思いますので、そこは合わせる必要があります。)

表がうまくて取れていない場合は、カラム名を個別設定等する必要があるかもしれません。

ありがとうございます!

フローチャート内で
-シーケンス-
① 表抽出(表示されているページのみ)
② 対象データがあるかどうかループ

-対象データあり-
③ 対象データと同一行の『背番号』を取得

-対象データなし-
③ 次へボタンを押下
④ 表抽出(表示されているページのみ)
…対象データが見つかるまで繰り返す
⑤ 対象データと同一行の『背番号』を取得
(⑥ 見つからなければ『対象データが見つかりません』)

というように作成しようと思ったのですが
『複数のページ/行が設定されていますが、[次へ]ボタンが設定されていません。』
という警告が表示されてしまいます。
こちらは次へボタンを活用すべきなのでしょうか?

今回のケースですと、一括でDataTable化しても問題なさそうにおもえるのと、次へボタンもあるようなので、使った方が良いように思えます。表抽出wizardで複数ページの確認があったと思いますので、こちらを利用ください。

ありがとうございます。
次へボタンを活用することにいたしました。

この後、繰り返し (データ テーブルの各行)を使用して、DataTableに表抽出で選択したテーブルを設定し、選択したExcelより取得したDataTableの(row(“氏名”).ToString、row(“氏名カナ”).ToString、row(“年齢”).ToString)とイコールのもの。という条件を設定するのだと思うのですが、この場合、条件に設定するカラムはどのようにすればいいのでしょうか?
両方とも同じカラム名のため、区別のつけ方がわかりません。

質問ばかりで申し訳ありませんがよろしくお願いいたします。

こんにちは

どの方法で実装しようとしていますか?Dictionary使う方法の場合は、先のPOSTのサンプル参照してもらえれば良いかと思います。

2重ループで構成しようとしているなら、例えば繰り返し(データテーブルの各行)アクティビティなら、Itemの変数名で区別するようにします。(異なる変数を明示的に指定します)

image

洋一さん、ありがとうございます。

Dictionaryを使用して背番号を取得することにいたしました。

以下の部分について質問なのですが、この処理は
イコール row(“氏名”).ToString、row(“氏名カナ” ”).ToString、row(“年齢”).ToString
と同一行の背番号を取得しrow(“背番号”)に格納しているのですよね。
いつもExcelに何か書き込む際は『Excelアプリケーションスコープ』⇒『セルに書き込み』
としているので、どの値をどこに書き込むか?という指示が必要なのですが
この『範囲に書き込み』だと、どの値を…という設定は必要ないのでしょうか?

今回、選択したエクセルファイルをDataTableに格納する際、
2行目以降をDataTableに格納するようにしています。
DataTableの1行目はカラムになるため、対象データの検索は2行目以降になり
背番号を書き込みたいのも2行目以降となります。(Excelでは+1行)
この場合、書き込み行に指定するのはDataTableの行数で考えるのでしょうか?

image

表全体を書き出しますので、表の書き出し始点を指定すれば、個々のセルのアドレスは考慮する必要はありません。(表の情報がそのまま反映されます)

洋一さん

ありがとうございます。
上記のものを実行したところ
『代入: 同一のキーを含む項目が既に追加されています。』というエラーが発生しました。
image

これはどういうことなのでしょうか?

こんにちは

同じ3項目の組み合わせの行が複数あるためです。
これらの行の背番号はどのようになっていますか?同じであれば重複排除のロジックが必要です。
異なるものであれば、どの背番号を入力すべきかのルールが必要です。

一度ウェブサイトの表を抽出テストしたものをExcelに貼り付け確認しましたが
重複するものはありませんでした。
ただ、一点気になるのがおそらくヘッダー部分でしょうか?
以下のようなものが600行弱あります。

ウェブサイトでの背番号はリンクになっており、クリックすると選手情報が
見られるような仕様になっていますが一度表をDataTableに格納しているため
あまり関係はないですよね?

よろしくお願いいたします。

上記の表ですが、もともと提示いただいた内容とかなり乖離していると思いますが、これが取得したい表でしょうか?(氏名等があるものと思いましたが)
また空白行がありますので、こちらも除去する必要があると思います。