VBScriptでAccessのフォーム内の値を簡単に変更するには

VBScript

Accessのフォームオブジェクト内のコントロールの値を変更したいって思うことがあると思います。

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

そんなときは、当記事のサンプルコードをコピペして利用することで、簡単かついっぺんに値を変更できます。

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

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

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

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

各コントロールの値を変更する

サンプルコード

Const acDesign = 1
Const acFormReadOnly = 2
Const acHidden = 1
Const acForm = 2
Const acSaveYes = 1
Const acSaveNo = 2
Const acReport = 3
Const acLabel = 100
Const acRectangle = 101
Const acLine = 102
Const acImage = 103
Const acCommandButton = 104
Const acOptionButton = 105
Const acCheckBox = 106
Const acOptionGroup = 107
Const acBoundObjectFrame = 108
Const acTextBox = 109
Const acListBox = 110
Const acComboBox = 111
Const acSubForm = 112
Const acGraph = 113
Const acObjectFrame = 114
Const acPageBreak = 118
Const acCustomControl = 119
Const acToggleButton = 122
Const acTabCtl = 123
Const acPage = 124
Const acEmptyCell = 127
Const REPLACE_MAE = "置換前"
Const REPLACE_ATO = "置換後"

'ファイルシステムオブジェ作成
Dim objFso : Set objFso = CreateObject("Scripting.FileSystemObject")
'vbsフォルダーパス
Dim PATH_DIR_VBS : PATH_DIR_VBS = objFso.GetParentFolderName(WScript.ScriptFullName) & "\"
'Accessフルパス
Dim PATH_FULL_MDB : PATH_FULL_MDB = PATH_DIR_VBS & "Forms.mdb"
'後始末
Set objFso = Nothing

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

'フォームオブジェクト分ループする
For Each form In objAccess.CurrentProject.AllForms
	'フォーム名取得
	Dim strFormNm : strFormNm = form.Name
	'フォームが更新されたか判定するフラグ
	Dim isSave : isSave = false
	'対象フォームを非表示で開く
	objAccess.Docmd.OpenForm strFormNm,acDesign,,,acFormReadOnly,acHidden
	'フォームのコントロール数分ループ
	For Each control In objAccess.Forms(strFormNm).Controls
		'次のコントロールへ進むか判定するフラグ
		Dim isContinue : isContinue = false
		'コントロールの種類を取得
		Dim strType : strType = control.ControlType
		'コントロールのプロパティの値をセット
		Select Case strType
			Case acLabel,acCommandButton,acToggleButton
				strControl = control.Caption
			Case acOptionButton,acCheckBox,acOptionGroup,acBoundObjectFrame,acTextBox
				strControl = control.ControlSource
			Case acRectangle,acLine,acImage,acSubForm,acObjectFrame,acPageBreak,acCustomControl,acTabCtl,acPage,acEmptyCell
				strControl = control.Name
			Case acListBox,acComboBox,acGraph
				strControl = control.RowSource
			Case Else
				isContinue = True
		End Select
		'対象外のコントロールの場合、次のコントロールへ
		If isContinue = false Then
			'コントロールの値に置換前の値が含まれるかチェック
			If Instr(strControl,REPLACE_MAE) > 0 Then
				'置換処理
				strControlNew = Replace(Trim(strControl),REPLACE_MAE,REPLACE_ATO)
				'置換に成功した場合にコントロールに反映
				If strControl <> strControlNew Then
					isSave = True
					Select Case strType
						Case acLabel,acCommandButton,acToggleButton
							control.Caption = strControlNew
						Case acOptionButton,acCheckBox,acOptionGroup,acBoundObjectFrame,acTextBox
							control.ControlSource = strControlNew
						Case acRectangle,acLine,acImage,acSubForm,acObjectFrame,acPageBreak,acCustomControl,acTabCtl,acPage,acEmptyCell
							control.Name = strControlNew
						Case acListBox,acComboBox,acGraph
							control.RowSource = strControlNew
						Case Else
					End Select
				Else
				End If
			Else
			End If
		Else
		End If
	Next
	'フォームが更新されたか
	If isSave = True Then
		'保存して閉じる
		objAccess.DoCmd.Close acForm, strFormNm, acSaveYes
	Else
		'保存せずに閉じる
		objAccess.DoCmd.Close acForm, strFormNm, acSaveNo
	End If
Next

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

解説①:定数の宣言

DoCmdのOpenFormとCloseメソッドで使用する引数、コントロールの種類を表す数値、置換対象の値、置換後の値を定数にしています。

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

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

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

当記事のサンプルコードでは、Accessファイルはvbsファイルと同等のフォルダーにあることにしています。

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

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

解説③:フォームオブジェクトの取得とコントロールの種類について

フォームオブジェクト内のすべてのコントロールは、「[作成したAccessオブジェクト].Forms([フォーム名]).Controls」で取得できます。

取得したコレクションは、for each文でループさせることにより、1つずつコントロールを取得します。

取得したコントロールは、ControlTypeプロパティでコントロールの種類を取得します。

取得できるコントロールは、下記の種類が存在します。

種類Name値TypeName関数定数名ControlType値
ラベル※1ラベルLabelacLabel100
四角形ボックスRectangleacRectangle101
直線直線LineacLine102
イメージイメージImageacImage103
コマンドボタンコマンドCommandButtonacCommandButton104
オプションボタンオプションOptionButtonacOptionButton105
チェックボックスチェックCheckBoxacCheckBox106
オプショングループフレームOptionGroupacOptionGroup107
連結オブジェクトフレーム連結BoundObjectFrameacBoundObjectFrame108
テキストボックステキストTextBoxacTextBox109
リストボックスリストListBoxacListBox110
コンボボックスコンボComboBoxacComboBox111
サブフォーム/サブレポート埋め込みSubFormacSubForm112
グラフグラフObjectFrameacGraph113
非連結オブジェクトフレーム非連結OLEObjectFrameacObjectFrame114
改ページ改ページPageBreakacPageBreak118
ActiveXコントロールButtonBarなどCustomControlacCustomControl119
トグルボタントグルToggleButtonacToggleButton122
タブコントロールタブTabControlacTabControl123
ページページPageacPage124
空白セル空白セルEmptyCellacEmptyCell127
※1 ハイパーリンクオブジェクトも含まれる