VBScriptでAccessのマクロ内に変更したい値が存在するか確認するサンプルコード

VBScript

Accessのマクロ内の値を変更したいって思うことがあると思います。

でも手動で変更するのは、変更する対象が多いと大変で面倒です。

VBSでマクロの値の変更は、できません。

しかし、当記事のサンプルコードをコピペして利用することで、簡単かついっぺんに該当の値が存在するか確認することができます。

サンプルコードは、私自身が作成したオリジナルのプログラムです。

定数は大文字じゃないといった皆さん自身のルールがあるかもしれませんがご理解ください。

当記事は、実践編としてVBScriptの基本的な文法がわかる中級者の方にご紹介しています。

基本的な文法がわからない方は、初級編の記事も紹介しているのでそちらを参考にしてください。

マクロの値をチェックする

サンプルコード

'【定数】
Const acMacro = 4
Const ForReading = 1
Const TristateFalse = 0
Const REPLACE_MAE = "置換前"

'ファイルシステムオブジェクト作成
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 & "Macro.mdb"
'一時ファイルフルパス
Dim PATH_FULL_WORK : PATH_FULL_WORK = PATH_DIR_VBS & "work.txt"

'Accessを作成
Dim objAccess : Set objAccess = CreateObject("Access.Application")
'Accessを非表示に設定
objAccess.Visible = false
'Accessを開く
objAccess.OpenCurrentDatabase PATH_FULL_MDB

'マクロの数だけループする
Dim strMsg : strMsg = "マクロ" & vbCrLf
For Each macro In objAccess.CurrentProject.AllMacros
	'マクロ名取得
	Dim strMacroNm : strMacroNm = macro.Name
	'一時ファイルにマクロの内容を保存
	objAccess.SaveAsText acMacro, strMacroNm, PATH_FULL_WORK
	'一時ファイルを開く(読み取り専用、ファイルが存在無しの場合作成、Ascii)
	Dim objWork : Set objWork = objFso.OpenTextFile(PATH_FULL_WORK,ForReading,True,TristateFalse)
	'一時ファイル内の全データをセット
	strTmp = objWork.ReadAll
	'後始末
	Set objWork = Nothing
	'マクロ内に置換対象の文字が存在するかチェック
	If InStr(strTmp, REPLACE_MAE) > 0 Then
		strMsg = strMsg & "【" & strMacroNm & "】" & vbCrLf
    Else
    End If
    '一時ファイル削除
    objFso.DeleteFile PATH_FULL_WORK
Next
'ログを出力する
If InStr(strMsg, "【") > 0 Then
	Msgbox strMsg & "に置換対象の文字が存在します。"
Else
End If

'Accessを閉じる
objAccess.Quit
'後始末
Set objAccess = Nothing
Set objFso = Nothing

解説①:定数の宣言

一時的なファイルを開く時の引数、置換対象の値、置換後の値を定数にしています。

定数にすることで、置換対象の値や置換後の値を他の値に変更したい場合に容易に変更でき、改修の負担が減ります。

定数ではなく、配列やファイルから置換データを取得することで複数の値を置換することも可能です。

解説②:置換対象であるAccessファイルのパスを取得する

Accessファイルは、vbsファイルと同等のフォルダーにあることにしています。

そのため、vbsファイルのフォルダーパスを取得していきます。

ファイルシステムオブジェクトを作成し、GetAbsolutePathnameメソッドにより、フォルダーパスを取得しています。

解説③:マクロの取得

「[開いたAccess].CurrentProject.AllMacros」の部分でAccess内のマクロを取得することができます。

取得した複数のマクロは、For Each文で1つずつ取得しましょう。

「macro.Name」で取得したマクロの名前を取得しています。

解説④:マクロビルダーで作成されたマクロに置換対象の文字が存在したら通知する

「[開いたAccess].SaveAsText acMacro, [マクロ名], [ファイルのフルパス]」の部分で一時的なファイルにマクロの内容を保存します。

引数が「一時的なファイルのフルパス、読み取り専用、一時的なファイルが存在しない場合は新しいファイルを作成する、Asciiの文字コードでファイルを開く」を渡したOpenTextFileメソッドを実行し、一時的なファイルを開いたオブジェクトを作成します。

一時的なファイルを開いたオブジェクトのReadAllプロパティでファイル内の文字を取得します。

取得したファイル内の文字をInstr関数で置換対象の文字が含まれているかチェックし、含まれていたらマクロ名を保持しています。