Upgrade to Pro — share decks privately, control downloads, hide ads and more …

EXCEL系アクティビティで出来る事・出来ない事

27b73d7672b2f75a58184c544df1e721?s=47 HANACCHI
July 27, 2021
240

 EXCEL系アクティビティで出来る事・出来ない事

20210727 RPA勉強会 UiPath Talk~UiPath × VBA連携を学ぼう~

27b73d7672b2f75a58184c544df1e721?s=128

HANACCHI

July 27, 2021
Tweet

Transcript

  1. EXCEL系アクティビティで出来る事・出来ない事

  2. はなっち!とは…  2019年10月 UiPath Japan MVP 2019 認定  2020年10月

    UiPath Japan MVP 2020 認定  2020年11月 定年退職  同 年 同 月 FUJITSU UT社と契約  お客様先でRPAサポート&開発  Twitter:hjmkzk  Qiita:@HANACCHI  FaceBook:hajime.kozaki
  3. MarketPlace VBA を呼び出し ライブラリ機能 (カスタムアクティビティ) 今日のメニュー

  4. こんな問題にぶち当たった ① 業務担当者と仕様検討の際、対象とするシート名は固定名とするとした。 ② 業務担当者のところにメールされてくるEXCELブックを対象に処理したと こと、以下の問題が発生! a. シート名がない!エラー b. シート名があるが、転記内容が違う

    ③ 故障となったファイルを共有していただいたら、以下の事が分かった。 a. 書き方サンプルをコピーし、仕様として決められたシート名に変更し ていなかった b. 書き方サンプルをコピーし、仕様として決められたシート名に変更し たのち、それを非表示にしてしまい、慌てて書き方サンプルに内容を 記載していた ⇒標準アクティビティに、使えそうなアクティビティがない!
  5. "EXCEL"で検索し、HITした、標準的なアクティビティ

  6. 足りない機能は…MarketPlaceだ!  罫線を簡単に引きたい!  列の幅を指定したい!  行の高さを指定したい!  ピボットテーブルを構築したい! 

    などなど
  7. 足りない機能は…ここにを確認します ★無い場合は、ご自分で追加設定してください

  8. https://marketplace.uipath.com/listings/easy-excel-activity-pack 足りない機能は…ここにアクセスし…

  9. 足りない機能は…ここにアクセスし…ここにダウンロードし… C:¥Users¥h-kozaki¥Documents¥UiPath

  10. 足りない機能は…ここにアクセスし…ここにダウンロードし…「パッケージを管理」からインストールしよう!

  11. どんな機能が追加されるのか?(1/2)

  12. どんな機能が追加されるのか?(2/2)

  13. EXCELシートの一覧を取得してみよう!

  14. EXCELシートの一覧を取得してみよう!… 実行してみよう!

  15. EXCELシートの一覧を取得してみよう!… 実行したらこうなった!

  16. VBA の呼び出しを使用する時の注意事項 … 開発時意識しないが、利用者側でも確認が必要!

  17. EXCELシートの一覧を取得してみよう!… 実行したらOK!

  18. INTERMISSION これまでのまとめ • EXCELの標準アクティビティにない機能は、UI操作で実行 するか、あきらめるか… • ダメ元で、UiPath MarketPlaceを探してみよう! ⇒「かんたん Excel

    アクティビティパック」 • UiPath MarketPlaceでのアクティビティを使用する場合、 EXCELの信頼関係の確認を!
  19. • やりたい事が出来ない時は、MarketPlaceで探してみよう! ⇒ダウンロードしてみないと、どんな機能があるのか分からない... • 外部のアクティビティパックを使っていいの? ⇒正規サポートも受けられないアクティビティは、使ってはダメ!かも? • 使えるんだけど、痒いところに手が届かない! ⇒シート一覧から、表示/非表示かどうかが分からない! だったら、自分で作ってみよう!

    MarketPlaceだ! ここから先はVBAの知識があった方がいいです!
  20. 自分で作る、VBAの機能  「VBA の呼び出し」アクティビティを使う。 ⇒EXCEL-VBAの知識があるといい!  「Excel アプリケーションスコープ」の配下に実装する。 ⇒対象ワークブックが必要!

  21. 自分で作るVBAの、開発 L1:エントリメソッドの定義。括弧の中には、最大30個の引数が定義でき、 Functionの場合は、戻り値を定義できる。 L2:エントリメソッド内で使用する変数の定義。なくてもよいが、合った方がよい L4:戻り値の初期化 L5:ActiveSheetの親(Workbook)のSheetsの件数分繰り返す L6:戻り値に、タブと、シート名を連結する L7:繰り返しの終点 L8: Mid関数を使用し、最初のタブを除去する

    L10:エントリメソッドの出口 Public Function AllSheetName() Dim ix As Integer AllSheetName = "" For ix = 1 To ActiveSheet.Parent.Sheets.Count AllSheetName = AllSheetName & vbTab & ActiveSheet.Parent.Sheets(ix).Name Next ix AllSheetName = Mid(AllSheetName, 2) End Function 1 2 3 4 5 6 7 8 9 10 InvokeVBA.bas
  22. 自分で作るVBAの、開発 開発は、VBAからでもできる。寧ろ、VBAでの開発をお勧め! 但し、UiPathの「VBA の呼び出し」アクティビティにて使用する時は、以下の点に注意! ・Excel アプリケーションスコープ配下で使うのが大前提! ・Option構文は使用できない。 ・Publicは入れておく。 ・Functionの戻り値を定義しても、呼び出し側ではObject型を定義する。 ⇒CTypeで変換を掛けると、あとあと使いやすい。

    ・使用PCのEXCELの信頼オプションを確認しよう! Public Function AllSheetName() Dim ix As Integer AllSheetName = "" For ix = 1 To ActiveSheet.Parent.Sheets.Count AllSheetName = AllSheetName & vbTab & ActiveSheet.Parent.Sheets(ix).Name Next ix AllSheetName = Mid(AllSheetName, 2) End Function 1 2 3 4 5 6 7 8 9 10 InvokeVBA.bas
  23. EXCELシートの一覧を取得してみよう!… 実行してみよう! VBAの呼び出し.ToString.split(ControlChars.Tab) • [VBAの呼び出し]の戻り値(Object型)を、 • .ToStringして文字列変換し、 • tabコードで.Splitし、 •

    配列化する
  24. 自分で作るVBAの、表示シートの一覧を取得 L1:エントリメソッドの定義。括弧の中には、 最大30個の引数が定義でき、Functionの場合は、戻り値を定義できる。 L2:エントリメソッド内で使用する変数の定義。なくてもよいが、合った方がよい L3:戻り値の初期化 L4:ActiveSheetの親(Workbook)のSheetsの件数分繰り返す L5:シート表示モードがxlSheetVisible(-1)なら… L6:戻り値に、タブと、シート名を連結する L8:繰り返しの終点 L9:

    Mid関数を使用し、最初のタブを除去する L10:エントリメソッドの出口 Public Function VisibleSheetName() Dim ix As Integer VisibleSheetName = "" For ix = 1 To ActiveSheet.Parent.Sheets.Count If ActiveSheet.Parent.Sheets(ix).Visible = -1 Then VisibleSheetName = VisibleSheetName & vbTab & ActiveSheet.Parent.Sheets(ix).Name End If Next ix VisibleSheetName = Mid(VisibleSheetName, 2) End Function 1 2 3 4 5 6 7 8 9 10 InvokeVBA.bas
  25. EXCELシートの一覧を取得してみよう!… 実行したらOK!

  26. Public Function intを返します() As Integer intを返します = -1 End Function

    Functionの戻り値の実行例 Public Function Dateを返します() As Date Dateを返します = DateSerial(1960, 11, 11) + TimeSerial(1, 2, 3) End Function Public Function 文字列配列を返します() As String() Dim WK() As String ReDim WK(2) WK(0) = "A" WK(1) = "B" WK(2) = "C" 文字列配列を返します = WK End Function CType(Object型, Int16) CType(Object型, DateTime)
  27. INTERMISSION これまでのまとめ • EXCELの標準アクティビティにない機能は、 .bas中にSub/Function関数を定義、コーディングして、 「VBA の呼び出し」アクティビティで、直接操作してみよう! • 入力、出力の引数は、Object型である。 .bas側はObject型でなくてもよい!

    • UiPath側で、CType(変数, 型定義)でキャストしてあげよう!
  28. Public Function VisibleSheetName() Dim ix As Integer VisibleSheetName = ""

    For ix = 1 To ActiveSheet.Parent.Sheets.Count If ActiveSheet.Parent.Sheets(ix).Visible = -1 Then VisibleSheetName = VisibleSheetName & vbTab & ActiveSheet.Parent.Sheets(ix).Name End If Next ix VisibleSheetName = Mid(VisibleSheetName, 2) End Function 他のロボットでも使いやすくしてみよう! VBAの呼び出し.ToString.split(ControlChars.Tab) • [VBAの呼び出し]の戻り値(Object型)を、 • .ToStringして文字列変換し、 • tabコードで.Splitし、 • 配列化する VBAファイルを展開してもよいが、 • VBAファイルが書き換えられてしまう • 戻り値.ToString.split(ControlChars.Tab)をロボ側でやらねばならない手間 ライブラリ機能で実装してみよう!
  29. ライブラリ機能 • 新しい空のライプラリを作成する際の名前は、 英字で作成する ⇒MarketPlaceに申請など使用とした場合、間違えがない! ★MarketPlaceのサーバーは、 にある(らしい) • 説明は、後でも加筆修正出来ます! project.json

  30. ライブラリ機能で実装してみよう! 前提 • 「VBA の呼び出し」アクティビティは、 「EXCEL アプリケーションスコープ」の配下に配置しなければならない • ライブラリ機能は、呼出元のMain以外のアクティビティとして挙動する。 呼出元のMain内の「EXCEL

    アプリケーションスコープ」で開いたEXCELを、 対象にしなければならない! どのようにするのか? ⇒ 「出力」の「パラメタ」に変数を設定し、それを持ちまわる。 ⇒持ちまわる際には、「既存のブックを使用」に設定する 更に、オプションは、すべてチェックオフにする(多分)
  31. 引数として渡す 対象ブックは、「ワークブック」に定義した変数で! どのようにするのか? ⇒ 「出力」の「パラメタ」に変数を設定し、それを持ちまわる。 ⇒持ちまわる際には、「既存のブックを使用」に設定する 更に、オプションは、すべてチェックオフにする(多分) 自作アクティビティ側 呼び出し元

  32. アクティビティの入力:「ワークブック」に定義した変数を受け取る!

  33. VisibleSheetName.ToString.Split(ControlChars.Tab) アクティビティの出力:「VBA の戻り値」がObject型なので、自作側で扱いやすいように変換し返還! Object型を 文字列型にし タブ区切りで 配列化

  34. PUBLISH(1/3) 物理ファイル名であり、 「パッケージを管理」のタイトル 新しいバージョン。現在のバー ジョンより先行させねばならない ファイル名を変えてしまった場合 リリースメモ

  35. とりあえず、「カスタム」 「カスタム」の場合、 格納フォルダ指定 PUBLISH(2/3) UiPath Studio上での 表示名

  36. PUBLISH(3/3)

  37. 21.6.0-beta.4514+Branch.release-v21.6.0.Sha.57f15d2b37925eaab372a335a19cfdb1e3e4ce40 ライブラリ は正常にパブリッシュされました。 名前: HANACCHI.EXCEL.ACTIVITIES バージョン: 1.0.1 パブリッシュ先: [C:¥Users¥xxx¥Documents¥UiPath](file:///C:/Users/xxx/Documents/UiPath) lib/net45¥HANACCHI.EXCEL.ACTIVITIES.dll

    lib/net45¥HANACCHI.EXCEL.ACTIVITIES_Expressions_59961323.dll lib/net45¥HANACCHI.EXCEL.ACTIVITIES_Expressions_65311315.dll lib/net45¥InvokeVBA.bas lib/net45¥project.json lib/net45¥.tmh¥config.json lib/net45¥.settings¥Design¥settings-afad0842.json lib/net45¥.settings¥Release¥settings-1a5b880a.json lib/net45¥.settings¥Release¥settings-5190454b.json lib/net45¥.settings¥Release¥settings-590bb27b.json lib/net45¥.settings¥Release¥settings-9e9290da.json lib/net45¥.settings¥Release¥settings-a1b2dac1.json lib/net45¥.settings¥Release¥settings-afad0842.json PUBLISH成功!
  38. INTERMISSION これまでのまとめ • MarketPlace公開を狙うなら、ライブラリ名は英語で! • VBAの出力は雑でも、アクティビティとしての出力はカス タムアクティビテイ側で綺麗にしよう! • 引数の注釈などは分かりやすく追加しましょう!日本人の 分かる英語なら、外国の人も使いやすいかも!(私は英語

    の才能がない)
  39. カスタムアクティビティ…インストール!

  40. カスタムアクティビティ…インストール!

  41. 依存関係前 { "name": "シート名の一覧を取得", "description": "VBA呼出し", "main": "Main.xaml", "dependencies": {

    "UiPath.Excel.Activities": "[2.5.1]", "UiPath.Mail.Activities": "[1.3.0]", "UiPath.System.Activities": "[18.4.2]", "UiPath.UIAutomation.Activities": "[18.4.4]", "UiPathTeam.Excel.Activities": "[1.1.2]" }, "schemaVersion": "4.0", "studioVersion": "21.6.0.0", "projectVersion": "1.0.0.0", 依存関係後 { "name": "シート名の一覧を取得", "description": "VBA呼出し", "main": "Main.xaml", "dependencies": { "HANACCHI.EXCEL.ACTIVITIES": "[1.0.1]", "UiPath.Excel.Activities": "[2.11.0-preview]", "UiPath.Mail.Activities": "[1.11.0-preview]", "UiPath.System.Activities": "[21.6.1-preview]", "UiPath.UIAutomation.Activities": "[21.6.1-preview]", "UiPathTeam.Excel.Activities": "[1.1.2]" }, "schemaVersion": "4.0", "studioVersion": "21.6.0.0", "projectVersion": "1.0.0.0", カスタムアクティビティ…インストール中に! 略 略 project.json
  42. カスタムアクティビティ…実行してみよう!

  43. カスタムアクティビティ…改版されました!(ダウンロードは済んでいます!)

  44. カスタムアクティビティ…改版されました!(ダウンロードは済んでいます!)

  45. カスタムアクティビティ…改版されました!インストール中!

  46. カスタムアクティビティ…使う側に親切! 引数に注釈を設定すると! パラメタの項目部をマウスオーバーすると、 Tipsとして現れる

  47. その他

  48. VBA の呼び出しでのByVal CALL前:ByRef=2,ByVAl=4,RTN=0 CALL後:ByRef=102,ByVAl=4,RTN=10000 標準のByRefは、 呼び出し先での変更が、呼び出し元側にも影響する 呼び出し前:ByRef=2,ByVal=4,Return=/ 呼び出し後:ByRef=2,ByVal=4,Return=10000/ 標準のByRefでも、 呼び出し先での変更が、呼び出し元側にも影響しない

  49. 引数必要だが、渡されていない 引数の数が合わない VBA の呼び出しでのエラー状況

  50. エントリメソッドが見当たらない! VBA の呼び出しでのエラー状況

  51. VBA の呼び出しでの構文エラー(実行時に分かる) コーディング 実行時 EXCEL-VBE上で直しても、実際の.basファイルには反映されない 必ず、実際の.basファイルを修正すること!

  52. VBA の呼び出しでの構文エラー(実行時に分かる) 実行時 範囲?配列でもないのに!? ⇒EXCELでのIntegerと、UiPathでのInt32型とでは、取りうる値の範囲が違う! それぞれの型を見直し、 1)EXCEL側をLong型とする。 2)UiPath側を、Int16型とする

  53. 7月31日公開予定(UiPathブログ発信チャレンジ2021サマー) 「VBA を呼び出し」アクティビティ の<<Object型>> 「VBA を呼び出し」アクティビティ で遭遇するエラー 「VBA を呼び出し」アクティビティ でそれでも遭遇するエラー

    「VBA を呼び出し」アクティビティ で作ったもの (現在MarketPlace審査中)