Accessのレポートオブジェクト内のコントロールの値を変更したいって思うことがあると思います。
でも手動で変更するのは、変更する対象が多いと大変で面倒です。
そんなときは、当記事のサンプルコードをコピペして利用することで、簡単かついっぺんに値を変更できます。
サンプルコードは、私自身が作成したオリジナルのプログラムです。
定数は大文字じゃないといった皆さん自身のルールがあるかもしれませんがご理解ください。
当記事は、実践編としてVBScriptの基本的な文法がわかる中級者の方にご紹介しています。
基本的な文法がわからない方は、初級編の記事も紹介しているのでそちらを参考にしてください。
各コントロールの値を変更する
サンプルコード
'【定数】
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.GetAbsolutePathname(".") & "\"
'Accessフルパス
Dim PATH_FULL_MDB : PATH_FULL_MDB = PATH_DIR_VBS & "TestVBS.mdb"
'後始末
Set objFso = Nothing
'Accessを作成
Dim objAccess : Set objAccess = CreateObject("Access.Application")
'Accessを非表示に設定
objAccess.Visible = false
'Accessを開く
objAccess.OpenCurrentDatabase PATH_FULL_MDB
'レポートオブジェクト分ループする
For Each report In objAccess.CurrentProject.AllReports
'レポート名取得
Dim strReportNm : strReportNm = report.Name
'レポートが更新されたか判定するフラグ
Dim isSave : isSave = false
'対象レポートを非表示で開く
objAccess.Docmd.OpenReport strReportNm,1,,,1
'レポートのコントロール数分ループ
For Each control In objAccess.Reports(strReportNm).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 acReport, strReportNm, acSaveYes
Else
'レポートを保存せずに閉じる
objAccess.DoCmd.Close acReport, strReportNm, acSaveNo
End If
Next
'Accessを閉じる
objAccess.Quit
'後始末
Set objAccess = Nothing
解説①:定数の宣言
DoCmdのCloseメソッドで使用する引数、コントロールの種類を表す数値、置換対象の値、置換後の値を定数にしています。
定数にすることで、置換対象の値や置換後の値を他の値に変更したい場合に容易に変更でき、改修の負担が減ります。
定数ではなく、配列やファイルから置換データを取得することで複数の値を置換することも可能です。
解説②:置換対象であるAccessファイルのパスを取得する
当記事のサンプルコードでは、Accessファイルはvbsファイルと同等のフォルダーにあることにしています。
そのため、vbsファイルのフォルダーパスを取得していきます。
ファイルシステムオブジェクトを作成し、GetAbsolutePathnameメソッドにより、フォルダーパスを取得できます。
解説③:レポートオブジェクトの取得とコントロールの種類について
レポートオブジェクト内のすべてのコントロールは、「[作成したAccessオブジェクト].Reports([レポート名]).Controls」で取得できます。
取得したコレクションは、for each文でループさせることにより、1つずつコントロールを取得します。
取得したコントロールは、ControlTypeプロパティでコントロールの種類を取得します。
取得できるコントロールは、下記の種類が存在します。
種類 | Name値 | TypeName関数 | 定数名 | ControlType値 |
---|---|---|---|---|
ラベル※1 | ラベル | Label | acLabel | 100 |
四角形 | ボックス | Rectangle | acRectangle | 101 |
直線 | 直線 | Line | acLine | 102 |
イメージ | イメージ | Image | acImage | 103 |
コマンドボタン | コマンド | CommandButton | acCommandButton | 104 |
オプションボタン | オプション | OptionButton | acOptionButton | 105 |
チェックボックス | チェック | CheckBox | acCheckBox | 106 |
オプショングループ | フレーム | OptionGroup | acOptionGroup | 107 |
連結オブジェクトフレーム | 連結 | BoundObjectFrame | acBoundObjectFrame | 108 |
テキストボックス | テキスト | TextBox | acTextBox | 109 |
リストボックス | リスト | ListBox | acListBox | 110 |
コンボボックス | コンボ | ComboBox | acComboBox | 111 |
サブフォーム/サブレポート | 埋め込み | SubForm | acSubForm | 112 |
グラフ | グラフ | ObjectFrame | acGraph | 113 |
非連結オブジェクトフレーム | 非連結OLE | ObjectFrame | acObjectFrame | 114 |
改ページ | 改ページ | PageBreak | acPageBreak | 118 |
ActiveXコントロール | ButtonBarなど | CustomControl | acCustomControl | 119 |
トグルボタン | トグル | ToggleButton | acToggleButton | 122 |
タブコントロール | タブ | TabControl | acTabControl | 123 |
ページ | ページ | Page | acPage | 124 |
空白セル | 空白セル | EmptyCell | acEmptyCell | 127 |