エクセルアプリケーションスコープを使用してデータコピーと貼り付けを行なっています。だだ動作が不安定で途中Uipath が動作を停止してしまう時があります。必ず停止するわけではなく何事なく作業が完了する場合もあるのですが、この場合、何が原因で動作が止まるのでしょうか?
行なっていることとしては以下になります。select rangeで範囲をA1:Z1でA-Z行を全指定、その後、send hotkey のctr +cてコピー。それの後、もう一つのエクセルを、開き、select ranbgでaA1:Z1を選択してsend hotkeyのctr +vでデータの貼り付け。
read rangeで読んだ領域をそのまま
Write Rangeでしないのは、書式も併せてコピーしたいって事ですよねぇ…
ネットドライブ中のEXCELへのアクセスは、ネットのトラフィックに依存して不安定になる事もあるようなので、一度ローカルにコピーしてから処理し、処理完了後またコピーして戻すなんて事をしたりしました。
はい。そうなんです。元の書式を一緒にコピーしたいんです。何かいい手立てはないでしょうか?
Read rangeで読んでwrite rangeのほうが処理は安定しますでしょうか?
すみません。最終の動作はselect range でコピーしたい行を全て選択してます。
read range アクティビティに表示形式を含める(だったかな?)のチェックボックスがあって、これはすべてのセル情報を保持してくれる!かと思ったら、表示形式だけでしたねぇ。例えば日付形式の和暦の書式設定をコピーする時には、このチェックボックスが有効なのですが。。。
write rangeは基本DataTable型にて格納された情報を、EXCELのセルに貼り付けて、その情報がどう表示されるかはEXCEL次第になってしまいますね。
ですので、Select RangeでCTRL+C、別のワークブックをアクティブにして、Select Rangeで左上セルを指定してCtrl+Vが正攻法になると思っています。
処理前にすべての対象EXCELを開いてからやる方法です。ご参考に。。。
1)EXCELApplicationScopeでコピー元を開く。その際ワークブック情報を設定しておく(Aとします)。
2)EXCELApplicationScopeでコピー先を開く。やっぱるワークブック情報を設定しておく(Bとします)。
3)EXCELApplicationScopeで既存のワークブックに、先のAを指定して、コピー元を選択。
4)SELECT RANGEをしたのち、CTRL-C
5)EXCELApplicationScopeで既存のワークブックに、先のBを指定して、コピー先を選択(2)で開いているので、素直にコピー先EXCELがアクティブになる)。
6)SELECT RANGEをしたのち、CTRL-V
7)メッセージボックスで”確認!"とかメッセージを出すようにして、一旦停止し、動作を確認する(本運用する時にはコメントアウトしてね)
8)うまくいっていたら、EXCELApplicationScopeで既存のワークブックに、先のAを指定してから、ファイルと閉じる。
9)うまくいっていたら、EXCELApplicationScopeで既存のワークブックに、先のBを指定してから、ファイルを保存して、ファイルと閉じる。
データテーブルに格納してから貼り付ける場合、貼り付け先のエクセルの、セルの書式が適切になっていたら、書式もちゃんとなりますかね?
是非やってみてくださいm(_ _)m
教えていただいた方法で上手くいけました。ただ一つ教えていただきたいのですがread rangeでデータをdatatable に格納する場合、例えば範囲をA:BとすればA-B列に入っている下限まで読み取れますが、write range でA:Bとするとエクセルの限界まで貼り付けようとしてエクセルが止まってしまいます。範囲を指定すればいい話だと思うですがread rangeでデータの行がいくつあるかわからない場合、範囲指定してしまうとwrite range した時にデータが切れてしまう可能性があるのですが、何かいい方法はないでしょうか?
指定を"A:B"にせずに、”A1"とすると、A1セルを基準にして、最終行までだけをDataTableとして読んでくれます。
なるほど、ありがとうこざいます。試してみます
Write rangeでA1にしても書き込むとエクセルが固まってしまいました。。。
Write Rangeで書き込むべきDataTable領域(仮にDTとします)が巨大なのかもしれません?
「一行書き込み」あたりで、DT.Rows.Count.ToString、DT.Columns.count.ToStringなどで、DataTableの状況をみてみましょう。ご自分で考えている量と合っているかどうか。。。
こんにちは。
WriteRangeで指定するセルを"A1"から以下に変更しても動作が固まりますか?
String.Concat(“=A1:OFFSET(A1,”,dt.Rows.Count +1 ,“,”,dt.Columns.count +1,“)”)
一度お試し願います。