【问题标题】:How make VBA run on clicking any checkbox in a userform?单击用户窗体中的任何复选框时如何使 VBA 运行?
【发布时间】:2016-01-19 13:03:48
【问题描述】:

我有一个带有多个框架的用户表单,所有框架都填充了多个复选框。我已将复选框命名为对应的 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

【问题讨论】:

  • 您是否启用了宏?您是否确保您的工作簿不是 XLSX 文件?只有 XSL、XLSB 和 XLSM 文件可以运行宏。
  • 是的,所有其他宏都可以正常工作。另外,如果我点击用户表单(所以不是在复选框和框架之外),代码就像它应该的那样。

标签: vba excel


【解决方案1】:

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

所以: 创建一个名为cls_ChkBox 的类模块。 在类模块中,您将添加 Click 事件代码:

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

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

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

【讨论】:

  • 我不知道你能做到这一点,我要保存它以备后用,我有一个项目,这将是完美的。
  • 我主要在表单上需要不确定数量的控件时使用它 - 您可以在运行时添加控件并为每个控件附加一个事件。
  • 这样使用 tag 属性也很好,对于自定义更新,combo1 使用其标签名称更新组合。
  • 是的,Tag 属性非常有用 - 非常适合存储控件的旧值以及一百万和其他用途。 :)
  • 这对我来说是一个全新的领域......谢谢,它完美无缺!你们应该教我! :)
【解决方案2】:

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

如果你想要执行的代码除了控件之外每次都相同,你可以在用户表单模块中编写一个私有子,为每个事件调用,私有子可以在()之间输入一个输入。

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

【讨论】:

  • 谢谢,但这是我不想要的解决方案。我有超过 100 个复选框,所以我正在寻找一个在我每次单击任何复选框时都会运行的事件。
【解决方案3】:

我今天才知道这一点,并认为它可能会有所帮助?大多数问题以及与复选框、列表框等有关的问题的回答似乎无法区分这些表单是直接插入到工作表中还是嵌入在用户表单中。

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

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

解释一下:同样,这段代码在用户窗体模块中。我命名了我的列表框, lstBox 日期。在我调用的主代码 - EnterDates 中,我使用变量名 = inputString1。我从 ListBox 中选择的值或日期由 UserForm1.lstBoxDates.Value 从 UserForm1 捕获 - 我将其格式化为日期,否则您只会看到一个数字。这仅适用于一种选择。 因为我在这里调暗,所以不需要在你的主代码中调暗。主代码的子 需要接受你传递给它的变量:

Sub EnterDates(inputString1)

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

【讨论】:

    猜你喜欢
    • 2012-09-04
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多