Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

はなっち!とは…  2019年10月 UiPath Japan MVP 2019 認定  2020年10月 UiPath Japan MVP 2020 認定  2020年11月 定年退職  同 年 同 月 FUJITSU UT社と契約  お客様先でRPAサポート&開発  Twitter:hjmkzk  Qiita:@HANACCHI  FaceBook:hajime.kozaki

Slide 3

Slide 3 text

MarketPlace VBA を呼び出し ライブラリ機能 (カスタムアクティビティ) 今日のメニュー

Slide 4

Slide 4 text

こんな問題にぶち当たった ① 業務担当者と仕様検討の際、対象とするシート名は固定名とするとした。 ② 業務担当者のところにメールされてくるEXCELブックを対象に処理したと こと、以下の問題が発生! a. シート名がない!エラー b. シート名があるが、転記内容が違う ③ 故障となったファイルを共有していただいたら、以下の事が分かった。 a. 書き方サンプルをコピーし、仕様として決められたシート名に変更し ていなかった b. 書き方サンプルをコピーし、仕様として決められたシート名に変更し たのち、それを非表示にしてしまい、慌てて書き方サンプルに内容を 記載していた ⇒標準アクティビティに、使えそうなアクティビティがない!

Slide 5

Slide 5 text

"EXCEL"で検索し、HITした、標準的なアクティビティ

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

INTERMISSION これまでのまとめ • EXCELの標準アクティビティにない機能は、UI操作で実行 するか、あきらめるか… • ダメ元で、UiPath MarketPlaceを探してみよう! ⇒「かんたん Excel アクティビティパック」 • UiPath MarketPlaceでのアクティビティを使用する場合、 EXCELの信頼関係の確認を!

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

自分で作る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

Slide 22

Slide 22 text

自分で作る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

Slide 23

Slide 23 text

EXCELシートの一覧を取得してみよう!… 実行してみよう! VBAの呼び出し.ToString.split(ControlChars.Tab) • [VBAの呼び出し]の戻り値(Object型)を、 • .ToStringして文字列変換し、 • tabコードで.Splitし、 • 配列化する

Slide 24

Slide 24 text

自分で作る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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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)

Slide 27

Slide 27 text

INTERMISSION これまでのまとめ • EXCELの標準アクティビティにない機能は、 .bas中にSub/Function関数を定義、コーディングして、 「VBA の呼び出し」アクティビティで、直接操作してみよう! • 入力、出力の引数は、Object型である。 .bas側はObject型でなくてもよい! • UiPath側で、CType(変数, 型定義)でキャストしてあげよう!

Slide 28

Slide 28 text

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)をロボ側でやらねばならない手間 ライブラリ機能で実装してみよう!

Slide 29

Slide 29 text

ライブラリ機能 • 新しい空のライプラリを作成する際の名前は、 英字で作成する ⇒MarketPlaceに申請など使用とした場合、間違えがない! ★MarketPlaceのサーバーは、 にある(らしい) • 説明は、後でも加筆修正出来ます! project.json

Slide 30

Slide 30 text

ライブラリ機能で実装してみよう! 前提 • 「VBA の呼び出し」アクティビティは、 「EXCEL アプリケーションスコープ」の配下に配置しなければならない • ライブラリ機能は、呼出元のMain以外のアクティビティとして挙動する。 呼出元のMain内の「EXCEL アプリケーションスコープ」で開いたEXCELを、 対象にしなければならない! どのようにするのか? ⇒ 「出力」の「パラメタ」に変数を設定し、それを持ちまわる。 ⇒持ちまわる際には、「既存のブックを使用」に設定する 更に、オプションは、すべてチェックオフにする(多分)

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

PUBLISH(3/3)

Slide 37

Slide 37 text

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成功!

Slide 38

Slide 38 text

INTERMISSION これまでのまとめ • MarketPlace公開を狙うなら、ライブラリ名は英語で! • VBAの出力は雑でも、アクティビティとしての出力はカス タムアクティビテイ側で綺麗にしよう! • 引数の注釈などは分かりやすく追加しましょう!日本人の 分かる英語なら、外国の人も使いやすいかも!(私は英語 の才能がない)

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

依存関係前 { "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

Slide 42

Slide 42 text

カスタムアクティビティ…実行してみよう!

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

その他

Slide 48

Slide 48 text

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でも、 呼び出し先での変更が、呼び出し元側にも影響しない

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

7月31日公開予定(UiPathブログ発信チャレンジ2021サマー) 「VBA を呼び出し」アクティビティ の<> 「VBA を呼び出し」アクティビティ で遭遇するエラー 「VBA を呼び出し」アクティビティ でそれでも遭遇するエラー 「VBA を呼び出し」アクティビティ で作ったもの (現在MarketPlace審査中)