Excelのループ処理で該当のセル位置を取得する方法

度々すみません。

ある列をループ処理にかけ条件式でtrueになった時に、そのtrueになったデータが入っているセル位置を取得する方法を教えていただけませんでしょうか。
(検索しても出てこなかったため・・)

@1117 さん

UiPathの、Excelを使用する場合の一般的な best practiceは、いったんRead RangeでDataTableに格納した上で処理を行い、完了したらWrite Rangeで書き戻すことです。
DataTable型の変数そのものは、Excelのデータとは切り離されているため、事実上「セルの位置」という概念はありません。

しいて言えば何行目・何列目にあたるデータなのかを取得して、そこからExcel側の位置を割り出すぐらいしかないと思います。
が、利用方法によっては別の対策も考えられるので、まずは「セル位置を取得したい」理由の部分について、要件を洗い出してみてください。

1 Like

@tkgsn146
なるほどですね。
セル位置を取得したい理由については、例えばA列のn行目で条件と一致した場合にB列やC列~のn行目の値を取得したいためです。

@1117 さん

その場合、Excelの表データをDataTable形式で取得(Read Range)して、For Each Rowで各行を読み取り、その行のA列(row(0) の値)が処理対象だったら B列以降を処理する、といったロジックで良いと思います。

1 Like

@tkgsn146
B列以降を処理する時の行番号はどのように指定したら良いのでしょう?

row(列の列名) とするのみで良いです。
row が、“For Each Row” アクティビティで読み取った「現在の行」(=A列の値が処理対象である行)を指しているので、あとは列の情報を追加するだけでよいのです。

1 Like

@cheez_RPA
ありがとうございます。
row(A列名).tostringで1行ずつデータを探索し、trueだった場合B列の値を取得したいのですが、
条件式のtrueの時のthenにセルの値を取得でB列を指定すれば良いのでしょうか?

はい、その手順でOKだと思います。ぜひ一度、実装して試してみてください!

@cheez_RPA
trueだったときのthenの処理で「セルを読み込み」アクティビティの範囲に「row(“B列名”).tostring」を指定したのですが、「範囲が存在しません」とエラーになってしまいました。

  • データテーブルの読込範囲はあってますか?
  • データテーブルにヘッダーはついていますか?
    • ついていれば、列名は正しいですか?
    • ついていなければ、列名の代わりにインデックス(0から起算する数値)を指定して動作しますか?

@cheez_RPA
「代入」アクティビティでできました!
セルを読み込みでも代入アクティビティでも結局やりたいことは同じだったのでこれで大丈夫でした。
しかし、本来はセルを読み込みでもできるものなのでしょうか・・調査が必要です。

@1117 さん

セルの読み込みも「できる/できない」で言えばできます。

ただ、Excelは本質的には「表処理ソフト」なので、UiPathでは、表であれば、表形式のデータとして読み取る(Read Rangeアクティビティで、DataTable型で読む)ことを推奨しています。
そのほうが、ほとんどの場合、ワークフローを簡潔に作れますし、速度も速いからです。
(セル位置を指定して、1つずつ読む・書く処理を行うと、UiPathとExcelの通信が複数回発生するため、処理速度と安定性の両方で劣ります)

セル単体の読み込みは、表の部分とは別に、たとえば作成者や、表のデータの対象年度など、「その表に1つだけしかない項目を読む」場合に使うことが多いですね。

1 Like

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.