Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

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

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

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

読み取るaccdbについて

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

接続例

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

僕は接続文字列自体に不慣れだったので、レコード型で探り探り書いたところ、下記ようなコードになりました。
この例でのパスワードは「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の通りですね。
image.png

テスト環境

  • 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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What are the problem?