直接运行时,VBA用户窗体有效,但通过子目录运行时,VBA用户窗体无效

时间:2019-02-25 18:18:12

标签: excel vba userform

我有一个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脚本会运行,但不会像预期的那样启用“确定”按钮。我对此进行了广泛的研究,但未能找到任何东西。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

当您在MyUserform.CheckAndEnable的{​​{1}}子项中调用chkbox_Change()时,它将为UserForm的 default 实例运行CheckAndEnable脚本。由于显示用户窗体的模块正在创建窗体的非默认实例,因此CheckAndEnable脚本失败,因为它不知道在非默认版本中更改了哪些复选框/变量/等。

感谢Mathieu Guindon提供的解决方案。有关更多详细信息,请参见UserForm1.Show