Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使VBA在单击userform中的任何复选框时运行?_Vba_Excel - Fatal编程技术网

如何使VBA在单击userform中的任何复选框时运行?

如何使VBA在单击userform中的任何复选框时运行?,vba,excel,Vba,Excel,我有一个带有多个框架的用户表单,所有的表单都有多个复选框。我已将复选框命名为对应的Excel单元格。现在,我想在运行时单击这些复选框中的任何一个,使VBA运行。我知道我可以通过为每个复选框创建一个单击子项来实现这一点,但必须有一种更干净的方法来实现这一点 到目前为止,我已经尝试将此代码放入userform\u Click和userform\u Mousedown事件中,但当我单击复选框时,它们不会运行。有人知道怎么做吗 Dim iControl As Control For Each iCon

我有一个带有多个框架的用户表单,所有的表单都有多个复选框。我已将复选框命名为对应的Excel单元格。现在,我想在运行时单击这些复选框中的任何一个,使VBA运行。我知道我可以通过为每个复选框创建一个单击子项来实现这一点,但必须有一种更干净的方法来实现这一点

到目前为止,我已经尝试将此代码放入userform\u Click和userform\u Mousedown事件中,但当我单击复选框时,它们不会运行。有人知道怎么做吗

Dim iControl As Control

For Each iControl In Me.Controls
    If TypeName(iControl) = "CheckBox" Then
        If iControl.Value = True And Range(iControl.Name).Value = "" Then
            Range(iControl.Name).Value = Format(Now, "dd.mm.yyyy")
        ElseIf iControl.Value = True And Range(iControl.Name).Font.Color = vbWhite Then
            Range(iControl.Name).Font.Color = vbBlack
        ElseIf iControl.Value = False And Range(iControl.Name).Value <> "" Then
            Range(iControl.Name).Font.Color = vbWhite
        End If
    End If
Next
Dim i控件作为控件
对于Me.Controls中的每个iControl
如果TypeName(iControl)=“复选框”,则
如果iControl.Value=True且范围为(iControl.Name).Value=”“,则
范围(iControl.Name).Value=格式(现在是“dd.mm.yyyy”)
ElseIf iControl.Value=True,范围(iControl.Name).Font.Color=vbWhite
范围(iControl.Name).Font.Color=vbBlack
ElseIf iControl.Value=False,范围(iControl.Name).Value为“”,然后
范围(iControl.Name).Font.Color=vbWhite
如果结束
如果结束
下一个

您需要一个事件来运行代码,如果没有事件,宏将无法启动。我不知道是否有一个单一的事件触发任何按钮或复选框被点击

如果您想要执行的代码除了控件之外每次都是相同的,那么您可以在userform模块中编写一个私有sub,该模块为每个事件调用,私有sub可以在()之间进行输入

Private Sub CheckBox1_Click()
    Call ExecuteCode(Me.CheckBox1)

End Sub

Private Sub CheckBox2_Click()
    Call ExecuteCode(Me.CheckBox2)

End Sub

Private Sub CheckBox3_Click()
    Call ExecuteCode(Me.CheckBox2)

End Sub

Private Sub ExecuteCode(IControl As Control)
    If TypeName(IControl) = "CheckBox" Then
        If IControl.Value = True And Range(IControl.Name).Value = "" Then
            Range(IControl.Name).Value = Format(Now, "dd.mm.yyyy")
        ElseIf IControl.Value = True And Range(IControl.Name).Font.Color = vbWhite Then
            Range(IControl.Name).Font.Color = vbBlack
        ElseIf IControl.Value = False And Range(IControl.Name).Value <> "" Then
            Range(IControl.Name).Font.Color = vbWhite
        End If
    End If

End Sub
专用子复选框1\u单击()
调用ExecuteCode(Me.CheckBox1)
端接头
专用子复选框2_单击()
调用ExecuteCode(Me.CheckBox2)
端接头
专用子复选框3_单击()
调用ExecuteCode(Me.CheckBox2)
端接头
专用子执行代码(IControl作为控件)
如果TypeName(IControl)=“复选框”,则
如果IControl.Value=True且范围为(IControl.Name).Value=”“,则
范围(IControl.Name).Value=格式(现在是“dd.mm.yyyy”)
ElseIf IControl.Value=True,范围(IControl.Name).Font.Color=vbWhite
范围(IControl.Name).Font.Color=vbBlack
ElseIf IControl.Value=False,范围(IControl.Name).Value为“”,然后
范围(IControl.Name).Font.Color=vbWhite
如果结束
如果结束
端接头

正如SilentRevolution所说,单击按钮时需要触发一个事件。您只需执行一个过程即可触发所有复选框单击事件

因此: 创建名为
cls\u ChkBox
的类模块。 在类模块中,您将添加单击事件代码:

Option Explicit

Private WithEvents chkBox As MSForms.CheckBox

Public Sub AssignClicks(ctrl As Control)
    Set chkBox = ctrl
End Sub

Private Sub chkBox_Click()
    ThisWorkbook.Worksheets("Sheet1").Range(chkBox.Name).Value = Format(Now, "dd.mm.yyyy")
End Sub
现在您只需要将chkBox_Click事件附加到表单上的每个复选框。在用户表单中添加以下代码:

Option Explicit

Private colTickBoxes As Collection

Private Sub UserForm_Initialize()

    Dim ChkBoxes As cls_ChkBox
    Dim ctrl As Control

    Set colTickBoxes = New Collection

    For Each ctrl In Me.Controls
        If TypeName(ctrl) = "CheckBox" Then
            Set ChkBoxes = New cls_ChkBox
            ChkBoxes.AssignClicks ctrl
            colTickBoxes.Add ChkBoxes
        End If
    Next ctrl

End Sub
每个复选框都有自己的类实例,该类实例存储在coltickboxs集合中


打开表单,Sheet1中的单元格将根据复选框的名称进行更新,以显示日期。

我今天刚刚了解了这一点,认为这可能会有所帮助?对于有关复选框、列表框等的问题,大多数问题和回答似乎没有区分这些表单是直接插入到工作表中还是嵌入到用户表单中

这可能适用于复选框-适用于用户表单上的列表框。如果希望代码在选择后运行,则必须编写的代码必须位于UserForm的模块中。我不知道如何进入。在VBE中插入用户表单后,将列表框或其他内容添加到用户表单中。右键单击左上角项目窗口中的UserForm并选择“查看代码”。这里是放置代码的地方,在我的例子中是“更改事件”,这样在从列表框中进行选择后,其他代码将自动运行。她举例说:

Sub lstBoxDates_Change()
   Dim inputString1 As String
   inputString1 = Format(UserForm1.lstBoxDates.Value, "mm-dd-yyyy")
   Call EnterDates(inputString1)
   Unload Me
End Sub
解释:同样,此代码位于UserForm模块中。我给我的列表框命名, 日期。在我称为-EnterDates的主代码中,我使用变量名=inputString1。我从列表框中选择的值或日期由UserForm1.lstBoxDates.value从UserForm1中捕获,我将其格式化为一个日期,否则您只会看到一个数字。这仅适用于一个选择。 因为我在这里变暗了,所以不需要在主代码中变暗。主代码的子代码 需要接受传递给它的变量:

Sub EnterDates(inputString1)

这是非常普遍的,但也许有东西会点击,所以你可以得到你想要的。我希望如此,因为我已经为此工作了整整两天

你启用宏了吗?您是否确保工作簿不是XLSX文件?只有XSL、XLSB和XLSM文件可以运行宏。是的,所有其他宏都可以完美地运行。另外,如果我点击userform(所以不要点击复选框,也不要点击框架外),代码就会像预期的那样运行。谢谢,但这是我不想要的解决方案。我有100多个复选框,所以我正在寻找每次单击任何复选框时都会运行的单个事件。我不知道你可以这样做,我将保存此事件以备将来使用,我有一个项目,这将是完美的。我主要使用它,当我需要一个窗体上的控件数量不确定时-你可以在运行时添加控件,并在每个控件上附加一个事件。这样使用tag属性也很好,对于自定义更新,combo1用其标记的名称更新combo。是的,Tag属性非常有用-用于存储控件的旧值加上一百万和其他用途。:)这对我来说是一个全新的领域。。。谢谢,它工作得很好!你们应该教我!:)