きなこSHOW

自作プログラム置き場です。

CSVファイルを自動インポートするAccessマクロのサンプル

AccessマクロはRPAとの連携が得意分野です。
例えばUiPathなら「プロセスを開始」アクティビティで、accdbファイルのパスとマクロ名を指定して、Access起動と同時に指定したマクロを実行することができます。
RPAから呼び出し可能なマクロの主な例として、Accessのテーブルにデータをインポートするサンプルを紹介します。

作成するマクロの概要

UiPathで社内システムからダウンロードしたCSVファイルを、Accessの既存のテーブルにインポートする処理を想定しています。(UiPath側のダウンロードする処理の部分は割愛します。)

UiPathでAccessのマクロを実行するアクティビティの記述方法

UiPathの「プロセスを開始」(StartProcess)アクティビティで、下図のようにファイル名にaccdbファイルのフルパスを指定し、引数欄には起動スイッチ「/x」に続けて半角スペースを挟んで実行したいAccessマクロ名を指定します。

20200826100414

プロセスを開始_プロパティ
UiPathのプロセスを開始アクティビティでは、値を半角ダブルクォーテーションで囲って指定します。

ファイル名:
"c:¥test.accdb"   (Accdssデータベースファイルのフルパス)

引数:
"/x マクロ1"

 

Accessマクロの全体図

今回作成するマクロの完成イメージは下図のようになります。

マクロ全体図
業務固有の処理を除けば、インポートマクロはほとんど似通った構造になります。

実行するアクションは以下の通りです。

  1. メッセージを非表示に設定
  2. 一時変数の設定
  3. 削除SQLを実行
  4. インポートモジュール(VBA)の実行
  5. すべての一時変数を削除
  6. メッセージの表示設定を元に戻す
  7. 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の実行

SQLステートメント: DELETE * FROM T_IMPORT

トランザクションの使用:いいえ

トランザクションは、各自ご自由にどうぞ。

 

4.インポートモジュール(VBA)の実行

インポート処理は、VBAのプロシージャの実行結果を判定する形で実行します。

4-1.プロシージャを作成する(モジュール)

ショートカット[Alt] + [F11]を押下してエディタ(VBE)を開き、標準モジュールを挿入します。
VBE標準モジュールを挿入
挿入(I) - 標準モジュール(M)をクリックして、コードウインドウにこちらの記事で紹介しているプロシージャ「FncImportCsv」をコピペします。VBAでUTF-8のCSVデータをインポートするサンプル

マクロのIFアクションの条件式で使用できるように「Public Function」、戻り値はBoolean型で定義しています。この2か所については変更しないでください。
また、「FncImportCsv」でエラーが発生した場合のエラーメッセージをファイルに出力したい場合は以下の記事で紹介している「sOutputLog」プロシージャをモジュールに追加してください。

エラーメッセージをログ出力するVBAサンプル

 

4-2.マクロの「IF」アクションを追加

マクロエディタに戻って、アクションのドロップダウンリストから「IF」を選び、条件式に4-1で作成した「FncImportCsv」を使って以下のとおり数式を入力します。
IFアクション

IF(に続けて) FncImportCsv([TempVars]![strPath],"T_IMPORT")=True

「FncImportCsv」は正常終了すると True、内部で何らかのエラーが発生した場合 Falseを返します。IFアクションでは、この戻り値でインポートプロシージャが成功したかどうかを判断します。

インポートが成功したら業務固有の処理を実行
上図のようにインポート後に実行したいクエリなどがあれば、適宜設定してください。
また、インポートが異常終了した場合の処理を「Else」ブロックで追加することも可能です。

 

5.すべての一時変数を削除

すべての一時変数の削除
「IF文の最後」の行の次に、「すべての一時変数の削除」アクションを追加します。

 

6.メッセージの設定を元に戻す

最初の工程(1)でメッセージを非表示にしていたので、マクロの最終ステップで「メッセージの設定」を「はい」に戻します。
メッセージの設定:はい

 

7.Accessの終了

Accessの終了
最後にAccessアプリケーションを終了します。
インポートしたあと Accessを開きっぱなしにして何らかの操作を行いたい場合、このアクションは不要です。

 

さいごに

RPAに限らず自動処理を安定稼働させるには、呼び出されたアプリ側ではメッセージボックスを一切表示させない事が重要です。
エラーが発生したのをRPA側に通知する対応策は、エラーログファイルを出力して、呼び出し元のRPAシステム側で取得するなどの工夫が必要となります。