1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

VBScriptからAccessDatabaseFileにアクセスしたいときのコード例

Posted at

困っていたこと

2021年も三分の一が終わりつつある昨今ですが、こんな時代にもかかわらずへーしゃではVBScriptでAccessのファイルをこちょこちょしたいみたいな話が出てきました。

で、色々とインターネットの海をさまよったのですが
「ADODBで接続文字列を組み立てて繋ごう」
「ODBCドライバつかって接続文字列で…」みたいな例が目立って散見されました。

接続文字列も別に悪くは無いんですが、嬉しくない点があります。

次の様な例で接続文字列を定義してやる必要があって、バージョンを明示してあげないとダメなんですよね…

接続文字列の例
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ファイルパス & ";"

どちらかというとアプリケーションとしてAccess呼び出してそのAccessアプリケーションとやりとりできたらいいんじゃないの?という気がしていたのですが、綺麗にそれを実現したコード例がなかったので色々試した結果、意外に簡単にできる事が判明しました。

以下にコード例を置いておきます。

コード例

VBSのファイルにドラッグアンドドロップしたり、送る(SendTo)に入れてAccessファイル(accdb、accdeとかmdbの拡張子になっているファイル)に対し、使うイメージで作っています。

コード例
Option Explicit

Sub Main()
    Dim objAccessAppli
    Dim objAccessDB
    Dim objAccessRS
    Dim AccessSQL
    Dim hogehoge_str
    Dim objFSO

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' 起動時各種チェック
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '起動時引数チェック
    if Wscript.Arguments.Count <> 1 then
        msgbox "リリースするaccessファイルをこのスクリプトに送って下さい。" & vbcrlf _
             & "処理を終了します。"
        WScript.Quit
    end if

    Set objFSO = CreateObject("Scripting.FileSystemObject")

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' Accessファイルオープン
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Set objAccessAppli = CreateObject("Access.Application")

    objAccessAppli.Visible = False
    objAccessAppli.AutomationSecurity = 1   'Accessのセキュリティダイアログ抑止

    objAccessAppli.OpenCurrentDatabase(Wscript.Arguments(0))
    set objAccessDB = objAccessAppli.CurrentDb()

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' AccessファイルからSelectする
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    set objAccessRS = objAccessDB.OpenRecordset("Select * From hogehogetable;")

    hogehoge_str = objAccessRS.Fields("hogehoge")

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' AccessファイルにVersionを格納する
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    AccessSQL = "UPDATE hogehogetable"
    AccessSQL = AccessSQL & " SET hogehoge = 'hogehoge';"
    objAccessDB.Execute(AccessSQL)

    objAccessAppli.CloseCurrentDatabase()
    objAccessAppli.quit

    objAccessDB.Close()
    set objAccessDB = nothing
    set objAccessAppli = nothing

End Sub

call Main()

補足

恐らくですが、ExcelVBAとかからAccessに繋ぎたい場合なども同様のコードで対応できると思います。
(Accessのアプリケーションがばーん!と上がってくるのが良いかどうかという問題は別途ありますが。)

なお、インターネットに散見される記事について。あまり明示的に書かれていなかった様な気がするので記載しておくと、Accessのオブジェクトモデル(≒データベースエンジン)に対して直接処理をするときは、昔のVB6とかの時代にあったDAO(Data Access Object)というライブラリがベースになっているはずで、今はADOという別のライブラリが主流なので狙って情報を探さないと探せないし、よくわからんなーってなってる人が多い印象です。

普通に「DAO」でググるとデザインパターンの方のDAOばっかり情報として引っかかるので、「DAO microsoft」みたいなキーワードでググると情報が出てくると思います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?