はじめに
UiPathの標準機能にはAccessとの連携機能が十分にないため、UiPathでAccess VBAを実行するには少し工夫が必要になります。
この記事ではUiPathからAccess VBAを実行する方法を2つ紹介します。
用途による使い分け
用途 | マクロ経由 | Excel経由 | COM使用 ※3 |
---|---|---|---|
引数を使用しない | 〇 | 〇 | 〇 |
1つの引数を渡す | 〇 | 〇 | 〇 |
複数の引数を渡す | △ ※1 | 〇 | 〇 |
任意の型の引数を渡す | × ※2 | 〇 | 〇 |
戻り値を取得する | × | 〇 | 〇 |
シンプルな構成にしたい | △ | × | 〇 |
標準機能のみで構成 | 〇 | 〇 | × |
※1 本来は単一の引数しか渡せませんが、配列操作により複数の引数を渡すこともできます。
※2 文字列型の引数のみ渡すことができます。
※3 UiPath MarketplaceでMicrosoftが公開しているAccess用のアクティビティパッケージを使用して、UiPathからAccess VBAを実行する方法です。
UiPath Marketplaceを利用できる環境であれば、このアクティビティを使用してよりシンプルな構成にできます。
この記事では説明を割愛しますが、TechPark55さんの記事でわかりやすく解説されていますので、参考にしてみてください。
1. Accessのマクロ経由でAccess VBAを実行
UiPathでは【プロセスを開始】アクティビティでAccessの起動とマクロの実行ができます。この機能を利用し、Accessのマクロを経由することで、UiPathからAccess VBAを実行できます。
引数 :Accessツールに複数の文字列型の引数を渡すことができます。
戻り値:Accessツールから戻り値を取得することはできません。
1-1. Accessツールの作成
全体の構成
Accessツール内でマクロからFunctionプロシージャを実行します。
1-1-1. Functionプロシージャの作成
Accessツールの標準モジュールにFunctionプロシージャを作成します。
引数を渡す場合、【Command】関数でUiPathから渡された引数を取得します。
マクロが実行できるのはFunctionプロシージャのみです。
Subプロシージャは実行できません。
Option Compare Database
Option Explicit
'待機時間を設定する場合はモジュール先頭にSleep関数を宣言します。
'Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal MilliSecond As Long)
Function SampleCode()
'起動時にウィンドウを最大化する場合、最大化の処理の前後にDoEvents関数を記載します。
DoEvents
DoCmd.RunCommand acCmdAppMaximize
DoEvents
'1つの引数を渡す場合
'Command関数でUiPathから渡された引数を取得します。
'Command関数で取得した値は後ろに半角スペースがつくためTrim関数で半角スペースを除去します。
Debug.Print Trim(Command)
'複数の引数を渡す場合
'複数の引数を区切り文字で区切られた単一の引数として渡し、
'Split関数で配列として取得します。
Dim tmpArray As Variant
Dim i As Long
tmpArray = Split(Trim(Command))
For i = 0 To UBound(tmpArray)
Debug.Print tmpArray(i)
Next
'インポート処理
'クエリ実行処理
'エクスポート処理
'エクスポート処理が完了していない状態で、Accessツールの終了処理(DoCmd.Quit)が
'開始されてエラーになる場合、待機時間を設定します。
'Call Sleep(5000)
'最後にAccessの終了処理を記載します。(後述のマクロの最後に終了処理を入れてもOKです。)
DoCmd.Quit
End Function
1-1-2. マクロの作成
【プロシージャの実行】マクロアクションを使用して、Functionプロシージャを実行するマクロを作成します。
UiPathで渡した引数は、FunctionプロシージャのCommand関数で直接受け取るため、マクロでの引数の指定は不要です。
■AccessツールのFunctionプロシージャにAccess終了処理(DoCmd.Quit)を入れる場合
【プロシージャの実行】マクロアクションのみ設定します。
■AccessツールのFunctionプロシージャにAccess終了処理(DoCmd.Quit)を入れない場合
【プロシージャの実行】マクロアクションと【Accessの終了】マクロアクションを設定します。
1-2. UiPathのワークフロー
Accessツールのマクロ実行と処理終了確認のプロセスを作成します。
① マクロ実行
【プロセスを開始】アクティビティでAccessツールを起動しマクロを実行します。
マクロと引数の指定には【コマンドラインスイッチ】を使用します。
■引数を使用する場合
※文字列型の引数を渡すことができます。
② 処理終了確認
【トリガー スコープ】アクティビティと【プロセス終了トリガー】アクティビティを使用して、Accessツールの処理終了まで待機します。
トリガースコープのスケジュールモードは「1回」に設定します。
2. Excelツール経由でAccess VBAを実行
UiPathとExcelの連携機能は充実しており、同じMicrosoft OfficeシリーズのExcelとAccessの連携も容易にできます。そのため、Excelツールを経由することで、UiPathからAccess VBAを実行できます。
引数 :Accessツールに複数の任意の型の引数を渡すことができます。
そのため、配列型の引数を渡すなど様々な用途に使用することができます。
戻り値:Accessツールから任意の型の戻り値を取得することができます。
2-1. Accessツールの作成
標準モジュールに処理内容を記載します。
戻り値を返す場合はFunctionプロシージャを使用し、
戻り値を返さない場合はSubプロシージャを使用します。
UiPath・Excel・Accessを連携させた場合、UiPathはAccessの処理完了まで待機するため、処理完了検知用の処理は不要です。
Option Compare Database
Option Explicit
Sub SampleCode(ByVal parameter1 As String, ByVal parameter2 As String)
Debug.Print parameter1
Debug.Print parameter2
'インポート処理
'クエリ実行処理
'エクスポート処理
End Sub
2-2. Excelツールの作成
標準モジュールにAccessツールの起動処理・実行処理・終了処理を作成します。
戻り値を返す場合はFunctionプロシージャを使用し、
戻り値を返さない場合はSubプロシージャを使用します。
Option Explicit
'Accessのインスタンス変数をモジュールレベル変数として宣言
Private acApp As Object
'Accessツールの起動処理
Sub OpenTool()
'Accessツールのファイルパスの変数を宣言
Dim toolPath As String
'Accessツールのファイルパスを作成
toolPath = ThisWorkbook.Path & "\AccessTool.accdb"
'Accessのインスタンス作成時にエラーが発生する場合は待機時間を設定する
'Application.Wait Now() + TimeValue("00:00:03")
'Accessのインスタンスを作成
Set acApp = CreateObject("Access.Application")
'Accessツールを起動
acApp.OpenCurrentDatabase toolPath
'Accessツールを最大化
acApp.RunCommand 10 'Application.RunCommand acCmdAppMaximize
'Accessオブジェクトを表示
acApp.Visible = True
End Sub
'Accessツールの実行処理
Sub ExecuteCode(ByVal parameter1 As String, ByVal parameter2 As String)
'acApp.Run プロシージャ名, 引数1,引数2
acApp.Run "SampleCode", parameter1, parameter2
End Sub
'Accessツールの終了処理
Sub CloseTool()
'Accessを終了
acApp.Quit
'Accessのインスタンスを破棄
Set acApp = Nothing
End Sub
2-3. UiPathのワークフロー
【スプレッドシートのマクロを実行】アクティビティを配置し、Excelツールの起動処理・実行処理・終了処理のプロシージャを指定します。
引数を渡す場合は「マクロ引数」に必要数の引数を記載します。
戻り値を返す場合は「出力先」に受け取り用の変数を設定します。
おわりに
業務の中でUiPathからAccessツールを操作することが多いのですが、UiPathの標準機能ではAccess VBAを直接実行できず、UiPathのシナリオの作成にかなり苦労しました。
皆さんもUiPathとAccessツールの連携において様々な工夫をされていると思いますが、この記事がお役に立てると幸いです。