各行の繰り返しで突合させたい

A.xlsxとB.xlsxというファイルがあるとして、
Aファイルでread sellの繰り返しと、Bファイルでread sellの繰り返しをすることでそれぞれで取得した値同士を突合させる場合、どのようにしたら良いのでしょうか。

(並列繰り返しアクティビティというのがあったのですが、これはrowではなくitemですよね・・)

※そもそも、並列繰り返しは非同期なので今回の目的とは一致しませんでした(;^_

1 Like

AファイルやBファイルの値が変わることもあるので、ファイルの値を取得して、取得した値同士を比較させるという方法をとりたいです。

RPA化対象業務においてこのようなことはよくありそうな気がするのですが、皆さんどうやっているのでしょう・・・ :thinking:

もう少し具体的な例を出して、やりたいことを記載したほうが回答がつくかと思います。
※例えば、AファイルのレイアウトやBファイルのレイアウト、結果としてほしいデータの形等

値を比較して単純に結合する場合は、datatableを結合アクティビティがよいかと。

また、条件等が複雑な場合は、繰り返し(各行)を使用したり、繰り返し(前判定)を使用して、1行ずつ比較したりします。

ご参考まで。

そうですよね。

例えば
A.xlsxのA1:Z1に数値のデータが入っているとします。
B.xlsxのA1:Z1にAファイルと同じように数値のデータが入っているとします。

このとき、AファイルのA1とBファイルのA1を比較し、合っていたら+1ポイント、間違っていたら+0ポイントとし、これをデータがある分繰り返し最終的に別ファイルに集計すると。いうような作業です。

結合ではなくただの整合性チェックであることと、データ量が多いのでループを使用したいと思っています。

このループの時、AファイルのループとBファイルのループを同時にしないといけないと思いますが、Aファイルのループの中にBファイルのループを入れると、Bファイルのループが終了してからしかAファイルのループが次のデータに行かないと思います。
このような、ループが入れ子になっている作業をどのようにやるのか、、という疑問です。

言葉で説明するのが少し難しいので、サンプルを作成しました。

Main.xaml (11.9 キロバイト)

以下が前提条件です。
・文章から行数、列数は同じと読み取りました。
・ポイントの集計方法が分からなかったため、単純に合計にしました。

ループが入れ子になっているといっても、仕様(やりたいこと)によっても実現方法は様々となりますので、一例まで。

1 Like

ありがとうございます。
参考にさせていただきました。.itemArrayというプロパティがあるのですね。
やりたいことが実現できそうです。

ご教示いただいた方法で実行してみたところ、各行の値を取得する際順番がところどころ前後してしまいます。(Add to collectionなどで追加していった場合にも順番がおかしかったです。)

例えば、元のExcelファイルではA1:D1に1,2,3,4とそれぞれ入っていたとしても、
取得する際に1,2,4,3 とか、2,1,3,4のような順番になってしまいます。

このようなご経験はありますでしょうか。
また解決方法をご存じでしたらご教示いただけないでしょうか。

すいません。コレクションの繰り返しでは、順番が不定になってしまうことがあるのを失念していました。

素直にカウンタ変数を使って

カウンタ用の変数を宣言して
rowNo = 0

繰り返し(前判定)で
rowNo < dtA.Rows.count

としてその中で、
{ここから
colNo = 0

繰り返し(前判定)で
colNo < dtA.Columns.count

としてその中で

dtA.Rows(rowNo)(colNo).tostring = dtB.Rows(rowNo)(colNo).tostring

いろいろな処理の後に

colNo = colno + 1
}ここまで

rowNo = rowNo + 1

みたいにすればいけると思います。

フリーハンドで書いているので、通るかどうかは分かりませんが。。。

1 Like

ありがとうございます。
その方法で順番の問題は解決されました。

ただ、今度は「位置に行がありません」とのエラーが出ていて、これはdtBに当たるファイルに3行目以降データがないからだと思うのですが、「rowNo < dtA.Rows.count」この記載がdtBにも必要ということでしょうか?

かならずAの方が行数が多い場合で、列数は同じ場合は、おっしゃるように、dtA.Rows.countのところにdtB.Rows.countを入れればよいと思います。
※dtB用のループを追加するということではありません。

※どちらが多いかわからない場合は条件分岐で大小比較し、小さいほうにあわせる。
※列の方も違う場合があるなら同様にいけると思います。

※そもそも行、列の比較は同位置でよかったのでしょうか?キーとなる項目があってその項目の比較ではないのでしょうか?

Aファイルは比較の元となるデータが入っているため1行ですが、Bファイルの方はAと比較する対象が最低1行~複数行あるというものです。
列数は同じです。そのため、

かならずAの方が行数が多い場合で、列数は同じ場合は、おっしゃるように、dtA.Rows.countのところにdtB.Rows.countを入れればよいと思います。

⇒回答いただいた内容を逆にすれば良いということでしょうか?

比較するスタート位置は、Bの方がずれているため、AをBに合わせました。
ですので、具体的にはBファイルのC2:Z2とAファイルのC2:Z2、BファイルのC3:Z3とAファイルのC2:Z2というような比較の仕方になります。

すいません。よくわからないです。m_ _m

具体的な例を出してはもらえないでしょうか。

@kyd_has
Aファイルと言っているのがsampleAにあたります。
sampleA.xlsx (8.5 KB) sampleB.xlsx (8.7 KB)

また、先ほど確認した際、順番の問題は解決されていたのですが今見てみるとまた順番が不定となっていました。
Aファイル、Bファイルともにです。

Sample2.xaml (18.0 キロバイト)
※合計数がおかしいのを修正。情報を細かく出すように変更。
順番はあっていると思うのですが。。。

これでどうでしょうか。

不定となる理由が分かりませんが。。
Aファイルには1行固定の前提です。

@kyd_has さん
ありがとうございます。

そちらで やりたいことの流れは合っているのですが、やはり順番が入れ替わってしまいます。
整合性チェックなので入れ替わってエラーとなってしまうくらいならやらないほうが良くなってしまうので、こちらの問題は別スレッドを立てさせていただこうと思います。

本当に助かりました。
ありがとうございます。

お力になれず申し訳ありません。

>こちらの問題は別スレッドを立てさせていただこうと思います。

そうですね。さくっと解決して下さる方が現れるでしょう!

1 Like

@kyd_has さん

とんでもございません。
大変助かりました!
ありがとうございます。

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