Accessのクエリ内の値を変更したいって思うことがあると思います。
でも手動で変更するのは、変更する対象が多いと大変で面倒です。
そんなときは、当記事のサンプルコードをコピペして利用することで、簡単かついっぺんに値を変更できます。
サンプルコードは、私自身が作成したオリジナルのプログラムです。
定数は大文字じゃないといった皆さん自身のルールがあるかもしれませんがご理解ください。
当記事は、実践編としてVBScriptの基本的な文法がわかる中級者の方にご紹介しています。
基本的な文法がわからない方は、初級編の記事も紹介しているのでそちらを参考にしてください。
各クエリの値を変更する
サンプルコード
'【定数】
Const REPLACE_MAE = "置換前"
Const REPLACE_ATO = "置換後"
'ファイルシステムオブジェクト作成
Dim objFso : Set objFso = CreateObject("Scripting.FileSystemObject")
'vbsフォルダーパス
Dim PATH_DIR_VBS : PATH_DIR_VBS = objFso.GetAbsolutePathname(".") & "\"
'Accessフルパス
Dim PATH_FULL_MDB : PATH_FULL_MDB = PATH_DIR_VBS & "Query.mdb"
'後始末
Set objFso = Nothing
'Accessを作成
Dim objAccess : Set objAccess = CreateObject("Access.Application")
'Accessを非表示に設定
objAccess.Visible = false
'Accessを開く
objAccess.OpenCurrentDatabase PATH_FULL_MDB
'クエリの数だけループする
For Each querie In objAccess.CurrentData.AllQueries
'クエリ名取得
Dim strQueryNm : strQueryNm = querie.Name
'クエリに置換前の文字が含まれるかチェック
If InStr(objAccess.CurrentDb().QueryDefs(strQueryNm).SQL,REPLACE_MAE) > 0 Then
'置換
objAccess.CurrentDb().QueryDefs(strQueryNm).SQL = Replace(objAccess.CurrentDb().QueryDefs(strQueryNm).SQL,REPLACE_MAE,REPLACE_ATO)
Else
End If
'クエリを閉じる
objAccess.CurrentDb().QueryDefs(strQueryNm).Close()
Next
'Accessを閉じる
objAccess.Quit
'後始末
Set objAccess = Nothing
解説①:定数の宣言
置換対象の値、置換後の値を定数にしています。
定数にすることで、置換対象の値や置換後の値を他の値に変更したい場合に容易に変更でき、改修の負担が減ります。
定数ではなく、配列やファイルから置換データを取得することで複数の値を置換することも可能です。
解説②:置換対象であるAccessファイルのパスを取得する
Accessファイルは、vbsファイルと同等のフォルダーにあることにしています。
そのため、vbsファイルのフォルダーパスを取得していきます。
ファイルシステムオブジェクトを作成し、GetAbsolutePathnameメソッドにより、フォルダーパスを取得しています。
解説③:クエリの取得
「[開いたAccess].CurrentData.AllQueries」の部分でAccess内のすべてのクエリを取得することができます。
取得した複数のクエリは、For Each文で1つずつ取得しましょう。
「querie.Name」で取得したクエリの名前を取得しています。
解説④:クエリの値を置換する
「[開いたAccess].CurrentDb().QueryDefs([クエリ名]).SQL」の部分でクエリのSQLを取得または設定が可能です。
置換前の値が含まれていたら、置換後の値でSQL内を置き換える処理を行っています。