困っていたこと
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」みたいなキーワードでググると情報が出てくると思います。