はじめに
マイクロソフトが今年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化でお困りのことがございましたら、経験豊富な担当者がご相談に乗らせて頂きます。
お気軽にお問い合わせください!
お気軽にお寄せください!