我有一个UserForm,它提示用户选择文件( Application.FileDialog(.soFileDialogOpen))并单击几个选项(各种复选框 )。这两个都是必需的,因此我希望仅在选择了文件并且至少单击了一个复选框后才启用“确定”按钮。我有一个子( CheckAndEnable ),它在选择文件后和单击任何复选框后都运行(我正在使用一个类来处理此问题)。
这是用户表单代码的非常简化的版本。该用户窗体具有一个名为 buttonOK 的按钮,一个用于选择文件 buttonSelectFile 的按钮以及可变数量的复选框。
Option Explicit
Dim colChkboxes As Collection
Dim intchoice As Integer, AtLeastOneChecked As Boolean, strPath As String
Private Sub buttonOK_Click()
Hide
End Sub
Private Sub buttonSelectFile_Click()
Dim intchoice As Integer
Application.FileDialog(msoFileDialogOpen).AllowMultiSelect = False
intchoice = Application.FileDialog(msoFileDialogOpen).Show
If intchoice <> 0 Then
strPath = Application.FileDialog(msoFileDialogOpen).SelectedItems(1)
labelPath.Caption = strPath
End If
CheckAndEnable
End Sub
Public Sub CheckAndEnable()
Dim ctrl As Control
' checks all checkboxes to determine if at least one is checked
AtLeastOneChecked = False
For Each ctrl In Me.Controls
If TypeName(ctrl) = "CheckBox" Then
If ctrl.Value = True Then
AtLeastOneChecked = True
Exit For
End If
End If
Next ctrl
' enable the OK button if file selected and at least one checkbox clicked
If (AtLeastOneChecked = True) And (Not IsEmpty(strPath)) And (strPath <> "") Then
buttonOK.Enabled = True
Else
buttonOK.Enabled = False
End If
End Sub
Private Sub UserForm_Initialize()
buttonOK.Enabled = False
' declare vars
Dim ctrl As Control
Dim obj As clsCheckBox
Set colChkboxes = New Collection
' set each checkbox to CheckBox Class that handles if checkbox is
clicked.
For Each ctrl In Me.Controls
If TypeName(ctrl) = "CheckBox" Then
Set obj = New clsCheckBox
obj.AssignClicks ctrl
colChkboxes.Add obj
End If
Next ctrl
End Sub
我还有一个类模块 clsCheckBox ,其中包含以下代码,只要单击复选框,该模块就会调用CheckAndEnable。
Private WithEvents chkbox As MSForms.CheckBox
Public Sub AssignClicks(ctrl As Control)
Set chkbox = ctrl
End Sub
Private Sub chkbox_Change()
Call MyUserform.CheckAndEnable
End Sub
当我直接运行UserForm时,一切正常。问题是,当我在模块中调用用户窗体时(该用户窗体是较大脚本中一系列用户窗体的一部分),当单击复选框时,CheckAndEnable脚本会运行,但不会像预期的那样启用“确定”按钮。我对此进行了广泛的研究,但未能找到任何东西。任何帮助将不胜感激!
答案 0 :(得分:0)
当您在MyUserform.CheckAndEnable
的{{1}}子项中调用chkbox_Change()
时,它将为UserForm的 default 实例运行CheckAndEnable脚本。由于显示用户窗体的模块正在创建窗体的非默认实例,因此CheckAndEnable脚本失败,因为它不知道在非默认版本中更改了哪些复选框/变量/等。
感谢Mathieu Guindon提供的解决方案。有关更多详细信息,请参见UserForm1.Show。