AccessマクロはRPAとの連携が得意分野です。
例えばUiPathなら「プロセスを開始」アクティビティで、accdbファイルのパスとマクロ名を指定して、Access起動と同時に指定したマクロを実行することができます。
RPAから呼び出し可能なマクロの主な例として、Accessのテーブルにデータをインポートするサンプルを紹介します。
作成するマクロの概要
UiPathで社内システムからダウンロードしたCSVファイルを、Accessの既存のテーブルにインポートする処理を想定しています。(UiPath側のダウンロードする処理の部分は割愛します。)
UiPathでAccessのマクロを実行するアクティビティの記述方法
UiPathの「プロセスを開始」(StartProcess)アクティビティで、下図のようにファイル名にaccdbファイルのフルパスを指定し、引数欄には起動スイッチ「/x」に続けて半角スペースを挟んで実行したいAccessマクロ名を指定します。
UiPathのプロセスを開始アクティビティでは、値を半角ダブルクォーテーションで囲って指定します。
ファイル名:
"c:¥test.accdb" (Accdssデータベースファイルのフルパス)
引数:
"/x マクロ1"
Accessマクロの全体図
今回作成するマクロの完成イメージは下図のようになります。
業務固有の処理を除けば、インポートマクロはほとんど似通った構造になります。
実行するアクションは以下の通りです。
- メッセージを非表示に設定
- 一時変数の設定
- 削除SQLを実行
- インポートモジュール(VBA)の実行
- すべての一時変数を削除
- メッセージの表示設定を元に戻す
- Accessの終了
インポート先のテーブル名は「T_IMPORT」、
インポート対象のCSVファイルは、accdbと同じフォルダに当日の日付「yyyymmdd.csv」形式で保存されている前提です。
Accessマクロの作成
準備
作業する前にマクロビルダの画面内ですべてのアクションを表示させるため、「すべてのアクションを表示」機能を有効にして作成を開始します。
1.メッセージを非表示に設定
マクロの先頭で「メッセージの設定」を「いいえ」に設定します。
処理中にメッセージボックスが表示されると、ユーザーがクリックするまでマクロの実行が中断してしまうので、メッセージを非表示にしてこれを回避します。
2.一時変数の設定
2-1.本日の日付を一時変数に保持
今回インポートするファイル名は「yyyymmdd」形式の本日の日付を想定しているので、先ずは日付を一時変数に格納します。
アクションリストから「一時変数の設定」を選択して、
名前:任意の変数名(例では「strToday」としました。)
式:
Format$(Date(),"yyyymmdd") ($はあってもなくても構いません。)
これで一時変数「strToday」に、yyyymmdd形式で本日の日付が格納されます。
一時変数を参照するときは、変数名の前に[TempVars]!を付けて「[TempVars]![strToday]」と記載します。
2-2.ファイルパスを一時変数に保持
次にファイルパスを一時変数に格納するため、「一時変数の設定」アクションをもうひとつ用意して次のように設定します。
名前:任意の変数名(例では「strPath」としました。)
式:
[application].[currentproject].[path] & "¥" & [TempVars]![strToday] & ".csv"
式の「 [application].[currentproject].[path] 」でカレントディレクトリのパスを取得します。
これに"¥"マークと先ほどの一時変数 [TempVars]![strToday] と、拡張子".csv"を「&」で連結します。
これを実行すると、カレントディレクトリにあるCSVファイルのフルパスが一時変数[TempVars]![strPath] に格納されます。
これらの変数、[TempVars]![strDate]、[TempVars]![strPath]は一時変数なので、値の格納後、このマクロを実行している間は値を保持します。
3.削除SQLを実行
「SQLの実行」アクションを追加して、インポート先テーブルのすべてのレコードを削除するSQL文を設定します。
SQLステートメント: DELETE * FROM T_IMPORT
トランザクションの使用:いいえ
トランザクションは、各自ご自由にどうぞ。
4.インポートモジュール(VBA)の実行
インポート処理は、VBAのプロシージャの実行結果を判定する形で実行します。
4-1.プロシージャを作成する(モジュール)
ショートカット[Alt] + [F11]を押下してエディタ(VBE)を開き、標準モジュールを挿入します。
挿入(I) - 標準モジュール(M)をクリックして、コードウインドウにこちらの記事で紹介しているプロシージャ「FncImportCsv」をコピペします。VBAでUTF-8のCSVデータをインポートするサンプル
マクロのIFアクションの条件式で使用できるように「Public Function」、戻り値はBoolean型で定義しています。この2か所については変更しないでください。
また、「FncImportCsv」でエラーが発生した場合のエラーメッセージをファイルに出力したい場合は以下の記事で紹介している「sOutputLog」プロシージャをモジュールに追加してください。
4-2.マクロの「IF」アクションを追加
マクロエディタに戻って、アクションのドロップダウンリストから「IF」を選び、条件式に4-1で作成した「FncImportCsv」を使って以下のとおり数式を入力します。
IF(に続けて) FncImportCsv([TempVars]![strPath],"T_IMPORT")=True
「FncImportCsv」は正常終了すると True、内部で何らかのエラーが発生した場合 Falseを返します。IFアクションでは、この戻り値でインポートプロシージャが成功したかどうかを判断します。
上図のようにインポート後に実行したいクエリなどがあれば、適宜設定してください。
また、インポートが異常終了した場合の処理を「Else」ブロックで追加することも可能です。
5.すべての一時変数を削除
「IF文の最後」の行の次に、「すべての一時変数の削除」アクションを追加します。
6.メッセージの設定を元に戻す
最初の工程(1)でメッセージを非表示にしていたので、マクロの最終ステップで「メッセージの設定」を「はい」に戻します。
7.Accessの終了
最後にAccessアプリケーションを終了します。
インポートしたあと Accessを開きっぱなしにして何らかの操作を行いたい場合、このアクションは不要です。
さいごに
RPAに限らず自動処理を安定稼働させるには、呼び出されたアプリ側ではメッセージボックスを一切表示させない事が重要です。
エラーが発生したのをRPA側に通知する対応策は、エラーログファイルを出力して、呼び出し元のRPAシステム側で取得するなどの工夫が必要となります。