VBA - 循环中的每个复选框对一个人改变时的反应,如何停止?

时间:2016-07-01 14:49:18

标签: excel excel-vba checkbox vba

我是VBA的新手。我搜索了很长时间才找到一种方法来获得无限(不同)数量的ActiveX复选框,但是没有相应数量的_click subs但是我无法使它工作。

我以为我找到了使用Form Controls的方法,但它似乎并不完美。这是我单击cbxReady的代码(项目准备就绪时的复选框,只有勾选cbxStart时才能勾选):

LastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row

For s = 1 To LastRow - 2
    If ActiveSheet.CheckBoxes("cbxReady" & s).Value = 1 Then
        ActiveSheet.Cells(s + 2, "A").Interior.Color = RGB(255, 255, 0)
    ElseIf ActiveSheet.CheckBoxes("cbxReady" & s).Value = -4146 Then
        ActiveSheet.Cells(s + 2, "A").Interior.Color = RGB(218, 238, 243)
    End If
Next

这是cbxStart:

LastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row

For s = 1 To LastRow - 2
    If ActiveSheet.CheckBoxes("cbxStart" & s).Value = 1 Then
        ActiveSheet.Cells(s + 2, "A").Interior.Color = RGB(218, 238, 243)
        With ActiveSheet.CheckBoxes("cbxReady" & s)
            .Enabled = True
            .Value = -4146
        End With
    ElseIf ActiveSheet.CheckBoxes("cbxStart" & s).Value = -4146 Then
        ActiveSheet.Cells(s + 2, "A").Interior.Color = RGB(255, 0, 0)
        With ActiveSheet.CheckBoxes("cbxReady" & s)
            .Enabled = False
            .Value = 2
        End With
    End If
Next

这个想法是复选框被命名为cbxStart和cbxReady从1到任意,当我点击cbxStart时,A列中的单元格(通过颜色编码指示项目的状态)将变为蓝色,然后如果我单击cbxReady然后它会变黄。到现在为止还挺好。

然而,这发生了:
第一行,两者都勾选,颜色为黄色,一切都很好;
第二行,两者都未被攻击,我勾选cbxStart,它变成蓝色但是第一行也变为蓝色,以及它的cbxReady取消。

所以基本上,即使复选框的命名方式不同,每个复选框都会对untick事件做出反应。

有人可以帮帮我吗?如果使用ActiveX更容易,我也很感激,我只想每个复选框类型有一个代码,因为我不知道我将拥有多少代码,我希望他们引用一个cbxStart_click()和一个cbxReady_click()。

谢谢!

1 个答案:

答案 0 :(得分:0)

这样做的诀窍是拥有一个处理Click事件的类。

MyCheckBox类

Private WithEvents Check  As MSForms.CheckBox

Private Sub Check_Click()
    MsgBox Check.Object.Value
End Sub

Public Sub SetCheckBox(ck As OLEObject)
    Set Check = ck.Object
End Sub

接下来,您需要将每个检查添加到新的MyCheckBox类,并将MyCheckBox添加到模块级别集合。

Public Checks As Collection

Private Sub AddCheckboxes()
    Dim o As OLEObject
    Dim ck As MyCheckBox
    Set Checks = New Collection
    For Each o In ActiveSheet.OLEObjects
        Set ck = New MyCheckBox
        ck.SetCheckBox o
        Checks.Add ck
    Next
End Sub

现在,只要点击一个复选框,就会调用Private Sub Check_Click()