Streamlining Form Module Code in Standalone Class Module.
Class Module Template Creation Wizard V2.
The earlier version of the Class Module Wizard was a testing platform for creating Wrapper Class Module templates. Although it served its purpose, the procedure adopted there is somewhat semi-automatic, and I am not satisfied with that either.
This improved Version 2.0 of the Wizard can create several Class Module Templates for different Object Types in your form. This Version creates approximately 10 frequently used Object Wrapper Class Module Templates based on your selection at a time.
The Screenshot of the Class Template Wizard is given below:
The ListBox's Source Data is from the 'ListItems' Table. The Source Table Image is given below.
The Table has ten Records with six columns of data, but only the first three columns are shown on the ListBox.
(1) The RecordID - for easier retrieval of Wizard Function Parameters.
(2) The Field/Control list File Name for creating on Disk - The files will be created in the Current Project Folder.
(3) The Class Module Template Name - suffixed with the word '_Template' is preferred, not mandatory.
The following three Columns of data are used by the Wizard.
(4) The Wizard Function that creates the Class Template - Applicable for all Types of Objects.
(5) The Object TypeName - self-explanatory.
(6) Object Short Name - you may change it to a more descriptive Name if required.
How to Run the WrapperClassWizard from within a Database?
Place the WrapperClass_Wizard.accdb database into a Trusted Folder.
Open your Database and open the VBE Window.
Select References... from the Tools menu, find the Wizard Database, attach, and select to add it to the selected List of Library Files.
Create a SELECT Query in your Project with the name ListItemsQ using the following SQL:
SELECT ListItems.* FROM ListItems IN 'D:\DEMO\Code2\WrapperClass_Wizard.accdb';
Change the Folder Path to the location of the WrapperClass_Wizard.accdb correctly.
You can create class module templates with the main object declarations (e.g., TextBox and Form, or any other Control and Form) with their property procedures for up to 10 of the most frequently used controls on the form.
Additionally, you can add a sample Click Event Subroutine Code foundation with all the Data Field Names (eg, TextBox and ComboBox Names) collected from the Form. To achieve this, insert a few lines of code (shown in red) in the Class_Init() Subroutine listing below, to collect each Control Type in separate Groups from the Form and save them into their designated text files on disk when the Form is in open state.
Note: If you plan to implement this Data Field Name saving procedure for two or more forms, the contents of this text file on Disk will be overwritten with the last open Form's Field Names.
For creating the TextBox or ComboBox sample Click Event Subroutine for a particular Form, open the Form with its Class_Init() Subroutine Code Lines in red, for a few seconds, and close it before running the Class Template creation Wizard.
I recommend this procedure to collect the Data field names on the Form using Code, because all of them are inserted from the data source Table/Query. Memorizing all their names correctly for easier event subroutine coding is impractical.
The code lines (marked in Red) are inserted into the Class_Init() subroutine to write out the Category-wise Field Names into their respective Files on Disk. All TextBox Field Names in one Text File, ComboBox Field Names in another, and so on. Below that is the Class_Init() Subroutine in the Class_ObjInit Class Module of the Employees Form, implemented with this procedure.
Option Compare Database
Option Explicit
Private txt As Data_TxtBox
Private Cbo As Data_CboBox
Private cmd As Data_CmdButton
Private Coll As New Collection
Private Frm As Form
'--------------------------------------------------------------------
'Streamlining Form Module Code
'in Stand-alone Class Modules
'With Reusable Code
'--------------------------------------------------------------------
'The 'WrapperClassWizard.accdb' attached to this Database
'Check: Tools--> References...
'--------------------------------------------------------------------
'1. The 'Class_ObjInit' Class saves TxtBox/Field Names, Command Button,
'ComboBox Names, and others from the Open Form into TextBoxFields.txt,
'CmdButtonList.txt & ComboBoxList.txt files in the same Database Folder.
'
'2. The 'WrapperClassWizard.accdb' must be attached to the
'Current Project to open up the Wizard Form by running
'the Function: OpenClassWizard() from within a Command button Click.
'
'3. The Wizard Reads the Field Names from tbe above Text Files.
'
'4. The Wizard will use the Field/Control Names(if any) for the sample
'Event Subroutine in the Template. If the file is empty then it will
'create a sample Evet Subroutine without the Control names.
'
'5. This saves Coding time otherwise spent on creating a
'New Wrapper Class Module from scratch and picking the
'Field Names and other Control Names correctly
'From the Form for Event Subroutines.
'--------------------------------------------------------------------
'Author: a.p.r. pillai
'Date : 20/06/2024
'Remarks: with Ready-made Data Entry Events Handler
' : in the Wrapper TextBox Class Module
' : Suitable for Columnar, Tabular or DataSheet Form
'Rights: All Rights(c) Reserved by www.msaccesstips.com
'--------------------------------------------------------------------
Public Property Get o_Frm() As Form
Set o_Frm = Frm
End Property
Public Property Set o_Frm(ByRef vFrm As Form)
Set Frm = vFrm
Class_Init
End Property
Private Sub Class_Init()
Dim ProjectPath As String
Dim txtPath As String
Dim ComboPath As String
Dim FieldListFile As String
Dim ComboBoxList As String
Dim ctl As Control
On Error GoTo ClassInit_Err
Const EP = "[Event Procedure]"
'Save TextBox & CombBox Names into separate Text Files
'for creating Event Subroutines in the Templates
ProjectPath = CurrentProject.Path & "\"
FieldListFile = DLookup("FieldListFile", "ListItemsQ", "ID = " & wizTextBox)
ComboBoxList = DLookup("FieldListFile", "ListItemsQ", "ID = " & wizComboBox)
txtPath = ProjectPath & FieldListFile
ComboPath = ProjectPath & ComboBoxList
Open txtPath For Output As #1 'TextBoxFields.txt for writing
Open ComboPath For Output As #2 'ComboBoxList.txt
'Instantiate the 'Data_txtBox' Class for each TextBox
'on the Form for streamlined Event Procedures Coding
For Each ctl In Frm.Controls
Select Case TypeName(ctl)
Case "TextBox"
Print #1, ctl.Name 'write Field/TextBox Name in TextBoxFields.txt File
Set txt = New Data_TxtBox
Set txt.m_Frm = Frm
Set txt.m_txt = ctl
'//Colin Riddington Technique: Highlighting BackColor on GotFocus
txt.m_txt.BackColor = 62207 'yellow
txt.m_txt.BackStyle = 0
txt.m_txt.BeforeUpdate = EP
txt.m_txt.OnDirty = EP
Coll.Add txt 'Add Data_TxtBox Class Instance to Collection
Set txt = Nothing 'Reset txt object
Case "CommandButton"
Set cmd = New Data_CmdButton
Set cmd.Obj_Form = Frm
Set cmd.cmd_Button = ctl
cmd.cmd_Button.OnClick = EP
Coll.Add cmd
Set cmd = Nothing
Case "ComboBox"
Print #2, ctl.Name 'write ComboBox Names in ComboBoxList.txt File
Set Cbo = New Data_CboBox
Set Cbo.m_Frm = Frm
Set Cbo.m_Cbo = ctl
'//Colin Riddington Technique: Highlighting BackColor on GotFocus
Cbo.m_Cbo.BackColor = 62207
Cbo.m_Cbo.BackStyle = 0
Cbo.m_Cbo.BeforeUpdate = EP
Cbo.m_Cbo.OnDirty = EP
Coll.Add Cbo
Set Cbo = Nothing
Case "ListBox"
End Select
Next
'Close all files
Close #1
Close #2
ClassInit_Exit:
Exit Sub
ClassInit_Err:
MsgBox Err & ": " & Err.Description, , "Class_Init()"
Resume ClassInit_Exit
End Sub
Private Sub Class_Terminate()
While Coll.Count > 0
Coll.Remove 1
Wend
Set Coll = Nothing
End Sub
The red lines are inserted in the required locations to collect the Data Field and ComboBox Names and record them in separate Text Files in the Project Folder as Input to the Class Module creation Wizard. Similarly, you can insert related Code lines for other Types of Controls on the Form.
The Wizard will look for these files on the disk and check their contents. If control names are found, they will be used for building a sample Click Event Subroutine after the main object declarations and property procedure lines of code.
If the above lines are embedded in the Class_Init() subroutine, we should open and keep the Employees Form for a few seconds and close it before running the wizard options. This will create the controls list in their respective text files, using the predefined file names taken from the wizard table ListItems, through the Select Query ListItemsQ.
The TextBoxFields.txt File contents created from the Employee Form Field Names are listed below for reference:
ID Company Last Name First Name E-mail Address Job Title Address City State/Province ZIP/Postal Code Country/Region
The Sample Click Event Subroutine Structure Code.
Private Sub txtBox_Click()
Select Case txtBox.Name
Case "ID"
' Code
Case "Company"
' Code
Case "Last Name"
' Code
Case "First Name"
' Code
Case "E-mail Address"
' Code
Case "Job Title"
' Code
Case "Address"
' Code
Case "City"
' Code
Case "State/Province"
' Code
Case "ZIP/Postal Code"
' Code
Case "Country/Region"
' Code
End Select
End Sub
Remove the unwanted Control Names from the List if no Events are invoked from those controls.
Opening the ClassWizard Form.
Open the ClassWizard Form by calling the Function OpenClassWizard() from your Project through a Command Button Click Event Subroutine, with the following sample VBA Code lines:
Private Sub Command25_Click() VBE.CodePanes.Item(1).show OpenClassWizard VBE.ActiveVBProject.Name End Sub
The OpenClassWizard() Function Code is given below.
Note: You should not create a Function with the same name: OpenClassWizard() in your Project, where the Wizard is attached as a Library database.
Dim ProjectName As String
'Public Function to Open the Wizard Form
'from the Host Application
Public Function OpenClassWizard(ByVal projName As String)
On Error GoTo OpenClassWizard_Err
ProjectName = projName
DoCmd.OpenForm "ClassWizard", acNormal
OpenClassWizard_Exit:
Exit Function
OpenClassWizard_Err:
MsgBox Err & ": " & Err.Description, , "OpenClassWizard()"
Resume OpenClassWizard_Exit
End Function
When the Wizard Form is open in your Application Window, select one or more items from the List of Control Types, like TextBox, Command Buttons, or any other Class Module you need, and click the Run Wizard Command Button.
The ClassWizard Form Module Code:
Option Compare Database
Option Explicit
Private obj As New Wiz_ObjInit
Private Sub Form_load()
Set obj.O_Form = Me
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set obj = Nothing
End Sub
The Wiz_ObjInit Intermediary Class Module VBA Code.
Option Compare Database
Option Explicit
Private Lst As Wiz_ListBox
Private oFrm As Access.Form
Private cmd As Wiz_CmdButton
Private Coll As New Collection
'----------------------------------------------------------
'Streamlining Form Module Code in Stand-alone Class Modules
'With Reusable Structured Event Subroutine Coding.
'----------------------------------------------------------
'Event Procedure Coding in Standalone Class Module is now
'made easier with Readymade Object Wrapper Class Templates
'Demo Event Subroutine is created with the Control Names.
'----------------------------------------------------------
'Program: Wrapper Class Template Wizard
'Author: a.p.r. pillai
'Date : 20/06/2024
'Rights: All Rights(c) Reserved by www.msaccesstips.com
'----------------------------------------------------------
Public Property Get O_Form() As Form
Set O_Form = oFrm
End Property
Public Property Set O_Form(ByRef objForm As Form)
Set oFrm = objForm
Class_Init
End Property
Private Sub Class_Init()
On Error GoTo Class_Init_Err
Dim ctl As Control
Const EP = "[Event Procedure]"
For Each ctl In oFrm.Controls
Select Case TypeName(ctl)
Case "ListBox"
Set Lst = New Wiz_ListBox
Set Lst.Obj_Form = oFrm
Set Lst.Lst_Box = ctl
Lst.Lst_Box.OnClick = EP
Coll.Add Lst
Set Lst = Nothing
Case "CommandButton"
Set cmd = New Wiz_CmdButton
Set cmd.Obj_Form = oFrm
Set cmd.Obj_cmdButton = ctl
cmd.Obj_cmdButton.OnClick = EP
Coll.Add cmd
Set cmd = Nothing
End Select
Next
Class_Init_Exit:
Exit Sub
Class_Init_Err:
MsgBox Err & ": " & Err.Description, , "Class_Init()"
Resume Class_Init_Exit
End Sub
Private Sub Class_Terminate()
While Coll.Count > 0
Coll.Remove 1
Wend
Set Coll = Nothing
Set Lst = Nothing
End Sub
The Class_Init() Subroutine enables the Click Events of the ListBox and Command Button Controls.
The ListBox Wrapper Class 'Wiz_ListBox' Module VBA Code.
Option Compare Database
Option Explicit
Private WithEvents LstBox As Access.ListBox
Private Frm As Access.Form
'----------------------------------------------------------
'Streamlining Form Module Code in Stand-alone Class Modules
'With Reusable Structured Event Subroutine Coding.
'----------------------------------------------------------
'Event Procedure Coding in Standalone Class Module is now
'made easier with Readymade Object Wrapper Class Templates
'Demo Event Subroutine is created with the Control Names.
'----------------------------------------------------------
'Program: Wrapper Class Template Wizard
'Author: a.p.r. pillai
'Date : 20/06/2024
'Rights: All Rights(c) Reserved by www.msaccesstips.com
'----------------------------------------------------------
Public Property Get Obj_Form() As Form
Set Obj_Form = Frm
End Property
Public Property Set Obj_Form(ByRef objForm As Form)
Set Frm = objForm
End Property
Public Property Get Lst_Box() As Access.ListBox
Set Lst_Box = LstBox
End Property
Public Property Set Lst_Box(ByRef objListB As Access.ListBox)
Set LstBox = objListB
End Property
Private Sub LstBox_Click()
On Error GoTo LstBox_Click_Err
Select Case LstBox.Name
Case "List1"
Dim lCount As Integer
Dim tmpList As ListBox
Dim j As Integer
Set tmpList = Frm.List1
lCount = tmpList.ListCount - 1
For j = 0 To lCount
If tmpList.Selected(j) Then
Frm.cmdRun.Enabled = True
Exit Sub
Else
Frm.cmdRun.Enabled = False
End If
Next
End Select
LstBox_Click_Exit:
Exit Sub
LstBox_Click_Err:
MsgBox Err & ": " & Err.Description, , "LstBox_Click()"
Resume LstBox_Click_Exit
End Sub
The Click Event of the ListBox Control checks for the presence of any selected Items in the ListBox. If found, enables the Command Button with the Caption 'Run Wizard'; otherwise, the Command Button is disabled.
The Command Button Wrapper Class 'Wiz_CmdButton' Module Code.
Option Compare Database
Option Explicit
Private WithEvents cmdButton As Access.CommandButton
Private Frm As Access.Form
'----------------------------------------------------------
'Streamlining Form Module Code in Stand-alone Class Modules
'With Reusable Structured Event Subroutine Coding.
'----------------------------------------------------------
'Event Procedure Coding in Standalone Class Module is now
'made easier with Readymade Object Wrapper Class Templates
'Demo Event Subroutine is created with the Control Names.
'----------------------------------------------------------
'Program: Wrapper Class Template Wizard
'Author: a.p.r. pillai
'Date : 20/06/2024
'Rights: All Rights(c) Reserved by www.msaccesstips.com
'----------------------------------------------------------
Public Property Get Obj_Form() As Access.Form
Set Obj_Form = Frm
End Property
Public Property Set Obj_Form(ByRef objForm As Access.Form)
Set Frm = objForm
End Property
Public Property Get Obj_cmdButton() As Access.CommandButton
Set Obj_cmdButton = cmdButton
End Property
Public Property Set Obj_cmdButton(ByRef vcmdButton As Access.CommandButton)
Set cmdButton = vcmdButton
End Property
Private Sub cmdButton_Click()
On Error GoTo cmdButtonClick_Err
Select Case cmdButton.Name
Case "cmdClose"
DoCmd.Close acForm, "ClassWizard"
Case "cmdRun"
Dim modul As Module
Dim flag As Boolean
Dim vbcompo As vbcomponent
Dim tmpList As ListBox
Dim wiz As Integer
Dim strWiz As String
Dim FunctionName As String
Dim FieldListFile As String
Dim ClsTemplate As String
Dim s_ObjTypeName As String
Dim s_ObjName As String
Dim msg As String
Dim lCount As Integer
Dim j As Integer, k As Integer
Dim qot As String
Dim objType As Long
Dim Dt As Double
Dim ClsSourceFile As String
Dim ProjectName As String
Dim Result As Boolean
qot = Chr(34)
Set tmpList = Frm.List1
lCount = tmpList.ListCount - 1
k = 0
'Validation Check
msg = ""
For j = 0 To lCount
If tmpList.Selected(j) Then
'FieldList File
FieldListFile = CurrentProject.Path & "\" & tmpList.Column(1, j)
'Chek for FieldList File on Disk
If Len(Dir(FieldListFile)) = 0 Then
Open FieldListFile For Output As #1
Print #1, Space(5)
Close #1
End If
'Class Template Name
ClsTemplate = tmpList.Column(2, j)
msg = ""
FunctionName = tmpList.Column(3, j)
If Len(Nz(FunctionName, "")) = 0 Then
FunctionName = "CreateClassTemplate"
End If
s_ObjTypeName = tmpList.Column(4, j)
If Len(Nz(s_ObjTypeName, "")) = 0 Then 'Control Type Name column empty
msg = "*** Object TypeName not specified!"
Else
objType = ControlTypeCheck(s_ObjTypeName) 'Is it a Valid Control TypeName
If objType = 9999 Then 'Name not in specified list
msg = "*** object Typename: " & UCase(s_ObjTypeName) & vbCr _
& "Not in specified List?"
End If
End If
s_ObjName = tmpList.Column(5, j)
If Len(Nz(s_ObjName, "")) = 0 Then 'Column is empty
msg = msg & vbCr & vbCr & "User-Defined Object Name Column is Empty!"
End If
If Len(msg) > 0 Then 'Errors Found
msg = msg & vbCr & vbCr & "Errors Found in Item: " & tmpList.Column(0, j) & _
vbCr & "Rectify the Errors and Re-run!"
MsgBox msg, vbCritical + vbOKCancel, "cmdButton_Click()"
Exit Sub
Else 'No Errors then creaate Template
'Call the Wizard
Result = CreateClassTemplate(FieldListFile, ClsTemplate, s_ObjTypeName, s_ObjName)
If Not Result Then
MsgBox "Errors Encountered for '" & ClsTemplate & "'" & vbCr _
& "Review/Modify the Parameter value(s) and Re-try."
End If
End If
End If
Next j
MsgBox "Class Module Templates Created successfully!"
'Save created Template Class modules
DoCmd.RunCommand acCmdCompileAndSaveAllModules
Case "cmdHelp"
DoCmd.OpenForm "Wiz_Help", acNormal
End Select
cmdButtonClick_Exit:
Exit Sub
cmdButtonClick_Err:
MsgBox Err & ": " & Err.Description, , "cmdButtonClick()"
Resume cmdButtonClick_Exit
End Sub
It runs a series of checks on the Wizard parameters and validates them before calling the CreateClassTemplate() Function with its parameters.
The Wizard will retrieve the Parameters for the selected items from the ListItems Table and check for the Field List/Control Files from the selected options on the disk. If found, then it retrieves the list of controls, if any, for the sample Event Subroutine.
After validation of parameter values, it calls the Wizard Function CreateClassTemplate(), which creates the Class Module Templates for the selected options, with predefined names in your Project's VBE Window's Navigation Pane.
The CreateClassTemplate() Wizard Function VBA Code is given below:
Public Function CreateClassTemplate(ByVal FieldListFile As String, _
ByVal ClassTemplateName As String, ByVal strObjTypeName As String, _
ByVal strObjName As String) As Boolean
'----------------------------------------------------------
'Streamlining Form Module Code in Stand-alone Class Modules
'With Reusable Structured Event Subroutine Coding.
'----------------------------------------------------------
'Event Procedure Coding in Standalone Class Module is now
'made easier with Readymade Object Wrapper Class Templates
'Demo Event Subroutine is created with the Control Names.
'----------------------------------------------------------
'Program: Wrapper Class Template Wizard
'Author: a.p.r. pillai
'Date : 20/06/2024
'Rights: All Rights(c) Reserved by www.msaccesstips.com
'----------------------------------------------------------
On Error GoTo CreateClassTemplate_Err
Dim j As Long, k As Long, h As Long, CountLines As Long
Dim low As Long, high As Long
Dim FieldList() As String
Dim strItem As Variant
Dim strLines(1 To 33) As String
Dim msg As String
Dim idx As Integer
Dim spacex As String
Dim qot As String
Dim ClsPath As String
Dim vbcompo As vbcomponent
spacex = Chr(32)
qot = Chr(34)
idx = 1
strLines(idx) = "VERSION 1.0 CLASS": GoSub NextIndex
strLines(idx) = "BEGIN": GoSub NextIndex
strLines(idx) = " MultiUse = -1": GoSub NextIndex
strLines(idx) = "End": GoSub NextIndex
strLines(idx) = "Attribute VB_Name = " & qot & ClassTemplateName & qot: GoSub NextIndex
strLines(idx) = "Attribute VB_GlobalNameSpace = False": GoSub NextIndex
strLines(idx) = "Attribute VB_Creatable = False": GoSub NextIndex
strLines(idx) = "Attribute VB_PredeclaredId = False": GoSub NextIndex
strLines(idx) = "Attribute VB_Exposed = False": GoSub NextIndex
strLines(idx) = "Option Compare Database": GoSub NextIndex
strLines(idx) = "Option Explicit": GoSub NextIndex
strLines(idx) = spacex: GoSub NextIndex
strLines(idx) = "Private WithEvents " & strObjName & " as Access." & strObjTypeName: GoSub NextIndex
strLines(idx) = "Private Frm as Access.Form": GoSub NextIndex
strLines(idx) = spacex: GoSub NextIndex
strLines(idx) = "Public Property Get Obj_Form() as Access.Form": GoSub NextIndex
strLines(idx) = " Set Obj_Form = Frm": GoSub NextIndex
strLines(idx) = "End Property": GoSub NextIndex
strLines(idx) = spacex: GoSub NextIndex
strLines(idx) = "Public Property Set Obj_Form(ByRef objForm as Access.Form)": GoSub NextIndex
strLines(idx) = " Set Frm = objForm": GoSub NextIndex
strLines(idx) = "End Property": GoSub NextIndex
strLines(idx) = spacex: GoSub NextIndex
strLines(idx) = "Public Property Get Obj_" & strObjName & "() as Access." & strObjTypeName: GoSub NextIndex
strLines(idx) = " Set obj_" & strObjName & " = " & strObjName: GoSub NextIndex
strLines(idx) = "End Property": GoSub NextIndex
strLines(idx) = spacex: GoSub NextIndex
strLines(idx) = "Public Property Set Obj_" & strObjName & "(ByRef v" & strObjName & " as Access." & strObjTypeName & ")": GoSub NextIndex
strLines(idx) = " Set " & strObjName & " = v" & strObjName: GoSub NextIndex
strLines(idx) = "End Property": GoSub NextIndex
strLines(idx) = spacex: GoSub NextIndex
strLines(idx) = "Private Sub " & strObjName & "_Click()": GoSub NextIndex
strLines(idx) = " Select Case " & strObjName & ".Name"
'Read the Field Names into Array
Open FieldListFile For Input As #1
strItem = ""
j = 0
While Not EOF(1)
Input #1, strItem
If Len(Trim(Nz(strItem, " "))) > 0 Then
j = j + 1
ReDim Preserve FieldList(1 To j) As String
FieldList(j) = strItem
End If
Wend
Close #1
If j > 0 Then 'If 0 then Field List File is empty
low = LBound(FieldList)
high = UBound(FieldList)
End If
'Write the Array contents to file
ClsPath = CurrentProject.Path & "\TempClass.cls"
Open ClsPath For Output As #1
For k = 1 To idx
Print #1, strLines(k)
Next
'Subroutine Lines
If j > 0 Then 'if 0 then Field List file is empty
For h = low To high
Print #1, " Case " & qot & FieldList(h) & qot
Print #1, " ' Code"
Print #1, spacex
Next
End If
Print #1, spacex
Print #1, " End Select"
Print #1, "End Sub"
Print #1, spacex
Close #1
' Import the class module
Set vbcompo = Application.VBE.VBProjects(ProjectName).VBComponents.Import(ClsPath)
' Verify if the imported module is a class module
'Compile and Save module
If vbcompo.Type = vbext_ct_ClassModule Then
CreateClassTemplate = True
Kill ClsPath
Else
CreateClassTemplate = False
MsgBox "Import failed: Not a class module."
End If
CreateClassTemplate_Exit:
Exit Function
NextIndex:
idx = idx + 1
Return
CreateClassTemplate_Err:
MsgBox Err & ": " & Err.Description, , "CreateClassTemplate()"
Resume CreateClassTemplate_Exit
End Function
Check the VBE navigation pane for the newly created Template Files. They may not appear immediately in the Database navigation pane.
The Wizard's VBA Code is straightforward. The first 33 lines of Code are standard, with the change of Object Names and Type declarations inserted at appropriate positions using the Parameters obtained from the ListItems Table.
Next, it checks for the Field Names list file (or the Control Type-related Text File Names given in the ListItems Table) in the TextBoxFieldsList.txt. If Control Names are present in the Text File, they are loaded into an Array in memory.
After that, the first 33 VBA Code lines are written into the TempClass.cls Text File. If the Field List/Control Name lines are found in the Array, it creates a sample Click Event Subroutine Code within the Select Case . . . Case . . . End Select structure for ready-to-write Event Procedure Code wherever applicable.
This sample Event Subroutine structure can be copied for other Event Procedures, like BeforeUpdate(), GotFocus(), and others.
Finally, the TempClass.cls Text File is Imported into the VBE Project's Code Pane. Look for the Class Modules with the _Template Suffix to spot them quickly.
If the Import action is unsuccessful, then display an Error Message. In that case, you should investigate and find the cause of the Error, correct it, and try again.
You may highlight one or more required Object Template Options from the ListBox, and the Wizard creates them quickly. You can rename the Template Modules or copy the generated Code from the Template Module and paste it into a separate Class module for normal use. Modify the Object Names- part and use it with other types of control.
Click the Help Command Button to display the Help Form in your Application Window. The Help Form Image is shown below.
The listItems Record ID Enumerations are given below.
Enum ParamID
wizTextBox = 1
wizCommandButton = 2
wizComboBox = 3
wizListBox = 4
wizLabel = 5
wizOptionGroup = 6
wizOptionButton = 7
wizCheckBox = 8
wizToggleButton = 9
wizTabControl = 10
End Enum
The Control Type Validating Function Code Listing.
Public Function ControlTypeCheck(ByVal strctl As String) As Long
On Error GoTo ControlTypeCheck_Err
Dim ctrlType(1 To 10) As String
Dim ctrl(1 To 10) As Long
Dim j As Integer
For j = 1 To 10
Select Case j
Case 1: ctrlType(j) = "Label": ctrl(j) = acLabel '100
Case 2: ctrlType(j) = "CommandButton": ctrl(j) = acCommandButton '104
Case 3: ctrlType(j) = "OptionButton": ctrl(j) = acOptionButton '105
Case 4: ctrlType(j) = "CheckBox": ctrl(j) = acCheckBox '106
Case 5: ctrlType(j) = "OptionGroup": ctrl(j) = acOptionGroup '107
Case 6: ctrlType(j) = "TextBox": ctrl(j) = acTextBox '109
Case 7: ctrlType(j) = "ListBox": ctrl(j) = acListBox '110
Case 8: ctrlType(j) = "ComboBox": ctrl(j) = acComboBox '111
Case 9: ctrlType(j) = "ToggleButton": ctrl(j) = acToggleButton '122
Case 10: ctrlType(j) = "TabControl": ctrl(j) = acTabCtl '123
End Select
Next
For j = LBound(ctrlType) To UBound(ctrlType)
If ctrlType(j) = strctl Then
ControlTypeCheck = ctrl(j): Exit For
Else
ControlTypeCheck = 9999 'Error
End If
Next
ControlTypeCheck_Exit:
Exit Function
ControlTypeCheck_Err:
MsgBox Err & ": " & Err.Description, , "ControlTypeCheck()"
Resume ControlTypeCheck_Exit
End Function
I hope you are enjoying the new approach to coding with reusable VBA code and easier code maintenance, without the need to constantly interfere with the Form Design View. The 'Streamlining Form Module Code in the Standalone Cass Module' also enhances code portability to other projects, offering a significant advantage.
Demo Databases Download.
- Reusing Form Module VBA Code for New Projects.
- Streamlining Form Module Code - Part Two.
- Streamlining Form Module Code - Part Three
- Streamlining Form Module Code - Part Four
- Streamlining Form Module Code - Part Five
- Streamlining Form Module Code - Part Six
- Streamlining Form Module Code - Part Seven
- Streamlining Form Module Code - Part Eight
- Streamlining Form Module Code - Part Nine
- Streamlining Form Module Code - Part Ten
- Streamlining Form Module Code - Part Eleven
- Streamlining Report Module Code in Class Module
- Streamlining Module Code Report Line Hiding-13.
- Streamlining Form Module Code Part-14.
- Streamlining Custom Made Form Wizard-15.
- Streamlining VBA Custom Made Report Wizard-16.
- Streamlining VBA External Files List in Hyperlinks-17
- Streamlining Events VBA 3D Text Wizard-18
- Streamlining Events VBA RGB Color Wizard-19
- Streamlining Events Numbers to Words-20
- Access Users Group(Europe) Presentation-21
- The Event Firing Mechanism of MS Access-22
- One TextBox and Three Wrapper Class Instances-23
- Streamlining Code Synchronized Floating Popup Form-24
- Streamlining Code Compacting/Repair Database-25
- Streamlining Code Remainder Popup Form-26
- Streamlining Code Editing Data in Zoom-in Control-27
- Streamlining Code Filter By Character and Sort-28
- Table Query Records in Collection Object-29
- Class for All Data Entry Editing Forms-30
- Wrapper Class Module Creation Wizard-31
- wrapper-class-template-wizard-v2













No comments:
Post a Comment
Comments subject to moderation before publishing.