小ネタ:パスワード付きのAccessに接続する|Power Query


2020/9/22:おまけ2:AdoDotNet.Query関数を追加しました。
※もともと、コメントに入れてました。

OLE DB、Accessになじみのある方には秒殺だと思いますが、僕は発想もなかったので書き残しておきます。
恐らく、OLE DB接続の方でパスワード処理に対応している接続先には、同じ手口が使えるのではないかと思います。

読み取るaccdbについて

Accessのパスワードといっても、2種類あって、「以前の暗号化方式」でないとだめなのです。
「以前の暗号化方式」というのは下記のAccessのオプションにて設定します。

接続例

GUIの呼び出しは下記の画面から。接続文字列をそのまま貼りたい場合はその方が便利でしょう。

僕は接続文字列自体に不慣れだったので、レコード型で探り探り書いたところ、下記ようなコードになりました。
この例でのパスワードは「abc」です。

let
    Source = OleDb.Query(
                    //いわゆる接続文字列。伝統的な、セミコロン区切りの文字列でも通ります。
                    [
                      Provider="Microsoft.ACE.OLEDB.12.0",
                      Data Source="C:\Users\Public\Documents\TestDatabase.accdb",
                      #"Jet OLEDB:Database Password" ="abc"
                    ],
                    //SQLを記述。下記程度のは通りました。文字列はシングルクウォートで。
                    "SELECT 仕訳帳.借方, Sum(仕訳帳.金額) AS 金額の合計
                     FROM 仕訳帳
                     WHERE 仕訳帳.日付<=#2015/12/31# AND 仕訳帳.借方>='500'
                     GROUP BY 仕訳帳.借方;
                    "
             )
in
    Source

一応、実行結果。データ型はAccessの通りですね。

テスト環境

  • Office365のExcel(バージョン1911 ビルド12228.20250クイック実行)
  • 同じくAccess

なお、下記をインストール済みです。PowerShellからADO.NETで接続するのには必要だったので、入れていました。本件には必須ではないかもしれません。
Download Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント from Official Microsoft Download Center

おまけ:パスワードつきのExcelはどうなのか。

パスワードをクエリに入れとけば、接続できる――という例にはいまだお目にかかったことがありません。
調べた限り、OLE DBでもできないようです。
なので、現状は、VBAか何かで読み取り対象のブックを開いた状態で、クエリを実行するしかないようです。
ちなみに、Excelの書き込み専用パスワードだけなら、Power Queryは普通に接続できます。

おまけ2:AdoDotNet.Query関数

Oledb.Query関数のみならず、こちらでも同様にパスワード付きのaccdbにアクセス可能です。
.NET Frameworkプロバイダの指定が増えるだけで、connectionString引数は上記の例と同様です。
当方、.NET Frameworkに詳しくないので、こちらを経由させる利点はよく分かりません。(検証も浅いです)

= AdoDotNet.Query("System.Data.OleDb",
                [
                 Provider ="Microsoft.ACE.OLEDB.12.0",
                 #"Data Source"="C:\Users\Public\Documents\TestDatabase.accdb",
                 #"Jet OLEDB:Database Password" ="abc"
                ],
              "SELECT * FROM t_単価")

参考
AdoDotNet.Query - PowerQuery M - Microsoft Docs
ヒントが少なく、例すらないのは、使おうと思うような人ならどうせ知っているだろう、ということなのでしょうか。.NET Frameworkに親しんでいる人ならできるんでしょうけども…。

.NET Framework データ プロバイダー - ADO.NET | Microsoft Docs