我有一个用户窗体和一个带有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
答案 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
现在,您可以独立于组合框值来修改已启用状态。