【问题标题】:Event triggered by ANY checkbox click由任何复选框单击触发的事件
【发布时间】:2018-03-12 05:58:08
【问题描述】:

当我单击工作表上的任何复选框时,我正疯狂地试图找到一种运行代码的方法。我看过多篇关于制作类模块的文章,但我似乎无法让它工作。

我的代码将填充 B 列以匹配 C 列。我在 C10 中手动输入的任何内容都将填充到 B10 中,即使 C10 是一个公式:=D9。因此,我可以在 D10 中输入 TRUE,C10 中的公式将得出:TRUE,然后代码填充 B10 以表示:TRUE。太棒了......诀窍是有一个链接到 D10 的复选框。当我单击复选框时,D10 显示为 TRUE,C10 中的公式显示为 TRUE,但仅此而已。 VBA 代码无法识别复选框单击。如果我然后单击工作表(选择更改),那么代码将运行,所以我知道我需要一个不同的事件。

将事件更改为“Checkbox1_Click()”很容易,但我希望它适用于我单击的任何复选框。经过几天的搜索和尝试不同的事情,我没有任何运气。

这是我目前正在运行的代码

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim i As Long


For i = 3 To 11
    Range("B" & i).Value = Range("c" & i)
Next i
    End Sub

任何帮助将不胜感激。

【问题讨论】:

  • 这是我发布的一些用于处理多个按钮的代码 .... 看看您是否可以调整它以满足您的需求... stackoverflow.com/questions/46381935/…
  • 顺便说一句:你说你不能让类模块代码运行,但你没有发布任何引用类模块的代码。
  • 为什么要使用循环来赋值? ....只需使用Range("B3:B11") = Range("c3:c11").Value
  • 我应该在一开始就问...你有什么类型的复选框? active-x controlform control ..... 而且,您可以选择要使用的类型吗?
  • 我转到您发布的链接并创建了一个新工作簿,我将您提到的代码粘贴到工作表模块中,创建了一个类模块,然后创建了一个常规模块(Module1),发布在代码,与您拥有的完全一样。我不能让它做任何事情。我试图手动运行宏,但它弹出一个消息框说:用户定义的类型注释已定义。然后突出显示 BtnClass 模块中的以下代码部分:WithEvents ButtonGroup As MSForms.CommandButton

标签: vba events checkbox


【解决方案1】:

这行得通

' this goes into sheet code

Private Sub Worksheet_Activate()
    activateCheckBoxes
End Sub

.

' put all this code in class a module and name the class module "ChkClass"

Option Explicit

Public WithEvents ChkBoxGroup As MSForms.CheckBox

Private Sub ChkBoxGroup_Change()
    Debug.Print "ChkBoxGroup_Change"
End Sub

Private Sub ChkBoxGroup_Click()
    Debug.Print "ChkBoxGroup_Click"; vbTab;
    Debug.Print ChkBoxGroup.Caption; vbTab; ChkBoxGroup.Value
    ChkBoxGroup.TopLeftCell.Offset(0, 2) = ChkBoxGroup.Value

End Sub

' this code goes into a module

Option Explicit

Dim CheckBoxes() As New ChkClass
Const numChkBoxes = 20
'

Sub doCheckBoxes()
    makeCheckBoxes
    activateCheckBoxes
End Sub

Sub makeCheckBoxes()       ' creates a column of checkBoxes

    Dim sht As Worksheet
    Set sht = ActiveSheet

    Dim i As Integer
    For i = 1 To sht.Shapes.Count
    '    Debug.Print sht.Shapes(1).Properties
        sht.Shapes(1).Delete
        DoEvents
    Next i

    Dim xSize As Integer:    xSize = 2      ' horizontal size (number of cells)
    Dim ySize As Integer:    ySize = 1      ' vertical size

    Dim t As Range
    Set t = sht.Range("b2").Resize(ySize, xSize)

    For i = 1 To numChkBoxes
        sht.Shapes.AddOLEObject ClassType:="Forms.CheckBox.1", Left:=t.Left, Top:=t.Top, Width:=t.Width - 2, Height:=t.Height
        DoEvents
        Set t = t.Offset(ySize)
    Next i

End Sub

Sub activateCheckBoxes()       ' assigns all checkBoxes on worksheet to ChkClass.ChkBoxGroup

    Dim sht As Worksheet
    Set sht = ActiveSheet

    ReDim CheckBoxes(1 To 1)

    Dim i As Integer
    For i = 1 To sht.Shapes.Count

        ReDim Preserve CheckBoxes(1 To i)
        Set CheckBoxes(i).ChkBoxGroup = sht.Shapes(i).OLEFormat.Object.Object

    Next i

End Sub

【讨论】:

  • 尤里卡!有用!!!!太感谢了!每当单击任何复选框时,我都会在类模块的底部添加一小段代码,以使 B 列与 C 列匹配。上帝保佑你,先生!
  • 我还有一个关于下一步如何使用此代码以使其用于我的主要目的的问题。我猜我应该采取的方法是将其作为一个单独的问题发布并返回到此页面?
【解决方案2】:

您只需让每个复选框的_Click() 事件知道您要运行Worksheet_SelectionChange 事件。为此,您需要在每个 _Click() sub 中添加以下行:

Call Worksheet_SelectionChange(Range("a1"))

请注意,传递给SelectionChange 子的范围无关紧要,因为您没有在代码中使用Target

【讨论】:

  • 感谢您的回复,但部分想法是不必为每个复选框编写代码,因为此表上将有 100 多个。想到这里,我的手指颤抖!不过这是个好主意。我会赞成你的回答,但显然,我对这个网站没有足够的声誉,无法让其他人接受我的投票。 :-/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多