RPAツール「Power Automate Desktop」の活用ポイント ②Accessデータにアクセスしてみよう

はじめに

 マイクロソフトが今年3月から無償提供を開始したRPAツール「Power Automate Desktop」(以下PAD)。無償でありながら豊富な機能を持っており、マイクロソフトのPower Platformの一角という安心感もあるので、RPAの普及が更に進むかと思います。

 このPADですが、Excelシートからのデータ読み取りについてはアクションが準備されているのですが、Accessテーブルからのデータ読み取りというアクションは準備されていません。そもそもAccess関連のアクションというものは一つも無いのです。

 実務で使用するPADフローでは、たとえばAccessDBにある社員マスタから情報を取得するといったニーズもあるのではないでしょうか。今回は、PADフローの中でAccessテーブルからデータ読み取りを行う方法をご紹介します。

「SQL接続を開く」アクションを使う?

 PADの画面左側にあるアクションのペインを見ると、「Excel」カテゴリの次に「データベース」というカテゴリがあり、「SQL接続を開く」「SQLステートメントの実行」「SQL接続を閉じる」というアクションが並んでいますが、これを使うというのはどうでしょうか。

 結論から言うと、もちろんこれを使うことは可能なのですが、OLEDB プロバイダーをインストールする必要があることや、一般向けの情報が乏しいことなどから、一般のPADユーザには若干ハードルが高いように思います。PADなどのRPAツールは、現場の一般ユーザが自らの業務効率化に利用するものですから、一般向けの情報が乏しいとハードルが高くなってしまいます。

VBScriptでADO接続を使用する

 VBAからAccessデータにアクセスする場合、ADO(ActiveX Data Objects)という接続方法が広く使用されていますが、実はPADでもADOでAccessに接続することができます。ADOの良いところは、ネット上や書籍などに豊富に情報があることです。後述するとおり、PADからADOを使用する方法はVBAからADOを使用する方法とほとんど同じです。

 題材として、上図のようなテーブルから、市町村コードを元に人口数を取得することを考えてみましょう。準備として、市町村コードをPADの変数「CityCode」に、Accessファイルのパスを変数「FilePath」に格納しておきます。なお変数CityCodeを強制的にテキスト型にするために、初期値として代入する値は「%’131032’%」と記述しています(単に「131032」とすると数値型変数が作られてしまいます。ちなみに131032は東京都港区の自治体コード)。

 PADでADO接続を利用する際は、「VBScriptの実行」アクションを使用します。前回の記事 で書いたとおり、%~%の中にPADの変数名(ここでは「FilePath」と「CityCode」)を記述することで、PAD変数の値をVBScriptに引き渡すことができます。また、「WScript.Echo」の後に記述した値は、指定したPAD変数(本件では「VBScriptOuput」)に格納されます。

Set cn = CreateObject("ADODB.Connection")
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%FilePath%;" 
Set rs = CreateObject("ADODB.Recordset")

strSQL = "SELECT 市町村マスタ.人口数" _
 & " " & "FROM 市町村マスタ" _
 & " " & "WHERE (((市町村マスタ.[コード])='%CityCode%'));"

rs.Open strSQL, cn
WScript.Echo rs.Fields("人口数").Value
cn.Close

 上記のVBScriptコードのうち青字の部分は、どんな処理内容であっても毎回同じなので、コピペしてお使いください。一方、途中のSQL部分(赤字の部分)は、毎回変わる箇所になります。「SQLなんて書けない…」とお思いの方もおられるかもしれませんが、ご安心ください。Accessのクエリさえ作れば、AccessがSQLに翻訳してくれるのです。

Accessが翻訳してくれたSQLを使う

 では実際に、Accessのクエリを元に、上記のVBScriptコードの中に記述されているSQL構築の部分を作ってみましょう。このクエリは、与えられた市町村コードを元にして該当自治体の人口数を取得する選択クエリです。とりあえず市町村コードは「131032」にしてみましょう。Accessのクエリデザイン画面でクエリを作ると、下左図のようになります。ここで表示を「デザインビュー」から「SQLビュー」に切り替えると、Accessが翻訳してくれたSQLを見ることができます(下右図)。上記のVBScriptコード中のSQL(赤字部分)には、このSQLビューの値をそのまま用いることができるのです(市町村コードの部分だけは変数名に置き換えてください)。

実行してみよう

 以上のようにして作成したVBScriptコードを、「VBScriptの実行」アクションのコード欄に貼り付けてフローを実行してみましょう。下左図のようにPAD変数「VBScriptOutput」に東京都港区の人口が取得されており、Accessクエリの実行結果と一致していることがわかります。

Accessから取得した値をリストに格納する

 上記の例は、「指定した自治体の人口」という一つの値を取得するものでした。一方で実務では、一定条件を満たすリストをAccessから取得するというニーズもあるかと思います。VBScriptでAccessから取得したリストを、PADのリスト型変数に格納する場合は、Accessから取得したリストを、区切り記号(デリミタ)を用いて文字列化してPADに引き渡し、PADの「テキストの分割」アクションでリスト型変数に格納する、という手順がお手軽です。

 例として、先ほどのAccessテーブルから「人口3,000人未満の自治体の自治体コード」を取得することを考えてみましょう。Accessのクエリと、それをAccessが翻訳してくれたSQLは、下図のようになります。

 このSQLを取り込んだVBScriptコードは下記のとおりです。青字の部分で、Accessから取得したリストの値を結合してtmpという文字列変数に格納しています。

Set cn = CreateObject("ADODB.Connection")
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%FilePath%;" 
Set rs = CreateObject("ADODB.Recordset")

strSQL = "SELECT 市町村マスタ.[コード]" _
 & " " & "FROM 市町村マスタ" _
 & " " & "WHERE (((市町村マスタ.人口数)<3000));"

rs.Open strSQL, cn

tmp = ""
Do Until rs.EOF
    tmp = tmp & " " & rs.Fields("コード").Value
    rs.MoveNext
Loop

WScript.Echo LTrim(tmp) '先頭のスペースを削除したうえで戻り値にする
cn.Close

 最初の例と同じようにVBScriptの実行結果をPAD変数「VBScriptOutput」で受け取り、これを「テキストの分割」アクションでリスト型変数に格納すれば完了です。

 ちなみにこの例では、VBScriptコードの中で区切り記号にスペースを使用しましたので、「テキストの分割」アクションでも区切り記号としてスペースを指定することになります。

 実行してみると下図のように、取得した値がPADのリスト型変数に格納されます。


 今回ご紹介した手法は、ExcelVBAなどからAccessデータを利用する手法と同じですので、VBAの参考書やネット記事なども見ながら色々と試してみてください。

 Power Automate Desktopの無償提供開始により、RPAツール活用の自由度は大きく広がりました。コトラでは自社内でも、Power Automate Desktopを含む様々なソリューションを活用して、業務の効率化を積極的に推進しています。

 組織の業務効率化・DX化でお困りのことがございましたら、経験豊富な担当者がご相談に乗らせて頂きます。
お気軽にお問い合わせください!

サービスに関する質問、その他疑問・お問い合わせなど
お気軽にお寄せください!

毎月5社限定
Salesforce無料相談会

Salesforce無料相談会を実施しております。
「Salesforce導入を検討している」
「導入したが定着しなくて困っている」
「いまいち使いこなせておらず、もっと活用したい」
そんなお悩みをお抱えの方は、お気軽にお申し込みください。

この記事を書いた人

礒村 隆広

礒村 隆広

東京大学法学部卒、メガバンクでの26年間の勤務中、22年にわたり主計業務 (法人税務、米国会計基準決算等)に従事するとともに、ICT利活用による業務改善・効率化を推進。