关于多个复选框启动代码的问题

时间:2018-12-21 17:52:33

标签: vba userform

我有一个用户窗体和一个带有35个复选框的框架,编号为1到35。它们代表35个命名范围。我测试是否未设置任何名称范围,如果设置正确,则复选框值设置为TRUE。

我发现一些代码,如果单击其中一个复选框,将允许我触发一个子程序。该代码似乎有效,但是我上面的检查代码也触发了我不希望的复选框事件。我只想让子菜单在用鼠标单击复选框时运行?我可以发布正在使用的代码,但是尽管我首先会问一个问题,看看我想做的事情是否可行。

谢谢, 吉姆

Code in class module:
Public WithEvents ChkBox As MSForms.CheckBox

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

Public Sub chkBox_Click()
If chkBoxProcess = "Y" Then
    'ThisWorkbook.Worksheets("Sheet1").Range(ChkBox.Name).Value = Format(Now, "dd.mm.yyyy")
    'MsgBox ("check box number = " & ChkBox.Name & " " & ChkBox.Value)
'    Else
    End If
End Sub


Code in Forms:

Public Sub UserForm_Initialize()
Dim SheetCount, i As Integer
Dim sh As Worksheet
'Public SheetName, SheetName2, StartOldNewTimeA, OldNewTimeAdd As String

'Initialize the form frmChgNameRng
'Set array values of the day options
'Set array values for 12:00 timeframes
'Set array values for 12:30 timeframes
'Set colors used in Checkboxes
'Set array for Checkboxes (boxes are numbered accross the page, 1 corressponds to Mon_1200/Mon_1230, 8 corresponds to Mon_200/Mon_230, etc.)
'Formulas are placed in the time cells on the left of the page, the macro will add the appropriate value into the Mon_1200 time slot and all other cells update off that cell
chkBoxProcess = "N"

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
'..... lots of code for Range Name Checks, etc.
End Sub

1 个答案:

答案 0 :(得分:1)

您的代码正在将控制状态模型数据合并,因此唯一的告诉它“命名范围32为开”或“命名范围13为关”的方法“,是为了更改复选框的状态,从而触发该控件的Change事件。

没有办法解决,这只是控件的工作方式:无论值如何更改,它们都会触发Change事件,而不管它是如何完成的。

使控件的状态更改,而不是使控件的状态成为

这首先需要概念化这些数据:看起来您需要将数字/索引与某个布尔值相关联。数组可以做到这一点。

Private namedRangeStates(1 To 35) As Boolean

请注意,根据您的工作,通过在Names处理程序中迭代工作簿的UserForm_Initialize集合,初始化状态应该是可行的。或者更好的是,该表单可以公开一个采用布尔值数组的方法,并将该状态复制到namedRangeStates中。

现在,修改复选框后,使其更改状态:

Private Sub Checkbox31_Change()
    namedRangeStates(31) = Checkbox31.Value
End Sub

您的表单可以将该状态显示为属性:

Public Property Get NamedRangeState(ByVal index As Long) As Boolean
    NamedRangeState = namedRangeStates(index)
End Property

Public Property Let NamedRangeState(ByVal index As Long, ByVal value As Boolean)
    namedRangeStates(index) = value
End Property

现在,您可以独立于组合框值来修改已启用状态。