複数のエクセルから一つのエクセルへ書き込む方法

studio

#1

ある一定のエクセルファイルAからセルを読み込み、システムから出力されたファイルが10個あるとします。ここでは、excel application scope→read rangeでdataとして読み込み、For each rowの中で、recording機能を使用し、システムよりエクセルB出力・先ほど読み込んだエクセルファイルAの商品名をrow(“商品名”).ToStringと名前を付けて保存までは完成しております。

この出力したエクセルファイルB10個(名前はそれぞれ異なる)の特定のセル”B22”を抜き出し、
元のエクセルファイルAの空欄に書き込む操作をしたいと考えております。
繰り返し、名前の異なるファイルを読み込み一つのファイルの特定の列に追加していくようなアクティビティがありましたら、ご教授下さい。
また、For each等の中に、ファイル名として設定したrow(“商品名”).ToStringとできるのか教えてください。


上記も参考になりそうですが…システムから出力した名前の違うエクセルファイルの特定のセルを取得できたらいちいち印刷しなくて済むと考えております。何か方法がございましたら教えて下さい。


#2

書き出す側のセルの位置を特定しないと難しい気がします。

たとえば「B列のn行目に書き出す」なら、“B” + n.ToString().Trim() でセル名は得られるので、Write Cellで行けると思いますが。

商品名とファイル名に明確な関連がある(たとえば「商品名.xlsx」になっている、等)であればそのまま使えると思いますが、そうでなければ、個々の商品の値をとってくるときに、一緒にファイル名を記録しておく(DataTableに入れるか、Dictionaryあたりを使う?)とかになると思います。


#3

@Honoka
エクセルをdata table型に入れて、For each rowの中、システムで帳票を出力、商品名.xlsにして保存。その後、保存したファイルの特定のセルを別シートに繰り返し転記することを目指しています。ただ、以下のように、実行しますと、シートがありません。と表示されます。
※Read Cell : The sheet does not exist
Excel%20application%20scope
シート名が1や2等の数字になっていますが、単体で実行するとうまくいくので、ファイルの指定方法に問題があるのではないかと考えております。C¥Documents¥row(“商品名”).ToString等とやるべきでしょうか。

ご教授いただければ幸いです。


#4

10個あるファイルのファイル名はどのようにして取得していますでしょうか?
元画像を見るかぎりの想像ですが、ファイル名を含むデータテーブルがあって、
そのデータテーブル中に"商品名"というカラムがあって、そのカラムの中身が物理ファイル名になっている、
そんな感じの理解をしました。

となると、という想定の話で、簡単にフローを作ってみましたが、@361oosugi さまとイメージが違いましたら追加で情報をください。


#5

@yukino

大変助かります。添付していただいた画像を吟味の上、もう一度トライしてみます。


#6

@yukino
実行してみましたが、やはりsheetがありませんと表示されます。
原因は、以下のように、新しくrow(“商品名”). xlsというワークシートが作られてしまうようです。
なので、空のエクセルでシート名もデフォルトでSheet1となっているため、上記のようなエラーとなるみたいです


方法としては、2つありますが、帳票から出力されるものをワークシートに直せるか試す方法と、
uipath上で、97-2003を対象とできるのか。
そもそもexcel application scopeは、新たに作ったエクセルは対象としないのか。
その点教えていただけますと幸いです。


#7

2点ご質問頂いてますが、確認ポイントが少し違います。

まず、Row(“商品名”).xls というExcelファイルが新たに生成される原因ですが、
[Excel Application Scope]の [WorkbookPath]欄に "Row(商品名)” と解釈される文字列が設定しているからです。
これは、Excel Application Scope の、[Create New File]オプションが on になっていて、
読み込みたい処理対象とするファイル名が正しく指定できていない場合に発生します。この場合、指定された(誤った名前で)新たにファイルが作られます。

ということは、[Excel Application Scope]に指定しているWorkbookPathの内容が想定通りでないのですが、
そこに正しくファイル名を設定できていますか、という点を確認する必要があります。

新たに作成されるファイル名が、”Row(”商品名”).xls" ということなので、おそらくは データテーブルの Row(“商品名”)というカラムに読み込みたいファイル名が入っているのですよね。

なので、Row("商品名”)の中身が正しく渡せているか、の観点でフローを再確認してみてください。
・私が作成したワークフローは[For Each] ではなく [For Each Row]です。
・当然、右側の箱の中身も違います(データテーブルを設定しています)。


#8

原因が分かった気がします。For each rowで繰り返しとなるdt1には、商品名だけでなく、価格、購入時期が含まれておりました。このdt1からまずは商品名だけを抜き出せればいいかもしれません。

初歩的な質問になってしまいますが、エクセルから商品名の列だけに抜き出して、datataleに置く方法は、例えば、c列でしたら、“C”(大文字)と設定するのが正しいのでしょうか。


#9

これは UiPath と言うよりは Excel の考え方になりますが、
C列全部、という意味合いであれば、 “C:C” って書くことが多いようです。

To_361oosugi_san

個人的には、元データを取る時点で商品名だけのdt1にするのではなく、元データはデータ全部取っておいて、使う時点で必要なカラムのデータを使う方が、後々の活用とかでメリットありそうに思ってます。
[For Each Row] ([For Each] ではないですよ!) の繰り返しの中でRow(カラム名).ToString 一発で取得できますし、コーディング的にもパターン化できると思いますので。


#10

@yukino

パッと見、ファイル名は同じですが、やはり先ほど貼りましたように、新たなワークシートが張り付いてしまいます。拡張子が問題になっていることはないとのことですが、ほかに考えられる要因は何かありますでしょうか?
読み込む10件のエクセルファイルは、record機能・type操作で、名前を付けて保存という形で行っております。row(”商品名").ToStringと文字列に変換しています。
また、excel application scopeでは、ファイルの場所は特段明記せず、row(“商品名”).ToStringと設定しております。

追記
単純にシステムで出力した97-03のエクセルファイルから新規のシートは転記ができるので、確実に、ファイル名の指定やシート名のところで何か設定が必要となってくるものと思われます。もしよければ、サンプルワークフローをいただければ幸いです。

もしかしたら、名前をつけて保存する際に入力したファイル名ともともとdatatableに格納された個々の商品名とは異なるかもしれません。


#11

まずは以下を対応してみてもらえますか?お悩みの点が見えてきた気がします。

  1. 中身を更新しない、読むだけのExcelシートに対する [Excel Application Scope]は、プロパティの[Create New File]オプションをオフにしてください。読み込むファイルが存在しなければこの時点でワークフローがエラー停止するのでデバックが多少楽になります。

  2. Excel Applicaion Scopeの直前で、[Write Line]アクティビティを使って,Row(“商品名”).ToStringした結果を目視確認してください。出力された文字のファイルが存在するかどうかを確認してください。ここで言うファイル名は、フルパス・拡張子まで含めたすべてです。(例:c:\Users\yukino\Desktop\商品1.xlsx)

何となくですが、実際のファイルは、[c:\Users\yukino\Desktop\商品1.xls] でできていて、
Row(“商品名”).ToStringした結果は [商品1]になっているような気がしてきました。

で、[Excel Application Scope(Row(“商品名”).ToString) した際に、実際のファイルを開く事ができず、
でも、[Create New File]がチェックされているため空のファイルが新規作成されてしまい、
当然新規作成されたファイルのシート名は[“1”][“2”]ではなく、[Sheet1]なので、
別トピックを起こして質問している「シート名の指定ができなくてデータが読めない」
になっている気がしてきました。

もし上記が当たっているのであれば、
Excel Application Scope に、“C:\Users\yukino” & Row(“商品名”).ToString & “.xlsx” のようにフルパスのファイル名を作り上げる文字列を構成して上げると解決しそうです。


#12

ありがとうございます。
その前に、excel application scopeの公式ガイドを見ますと、確かに「Create New File」となっておりますが、私が使っておりますuipathでは見当たりません。どういった原因が考えられますでしょうか?
%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3


#13

Package ManagerでExcel Activitiesが最新になっているか確認してみてください。
Updateボタンが出るようならバージョンが古くなっているのが原因の可能性があります。


#14

@Honoka

Manage Packageで更新を確認しましたが、No Package foundとなっております。
一回アンインストールしてもう一度やってみるべきでしょうか?

Versionは、2.0.6526.16321となっております。


#15

先ほど、@yukino 様 に教えて頂いた通りに変えて実行してみました。
新しくエクセルは作成はされなくなりました。ただ、やはりシートがありませんと表示されます。
“[k(alt)]HOR” + “設定する名称[k(enter)]”でシート名をSheet2にしても
おそらく、excel application scopeの問題ではないかと推測ですが、考えております。
もしくは、帳票を印刷するFor each row の中で、excel application scopeを行うのではなく、別途商品名だけのデータテーブルを作成の上、それをFor each rowで行うのがいいのでしょうか?

お分かりになる方がいらっしゃいましたら、教えて頂けますと幸いです。


#16

何らかの理由でNuGetに繋がっていない、とかでしょうか。認証プロキシとか通してませんか?

Create Newは

UiPath.Excel.Activities v2.3.6660.23035

以降の機能です。


#17

うーむ。進みませんねー。
エラーメッセージが「シートがない」なので、シートが見つからないとUiPathが判断しているのは間違いないのですよ。。。まずは、ファイルがない・シートがない・名前の設定が正しく見えるけど実は違う、という、見落とし系のエラーを疑うことになります。

#個人的な感覚ですが。。。
Excel Application Scope とその中で使用する Read/Write Cell またはRange などのアクティビティって、過去の経験上では結構安定して動いている印象がありまして、、、あまり変な動作はしないのですよね。きちんと指定された名前やデータを渡してやればそのとおりに動くというか(変な言い方ですが)。

現状のワークフローの画像もしくはxamlを見せていただくことはできますか?少しコメントを入れた上で見せていただけると、もう少し突っ込んだ話ができるかもしれません。
現状は私の方は目隠し将棋状態なので、誤った指摘をしている可能性すらありえます。


#18

@yukino

前提条件:もともと商品番号・商品番号2・商品名が入ったエクセルデータをtransactionsという変数に格納しており、For each rowの中で、システムからエクセルを出力の上、所定のフォルダに保存を行い、保存したファイル「row(“商品名”).ToString.xls」からB22セルを読み取り、sheet1へ転記する。write cellでは、“A” + transactions.ToStringとしております。

エラー部分:「ReadCell : The sheet does not exist」
ほかに情報が必要であれば教えてください。
情報不足ですみませんが、よろしくお願いいたします。

なお、uipathのエクセルactivityのバージョンは、上記質問項目の通り古いままです。
恐らく、excel application scopeでの指定方法が間違っているのだと推測致します。Visibleにしますと、空のエクセルから転記しているようでした。
※原因ではないと思いますが、転記元のrow(“商品名”).ToStringは、シートに保護が掛かっております。


#19

@yukino
もしかしたら、エクセルのワークシートなので、Excel ではなくて、
System-File-Workbook-read cellでしょうか?
勘違いでしたら、すみません。

もしかしたら、エクセルブックの保護がかかっており、シート名?が1,2となっております。
ワークシートの挿入とすると、Sheet1が現れます。
excel application scopeでは読み取れているみたいなので、エクセル自体の問題かもしれません。


#20

画像ありがとうございます。あまりおかしなところはなさそうですが。。。

・[エクセルの読込]はこのままで動いていますか?
“C:\Users\Documents” の後ろに "\"をつけてあげないと、正しくフォルダを指す文字列になりません。
[“Documents商品名.xlsx” ]っていう文字列が出来上がり、Documentsフォルダ内の商品名ファイルとは解釈しません。

・商品名.xlsx で保存されているファイルのシート名は、[Sheet2]に正しく変更されていますか?保存したファイルのファイル名を確認してください。

というのは・・・
私の環境では頂いた画像では正しくタブ名の変更ができず、[TypeInto]アクティビティの[DelayBetweenKeys]プロパティ(キー入力の間に指定されたミリ秒待機する)を設定したりしました。
※アクティビティを新しくしないと出てこないかもしれません

・先の話になりますが、[エクセルへの書き込み]もこのままだと失敗しそうです(それにしてはエラーが出てないのが謎です)
[“c:\Users\Documents\Uipath\sheet1.xlsx”] が指定したい内容かと。

・Write Cell のセル位置を指定するところは、@Honoka さまが書いてくださったような、「行番号を指定するための数字」が必要です。現状の [transaction.tostring]ではその番号が取れないと思います。安直ですが、[for each row]をスコープとしたint型変数を作って、“A” & int型変数 とし、ループの最終行で [assign]アクティビティを使ってカウントアップするなどしてみてください。