VBScriptでAccessのモジュール内の値を変更するサンプルコード

VBScript

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 & "Module.mdb"
'後始末
Set objFso = Nothing

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

'モジュールの数だけループする
For Each module In objAccess.CurrentProject.AllModules
	'モジュール名取得
	Dim strModuleNm : strModuleNm = module.Name
	'コードのオブジェクトを取得
	With objAccess.Application.VBE.ActiveVBProject.VBComponents(strModuleNm).CodeModule
		'標準モジュールまたはクラスモジュール内の行数分ループ
		For i = 1 To .CountOfLines
			'コードの行を取得
			line = .Lines(i,1)
			'コードの行に置換前の文字が含まれるかチェック
			If InStr(line,REPLACE_MAE) > 0 Then
				'置換
				.ReplaceLine i,Replace(line,REPLACE_MAE,REPLACE_ATO)
			Else
			End If
		Next
	End With
Next

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

解説①:定数の宣言

置換対象の値、置換後の値を定数にしています。

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

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

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

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

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

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

解説③:モジュールの取得

「[開いたAccess].CurrentProject.AllModules」の部分で標準モジュールとクラスモジュールを取得することができます。

取得した複数のモジュールは、For Each文で1つずつ取得しましょう。

「module.Name」で取得したモジュールの名前を取得しています。

解説④:コード内の値を置換する

「[開いたAccess].Application.VBE.ActiveVBProject.VBComponents([モジュール名]).CodeModule」の部分でモジュールを開いています。

「[開いたモジュール].CountOfLines」でモジュール内の全行数を取得しています。

「module.Name」で取得したモジュールの名前を取得しています。

For文で全行数文ループしますが、このときのインデックスの変数「i」は、1行目から置換する場合は値を1にしてください。2行目からなら変数「i」は2、3行目からなら変数「i」は3・・・としてください。

このサンプルでは、1行目から最終行までチェックし、置換しています。

Linesプロパティの引数1は開始する行番号を指定し、引数2が引数1から何行取得するかを指定します。

このサンプルでは、1行ずつ取得していますが、「.Lines(1,.CountOfLines)」で全行取得することも可能です。

ReplaceLineメソッドの引数1は置換する行番号を指定し、引数2に置き換える文字を指定します。