如何在单击用户表单中的任何复选框时运行VBA?

时间:2016-01-19 13:03:49

标签: vba excel-vba excel

我有一个包含多个框架的用户窗体,所有框架都填充了多个复选框。我已将复选框命名为相应的Excel单元格。现在我想在运行时单击任何一个复选框使VBA运行。我知道我可以通过为每个复选框创建一个click-sub来做到这一点,但必须有一个更简洁的方法来执行此操作。

到目前为止,我已经尝试将此代码放在userform_Click和userform_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

3 个答案:

答案 0 :(得分:4)

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

所以: 创建一个名为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 的类模块。 在类模块中,您将添加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

现在您只需将chkBox_Click事件附加到表单上的每个复选框。在您的用户表单中添加以下代码:

name

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

打开表单,Sheet1中的单元格将更新以显示日期,具体取决于复选框的名称。

答案 1 :(得分:0)

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

如果您想要执行的代码每次都与控件不同,您可以在userform模块中编写一个私有子,为每个事件调用,私有子可以在()之间进行输入。

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

答案 2 :(得分:0)

我今天刚刚学会了这个并认为它可能有所帮助?关于复选框,列表框等问题的大多数问题和回答都似乎无法区分这些表单是直接插入工作表还是嵌入在用户窗体中。

这可能适用于复选框 - 它适用于UserForm上的ListBox。如果希望代码在选择后运行,则必须编写的代码必须位于UserForm的模块中。我不知道如何访问。在VBE中插入UserForm后,将ListBoxes或其他内容添加到UserForm。右键单击左上方项目窗口中的UserForm,然后选择&#34;查看代码。&#34;这是您放置代码的地方,在我的情况下是&#34;更改事件&#34;这样,在从ListBox中进行选择之后,将自动运行其他代码。例如她:

Sub lstBoxDates_Change()
   Dim inputString1 As String
   inputString1 = Format(UserForm1.lstBoxDates.Value, "mm-dd-yyyy")
   Call EnterDates(inputString1)
   Unload Me
End Sub

解释:此代码再次出现在UserForm模块中。我命名了我的ListBox, lstBoxDates。在我调用的主代码中--EnterDates,我使用变量name = inputString1。我从ListBox中选择的值或日期是通过UserForm1.lstBoxDates.Value从UserForm1中捕获的 - 我将其格式化为日期,否则您只看到一个数字。这仅适用于一种选择。 因为我在这里昏暗,不需要在主代码中暗淡。子代码为主代码 需要接受传递给它的变量:

Sub EnterDates(inputString1)

这是非常概括的,但也许会点击一下,这样你就可以得到你想要的东西。我希望如此,因为我已经整整工作了两天!!