皆もすなるQiitaといふものを、儂もしてみむとてするなり。
と言う訳で、こん**は!はなっち!です。
★★★この記事はUiPathブログ発信チャレンジ2021サマー、7月31目の記事です。★★★
###「VBA を呼び出し」アクティビティとは
「VBA を呼び出し」アクティビティは、Excel Application Scopeの配下で機能する、EXCEL-VBAで記述されたFunction 関数、Sub関数を呼び出すアクティビティです。これを使えば、EXCEL-VBAで組んだビジネスロジックなども転用できるわけです。ただし、注意点があります。それをちょいと説明していこうと思います。
###「VBA を呼び出し」アクティビティの設定
「VBA を呼び出し」アクティビティで設定する箇所は、4か所あります。
1)コードパスファイル名(図1では、"hogehoge.bas"。これは必須)
2)エントリメソッド名(図1では、"hogehoge"。これは必須)
3)エントリメソッドのパラメタ(図2では、{INHoge1,INHoge2}。これがエントリメソッドに指定された関数の入力パラメタとなる。図3参照)
4)出力値(図2では、Outhoge。Function関数での戻り値を受け取る変数)
です。
図1 「VBA を呼び出し」アクティビティ
図2 「VBA を呼び出し」アクティビティのプロパティ
図3 "hogehoge.bas"ファイルの"hogehoge"Function関数
実装した際の値は、以下の変数を用意し、変数の型を指定します。
図4 ロボット上の設定値
"hogehoge.bas"ファイルの"hogehoge"Function関数は、2つの引数ともString型を想定しています。
が、ここではINHoge2をInt32として定義してみます(値は2)
###実行してみましょう!
型が違っても、図3のFunction関数の通りに、Hoge1とHoge2を、"/"で連結した結果を返していますね(図5 ロボットでの実行結果参照)
###なんで?
EXCEL-VBAで開発を行った方は実行できてしまった事にビックリされた事と思います。わたしもそうでした。結構いけるぢゃん!ってね。
これには、訳がありそうです。
図2の「エントリメソッドのパラメーター」部分をマウスオーバーすると、
図6 「エントリメソッドのパラメーター」の説明
が表示されます。そうなんです。「VBA を呼び出し」アクティビティがエントリメソッド名を呼び出す際に準備されている変数は30個であり、その属性はObject型なのです。
###Object型
Object型はしらべてみると、
".NET クラス階層のすべてのクラスをサポートし、派生クラスに下位レベルのサービスを提供します。 これは、全 .NET クラスの基本クラスであり、型階層のルートです。"
と記載されています。型階層のルートと言うことは、他の属性の頂点にいるもので、なんでも受け取ってくれる型なんでしょう。
ロボ側で、Object型で定義した変数は、「エントリメソッドのパラメーター」に指定するとそれはそのままObject型として扱われるようですね。図4のように、Int32型で定義した変数では、それはInt32型の属性を持ってますよ!ってのをObject型に教えてあげつつ、扱われる…的な。
実際に、「VBA を呼び出し」アクティビティが図3のFunction関数を呼び出す際に、その引数の属性の定義に合わせて属性変換(CType:Convert Type)してくれるのでしょう。
###戻り値、出力値は?
「VBA を呼び出し」アクティビティの出力値の型がObject型なので、Function関数の戻り値は、型を定義したとしても、ロボとしてはObject型で受け取ります。例えば、Function関数の戻り値が配列であっても、ロボとしてはObject型で受け取り、その後使用する際に、属性変換(CType:Convert Type)し、扱い易くする必要はありますね。
図7 配列文字列型のFunction関数の戻り値を属性変換の例
###お作法
Object型がやってくれるから!と思っていても、ロボを作成する上では、Function関数で定義された型をエントリメソッドのパラメーターに指定していきましょう。他の方があとで見返した時に、あれ?属性が違うな。。。と、訝しがる事必至ですから。
##おわりに
いかがでした?
Object型って、あるのは分かっていますが、どんな時に使うんだろうねって感じの人もいらっしゃると思います。しっかり理解していただいて、美しいロボを作成してまいりましょう!
是非UiPathでのロボ開発の一助になればと思っています。
ありがとうございました!