アクティビティ「範囲内で検索」での完全一致検索について

エクエルファイル中から完全一致する文字のセル位置を取得出来る方法をお教えいただけますでしょうか?

@yuki3

Welcome back to our UiPath community.

Use LookUp Range activity to get matching cell number.

Thank you very much.

How can I get an exact match cell number using the activity “Look Up Range”?

@yuki3

LookUp Range activity needs 3 input parameters as Range, Sheet name, value.

Range - Excel data range. Eg: “A1-D10”
Sheet Name - “Excel Sheetname” Eg: “Sheet1”
Value - “Search string”

The above attached link contains example workflow also. Please look into it.

If there are multiple character strings containing the search value within the range, how should I specify them?

For example, if you want to get the cell number with “test”, but the character string “test 2” is entered in the excel file, etc.

こんにちは

範囲内で検索等のlookup系のアクティビティは完全一致ではなく部分一致検索になるかと思います。
そのため完全一致検索をしたいのであれば自力でロジックを組む必要があるように思えます。

パフォーマンスの観点から、Invoke Code内での実装や、LINQでの実装が良いかもしれません。

LINQの場合ですと、対象範囲をDataTableとして読み込み(dtとします)、検索対象文字列をstrTargetとすると

result = dt.AsEnumerable.SelectMany(Function(r,i) dt.Columns.Cast(Of DataColumn).Select(Function(c,j) if(dt(i)(j).ToString = strTarget,UiPath.Excel.Helpers.ExcelUtilities.ConvertColumnIndexToColumnLetter(j+1)+(i+2).ToString,"" ))).Where(Function(s) not String.IsNullOrEmpty(s)).ToArray()

のように書けると思います。(result はString配列)
なお上記はA1にヘッダ付きの表がある場合なので、
他の場所の場合は途中の+1 や +2といったオフセット量を
調整する必要があります。

ありがとうございます!

ちなみに、範囲内で検索以外の方法で、変動するセル位置を取得する方法はございますでしょうか?

こんにちは

上記の式はこれに該当しますが、これ以外という事でしょうか?

失礼いたしました。範囲内で検索での方法と勘違いしておりました。
知識が不足で申し訳ないのですが、お教えいただたLINQの実装は、どのようにすれば良いでしょうか?(何のアクティビティを使用すればよろしいでしょうか?)

こんにちは

上記の式は、代入アクティビティでそれぞれ左辺、右辺として入力してみてください。

その前にdtとstrTargetの各変数を設定する必要がありますので、
dtについては範囲読み込み、strTargetは代入アクティビティで設定ください。

なお表の位置によってオフセット量の調整が必要になります。(式中の+1や+2の部分)

ご丁寧にお教えいただきありがとうございます!!
やってみます!

はじめまして。突然会話に割って入ってしまい申し訳ございません。
本件の投稿者様と同じ悩みを抱えておりまして、
投稿者様はLINQで解決したようなのですが、
当方LINQの使い方?がイマイチ理解できず、質問させていただいている次第です。

以下のように代入アクティビティを使用してみたのですが、
上手く機能せず、どのように左辺、右辺を設定したらよいか教えていただけますと幸いです。
何卒よろしくお願いいたします。

こんにちは

上記はどのような式を入力して、どのようなエラーが出ていますでしょうか?

ご返信いただきありがとうございます!

ヨイチさんが前述した式をそのまま左辺と右辺にいれた形です。
左辺:result
右辺:dt.AsEnumerable.SelectMany(Function(r,i) dt.Columns.Cast(Of DataColumn).Select(Function(c,j) if(dt(i)(j).ToString = strTarget,UiPath.Excel.Helpers.ExcelUtilities.ConvertColumnIndexToColumnLetter(j+1)+(i+2).ToString,“” ))).Where(Function(s) not String.IsNullOrEmpty(s)).ToArray()

エラーは、以下画像を参照くださいませ。
見えにくい場合は、文章に起こしますので、教えていただけますと幸いです。
image

ちなみに、実現したいこととしては、
エクセルの価格列から、指定した価格のセルの位置を得ることです。
例えば、指定した価格が12であれば、C8を得たいです。

ヨイチさんもおっしゃっているように、範囲内検索のアクティビティでは、
部分一致になってしまい、1200が先に一致し、C4を得てしまいます。

こんにちは

手元の環境では同様のエラーが再現できません。

変数の型を誤っていないでしょうか?

1 Like

画像添付ありがとうございます!
確認したところ、結果の変数の型が普通のstring型になっておりました。

本件解決しました。本当にありがとうございます!!!

ただ、追加の質問で恐縮ですが、以下2点お答えいただけると幸いです。
①今回、型をArray of[T]にして解決したのは、返される値が配列に格納されているからでしょうか
②以下画像のようにA列のNoに、価格より先に指定した値(例えば12)が入っていた場合、
結果は、A2セルを返してしまいます。本来、C8セルを返してほしいのに・・・
C列のみ一致検索するには、どのようにしたらよいでしょうか。

そうです。

②以下画像のようにA列のNoに、価格より先に指定した値(例えば12)が入っていた場合、
結果は、A2セルを返してしまいます。本来、C8セルを返してほしいのに・・・

C8も戻り値に含まれているはずです。

そもそもですが一列しか検索する必要がないのであれば、この式を使う必要はありません。
書き直した方がよいように思えますが、この式を修正するのであれば

j=3

としておいて

dt.AsEnumerable.Select(Function(r,i) if(dt(i)(j).ToString = strTarget,UiPath.Excel.Helpers.ExcelUtilities.ConvertColumnIndexToColumnLetter(j+1)+(i+2).ToString,"" )).Where(Function(s) not String.IsNullOrEmpty(s)).ToArray()

のようになると思います。

1 Like

まさに知りたかったことを知れました(一列のみ検索する方法)!
ありがとうございます!

j=3だとエラーが出ましたが、j=2にすると、
正しい結果が出力されました。本当にありがとうございました!