我当前的工作项目面临一个小问题。
我想实时检查多页用户表单上的2组文本框(4个带有标签“ A”和4个带有标签“ B”),如果其中一组不为空(每个单个文本框必须包含一个值)按钮应启用。
这是我到目前为止的内容:
主要代码:
Dim TextBoxes() As New ChangeCheck
Private Sub UserForm_Initialize()
Main.ZeitA_CommandButton1.Enabled = False
Dim Ctl As MSForms.Control
Dim i As Long
i = 1
For Each Ctl In Me.Controls
If TypeName(Ctl) = "TextBox" Then
ReDim Preserve TextBoxes(1 To i)
Set TextBoxes(i).TextGroup = Ctl
i = i + 1
End If
Next Ctl
End Sub
类模块“ ChangeCheck”
Option Explicit
Public WithEvents TextGroup As MSForms.Textbox
Sub TextGroup_Change()
If TextGroup.Tag = "A" Then
MsgBox "Hallo"
End If
End Sub
因此,如果我更改带有标签“ A”的文本框,则会得到一个MsgBox,但如何检查带有标签“ A”的所有文本框是否都不为空?如果我用
If TextGroup.Tag = "A" And TextGroup.Value <> "" Then
每个文本框将激活或停用按钮
预先感谢您莫里茨
下面是一种可能的解决方案。
假定存在一个命名表单,UserForm1
其中包含8个TextBox控件(如您所述,包含4个带有标签“ A”的控件和4个带有标签“ B”的控件)和2个CommandButton1
为组“ A”和CommandButton2
“ B”命名的CommandButton控件。将这段代码放在UserForm1
节中(一些变量名被更具指导性的IMO取代,我也使用collection而不是array,因此不需要counter变量):
Option Explicit
Private Sub UserForm_Initialize()
Dim Ctl As MSForms.Control
Dim ChangeCheckInstance As ChangeCheck
Set Form = Me
Me.CommandButton1.Enabled = False
Me.CommandButton2.Enabled = False
For Each Ctl In Me.Controls
If TypeName(Ctl) = "TextBox" Then
Set ChangeCheckInstance = New ChangeCheck
Set ChangeCheckInstance.TextBoxCtl = Ctl
ChangeChecks.Add ChangeCheckInstance
End If
Next Ctl
End Sub
项目还必须Module1
在模块部分中包含以下代码:
Option Explicit
Public ChangeChecks As New Collection
Public Form As Object
Public Sub CheckTextBoxes(CallerTextBox As MSForms.TextBox)
Dim ChangeCheckInstance As ChangeCheck
Dim NotEmpty As Boolean
NotEmpty = True
For Each ChangeCheckInstance In ChangeChecks
With ChangeCheckInstance.TextBoxCtl
If (.Text = "") And (.Tag = CallerTextBox.Tag) Then
NotEmpty = False
Exit For
End If
End With
Next
Select Case CallerTextBox.Tag
Case "A"
Form.CommandButton1.Enabled = NotEmpty
Case "B"
Form.CommandButton2.Enabled = NotEmpty
End Select
End Sub
以及您ChangeCheck
在类模块部分中的类定义:
Option Explicit
Public WithEvents TextBoxCtl As MSForms.TextBox
Sub TextBoxCtl_Change()
CheckTextBoxes TextBoxCtl
End Sub
如您所见,所有check操作均在中实现Public Sub CheckTextBoxes
,该操作CallerTextBox
从更改后的类实例传递的参数中获取必要的数据,并从全局变量:ChangeChecks
包含所有复选框的集合Form
中引用UserForm1
。
编辑:
如果您不想拥有全局变量(这不是您所知的最佳实践),另一种方法是在类中封装检查方法和必要的数据。因此,您无需保留Module1
在模块部分,而UserForm1
在表单部分中的代码将如下所示:
Option Explicit
Private Sub UserForm_Initialize()
Dim Ctl As MSForms.Control
Dim ChangeChecks As New Collection
Dim ChangeCheckInstance As ChangeCheck
Me.CommandButton1.Enabled = False
Me.CommandButton2.Enabled = False
For Each Ctl In Me.Controls
If TypeName(Ctl) = "TextBox" Then
Set ChangeCheckInstance = New ChangeCheck
Set ChangeCheckInstance.TextBoxCtl = Ctl
Set ChangeCheckInstance.ChangeChecks = ChangeChecks
Set ChangeCheckInstance.Form = Me
ChangeChecks.Add ChangeCheckInstance
End If
Next Ctl
End Sub
并且您ChangeCheck
在“类模块”部分中的类定义将如下所示:
Option Explicit
Public WithEvents TextBoxCtl As MSForms.TextBox
Public ChangeChecks As Collection
Public Form As Object
Sub TextBoxCtl_Change()
Dim ChangeCheckInstance As ChangeCheck
Dim NotEmpty As Boolean
NotEmpty = True
For Each ChangeCheckInstance In ChangeChecks
With ChangeCheckInstance.TextBoxCtl
If (.Text = "") And (.Tag = TextBoxCtl.Tag) Then
NotEmpty = False
Exit For
End If
End With
Next
Select Case TextBoxCtl.Tag
Case "A"
Form.CommandButton1.Enabled = NotEmpty
Case "B"
Form.CommandButton2.Enabled = NotEmpty
End Select
End Sub
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句