Excelで非表示列や行などがある場合の動的なデータ取得方法

ロボット化したい業務で、Excelの操作があるのですが
シートが複数あり、各シート内で取得するデータの場所が違うため目印を見つけ、そこからループで処理を行おうとしています。
以下を例にします。

日付 商品名 価格 在庫 (出荷)
01/10 りんご 150 5個 01/12
01/20 みかん 130 3個 01/22

【やりたいこと】
このような表の中から今日の日付(現時点で日付欄が01/20のもの)が対象で、商品名や価格、在庫を取得します。

【問題点】
①この時、商品名や価格の間に非表示列があり、非表示の場合は取得しませんが表示されていた場合はその項目に対するデータも取得したいです。
②この非表示になっている項目名も決まっているわけではなく、いろいろな項目が非表示になっています。
③また、この表はA1からはじまっているわけではなく、データの終わりや項目数が違うので全選択という形でデータとして取得することができないと思います

このような場合、【やりたいこと】を再現できる方法はあるのでしょうか。
思い当たることがあれば教えていただきたいです。

1 Like

「範囲を読み込み」アクティビティで、範囲として"A1"を指定して、ヘッダーの追加オプションをチェックオフにすると、A1セルから以降すべてがデータテーブル型として読み込まれます。

その後、ヘッダー情報がある行を求め、さらに必要な列を求め、必要な列のみにレイアウト成型します。

データにはヘッダー部分も含まれているので、後で「データテーブルのフィルタ」アクティビティでのぞいてあげる。

出来ないことはないと思いますよ

1 Like

@1117 さん

現状のUiPathの仕様だと、自分が知る限り、非表示状態のセルを「取得しない」設定(あるいは、読み取ったDataTableから、そのセルが非表示だったか取得する方法)は用意されていません。

ただ、【やりたいこと】に関しては、できるできなの話で言うと、条件付きで可能です。
まず、一時的に作業領域として使う表(シート)を、同じファイルに作成します。
そこに、Excelファイル側のマクロか、UiPath側のInvoke VBAで、元の表から可視セルのみのコピーを行った上で、その表をUiPathでRead Rangeします。
これにより、表示されている表のみの取得が可能となります。

(どちらの方法でも、作業用のワークシートを追加する必要があります。また対象ファイルにマクロを持たせるか、Invoke VBAを使用する場合、Excel側のセキュリティ設定を弱める必要があるので「条件付きで」可能、と記載しました)

3 Likes

やっぱりそのような機能はないですよね。

別ファイルに一度書き出してすべてのシート内の表をA1から扱えるようにしました。

こんにちは

@tkgsn146 さんの補足になりますが、以下のVBA呼んであげれば別シート作らなくても非表示列を把握できるのではと思います。(下記の場合空白区切りの列番号文字列として取得)

Dim result As String
For Each c In Range("A1:Z1").EntireColumn
 If c.Hidden = True Then
  result = result + CStr(c.Column) + " "
 End If
Next
1 Like

@Yoichi
VBAを勉強中であまり詳しくないのですが、
取り出したい表データは、各シートの中でも開始位置やデータ量がバラバラでAA以降にあるシートもあります。
(1シートに取り出したい表データが2つあることもあります)
このような場合でもご提示いただいたVBAは使えますでしょうか。

こんにちは

列方向で言えば

For Each c In Range("A1:Z1").EntireColumn

のZ1を例えばZZ1にすればAA以降も取得できます。(指定した範囲で結果を返します)
A列を1とした絶対的な列番号で返ってきますので、後続の処理を適切にしてあげれば大丈夫かと思います。(ReadRangeでの範囲等とうまく整合を取る必要はあるかと思います。)

@Yoichi
ありがとうございます!
ちなみに、このVBAは非表示列を排除したデータテーブルを取得するものですか?
新しくシートを作る必要がないとのことですが、取得したデータテーブルはInvoke VBAから
どのように使えば良いのでしょうか。

わからないことばかりで申し訳ございません。

こんにちは

いいえ、このVBAコードは非表示列の情報を取得するだけのものです。
ちなみに上記コードはfunctionの中身だけなので、実際にはfunctionとして機能するよう記述してあげる必要があります。

このアプローチの場合、DataTableとしての読み込みはUiPathの仕事です。
ただしUiPathのReadRangeでは非表示列情報も含まれるので、その読み込み範囲と上記VBAの結果を照らし合わせて、当該列を除外するロジックを組み込む、あるいは非表示列をDataTableから削除する等の処理が必要かと思います。

@HANACCHI

出来ないことはないと思いますよ

そう言っていただけてありがたいです。
頭を使って頑張ろうと思えました!

1 Like

@Yoichi

なるほど、理解致しました。
詳しく教えていただきありがとうございます!

1 Like

うまく行った!あるいは理解した!
のでしたら、参考になった書き込みの解決策にチェックお願いしますね。

※パズルですよ、パズル(^_^.)

1 Like

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