ITPowerShellでADO経由でMS-Accessのデータを扱うPowerShellを使ってAccessに接続する情報が意外と少なかったので書き留めておきます。基本的なアクセスの仕方から、クエリの呼び出し方、Excelへのデータの吐き出し方などを書いておきます。MS-AccessはSQL文をガリガリ書かなくても、データベースにアクセスできるのが楽でSE現場にいた頃良く使っていました。今回はPowerShellを使ってAccess処理を自動化してみよう、という試み。目次PowerShellからアクセスへのコネクションを作るデータを呼び出すパラメータを使ってクエリを参照するExcelと連携するPowerShellからアクセスへのコネクションを作る2018年にもなってmdb形式を使ってる人もそういないんじゃないかと思うので、accdbファイルを前提に話を進めます。この場合、ADOのConnectionオブジェクトを使ってコネクションを作ります。ADODB.ConnectionでComObjectを作ります。ADODB.ConnectionConnectionオブジェクトはConnectionStringが必要なので、対象のアクセスファイルへの接続文字列を設定してやります。$AccessPath"このConnectionStringを使ってコネクションをオープンします。MSDNデータを呼び出すAccessでは、Recordsetオブジェクト単位でデータを呼び出します。書籍の貸出簿がAccessに入っていて、貸出状況を読み込むとしてみましょう。$adLockOptimistic)Recordsetには返ってきたレコードのなかでどこを参照しているかっていうCurrentRecord(現在位置)の概念があります。それをどう参照するかというのでいくつか種類があります。呼び出した時点でのデータのみ。新規追加、変更、および削除を反映する。・レコードを読み込んでる間、他のユーザが読み込めるか・更新できるかなどの動作が変わるこのあたりの指定はVBの定数で行うのですが、外部で使おうとすると定数が設定されてないので、指定する必要があるらしいです。今回は下記2つを指定します。3ADOのRecordsetオブジェクトのパラメータとして指定できそうなのですが、試せてないので割愛。ここまでで貸出簿を読み込めたので、Title,所属,名前を抽出して画面に表示してみます。$rs.Fields.Item("名前").Value$rs.MoveNext()}処理が終わったら後片付けをしましょう。-MSDNパラメータを使ってクエリを参照する貸出簿からある一定期間に借りている人数の推移を見ることにするとします。日毎に借りられているか推移をだすというのを例にします。貸出簿には、貸出日と返却日があります。日付をパラメータで外から与えてやるとすると、ある日付に借りられていた一覧をだすには下記の条件で抽出すれば出せます。NullSQLで特定時点の貸出人数を出すクエリを組むのは簡単なのですが、推移を出そうとすると、日付を指定してLoopで回す必要があります。Loopは次の節で説明することにして、クエリのパラメータ付呼び出しを先に説明します。[日付]をパラメータで外部から与えるクエリを作って、外からパラメータを与えてPowershell上で回してみましょう。クエリを直接呼び出す場合は、ADOのCommandオブジェクトを使います。具体的には下記の3つでパラメータ付きクエリを呼び出せます。・CommandTypeはテーブルにする。クエリはオブジェクト的にはテーブルと同じなので、テーブルとしてデータを読み出してやれば、Recordsetが取り出せます。・CommandTextプロパティにクエリ名を入れる。・Commande.Parametersプロパティに、[日付]を代入する。255)$cmd.Parameters.Append($param)なんとなくわかってもらえれば...(汗)Excelと連携する次にLoopで回しつつExcelに集計表を出す、ということをしてみます。PowerShellでExcelを扱うことについては、別記事を参照ください。PowerShellでExcelを扱う貼り付ける先のExcelにAccessクエリと同名のシートを用意して呼び出します。(ヘッダが設定済みの集計表表示用のフォーマットです。=$Book.Worksheets.Item($集計表)ExcelのRangeオブジェクトのCopyFromRecordsetメソッドを呼び出すと、そのRangeにRecordsetの内容が貼り付けできます。2017年度の毎月月初日について、12ヶ月間出力しようとすると、こんな感じ。#For文ここまで貼り付けるとRecord数が返ってくるので、貼り付ける場所をコントロールする為に変数に格納してLoopを回してます。いろんなデータベースが無料で使えるようになってきてるので、Accessを使う人も減ってきてるかなぁ、とは思いますがExcel,Access連携みたいなOfficeアプリ横断作業を.Netで自動化できるのはメリットかなぁと思いました。RPAが大流行ですが、Windowsの中に閉じた自動化ならPowerShellで充分なんじゃないかと思いますねー。accdbじゃなくて、mdbを扱いたいというレガシー資産をお持ちの方はこちらを参照してみてください。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。technology.。