Excelmacros用户窗体 – 单个代码处理多个checkbox

我有一个用户forms,看起来像下面的图像,命名约定来确定级别和职位(如上面的图片示例)。 我也有下面的代码,但是我还没有为每个“端口”checkbox添加代码,最后我会根据它们是否插入/删除特定于每个checkbox的值检查/未核对。

我想知道以下几点:

  • 条件基于检查或取消选中一个checkbox更好的select,通过阅读是否检查/不检查(如我在下面做的),或在“滴答作响”?

  • 我可以缩短表单上任何checkbox的动作的次数或次数,而不是编码每一个(我最终将分配一个值到一个数组(或几个)删除一个)基于什么检查(或未检查))?

  • 如果#2有可能,我可以把一个checkbox的名称的一部分(比如前4或6个字符)作为一个值来确定我正在处理的内容吗?

我一直盯着这个这么长时间,我有点脑死亡 – 我不知道我是否在这里问正确的问题,还有什么要问。 本质上,我想避免重复一遍又一遍的相同的事情(就像我现在所做的那样)。

Private Sub UserForm_Initialize() Dim chBox As Control Dim comboBox As Control Dim arrFreq() As String Dim i As Long 'Use the Split function to create two zero based one dimensional arrays. arrFreq = Split("Unused|700|850|1900|2100", "|") For Each comboBox In ADSinputform.Controls If TypeOf comboBox Is MSForms.comboBox Then For i = 0 To UBound(arrFreq) 'Use .List property to write array data to all the comboBoxes comboBox.List = arrFreq Next i End If Next 'Empty NameTextBox SiteNameTextBox.Value = siteName End Sub Private Sub AlphaSectCheckbox_Click() If AlphaSectCheckbox.Value = True Then AlphaAnt_Frame.Visible = True If AlphaSectCheckbox.Value = False Then AlphaAnt_Frame.Visible = False For Each chBox In AlphaAnt_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub BetaSectCheckbox_Click() If BetaSectCheckbox.Value = True Then BetaAnt_Frame.Visible = True If BetaSectCheckbox.Value = False Then BetaAnt_Frame.Visible = False For Each chBox In BetaAnt_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub GammaSectCheckbox_Click() If GammaSectCheckbox.Value = True Then GammaAnt_Frame.Visible = True If GammaSectCheckbox.Value = False Then GammaAnt_Frame.Visible = False For Each chBox In GammaAnt_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub DeltaSectCheckbox_Click() If DeltaSectCheckbox.Value = True Then DeltaAnt_Frame.Visible = True If DeltaSectCheckbox.Value = False Then DeltaAnt_Frame.Visible = False For Each chBox In DeltaAnt_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub A1Checkbox_Click() If A1Checkbox.Value = True Then A1Port_Frame.Visible = True If A1Checkbox.Value = False Then A1Port_Frame.Visible = False For Each chBox In A1Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub A2Checkbox_Click() If A2Checkbox.Value = True Then A2Port_Frame.Visible = True If A2Checkbox.Value = False Then A2Port_Frame.Visible = False For Each chBox In A2Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub A3Checkbox_Click() If A3Checkbox.Value = True Then A3Port_Frame.Visible = True If A3Checkbox.Value = False Then A3Port_Frame.Visible = False For Each chBox In A3Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub A4Checkbox_Click() If A4Checkbox.Value = True Then A4Port_Frame.Visible = True If A4Checkbox.Value = False Then A4Port_Frame.Visible = False For Each chBox In A4Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub A5Checkbox_Click() If A5Checkbox.Value = True Then A5Port_Frame.Visible = True If A5Checkbox.Value = False Then A5Port_Frame.Visible = False For Each chBox In A5Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub A6Checkbox_Click() If A6Checkbox.Value = True Then A6Port_Frame.Visible = True If A6Checkbox.Value = False Then A6Port_Frame.Visible = False For Each chBox In A6Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub B1Checkbox_Click() If B1Checkbox.Value = True Then B1Port_Frame.Visible = True If B1Checkbox.Value = False Then B1Port_Frame.Visible = False For Each chBox In B1Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub B2Checkbox_Click() If B2Checkbox.Value = True Then B2Port_Frame.Visible = True If B2Checkbox.Value = False Then B2Port_Frame.Visible = False For Each chBox In B2Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub B3Checkbox_Click() If B3Checkbox.Value = True Then B3Port_Frame.Visible = True If B3Checkbox.Value = False Then B3Port_Frame.Visible = False For Each chBox In B3Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub B4Checkbox_Click() If B4Checkbox.Value = True Then B4Port_Frame.Visible = True If B4Checkbox.Value = False Then B4Port_Frame.Visible = False For Each chBox In B4Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub B5Checkbox_Click() If B5Checkbox.Value = True Then B5Port_Frame.Visible = True If B5Checkbox.Value = False Then B5Port_Frame.Visible = False For Each chBox In B5Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub B6Checkbox_Click() If B6Checkbox.Value = True Then B6Port_Frame.Visible = True If B6Checkbox.Value = False Then B6Port_Frame.Visible = False For Each chBox In B6Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub C1Checkbox_Click() If C1Checkbox.Value = True Then C1Port_Frame.Visible = True If C1Checkbox.Value = False Then C1Port_Frame.Visible = False For Each chBox In C1Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub C2Checkbox_Click() If C2Checkbox.Value = True Then C2Port_Frame.Visible = True If C2Checkbox.Value = False Then C2Port_Frame.Visible = False For Each chBox In C2Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub C3Checkbox_Click() If C3Checkbox.Value = True Then C3Port_Frame.Visible = True If C3Checkbox.Value = False Then C3Port_Frame.Visible = False For Each chBox In C3Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub C4Checkbox_Click() If C4Checkbox.Value = True Then C4Port_Frame.Visible = True If C4Checkbox.Value = False Then C4Port_Frame.Visible = False For Each chBox In C4Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub C5Checkbox_Click() If C5Checkbox.Value = True Then C5Port_Frame.Visible = True If C5Checkbox.Value = False Then C5Port_Frame.Visible = False For Each chBox In C5Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub C6Checkbox_Click() If C6Checkbox.Value = True Then C6Port_Frame.Visible = True If C6Checkbox.Value = False Then C6Port_Frame.Visible = False For Each chBox In C6Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub D1Checkbox_Click() If D1Checkbox.Value = True Then D1Port_Frame.Visible = True If D1Checkbox.Value = False Then D1Port_Frame.Visible = False For Each chBox In D1Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub D2Checkbox_Click() If D2Checkbox.Value = True Then D2Port_Frame.Visible = True If D2Checkbox.Value = False Then D2Port_Frame.Visible = False For Each chBox In D2Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub D3Checkbox_Click() If D3Checkbox.Value = True Then D3Port_Frame.Visible = True If D3Checkbox.Value = False Then D3Port_Frame.Visible = False For Each chBox In D3Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub D4Checkbox_Click() If D4Checkbox.Value = True Then D4Port_Frame.Visible = True If D4Checkbox.Value = False Then D4Port_Frame.Visible = False For Each chBox In D4Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub D5Checkbox_Click() If D5Checkbox.Value = True Then D5Port_Frame.Visible = True If D5Checkbox.Value = False Then D5Port_Frame.Visible = False For Each chBox In D5Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub Private Sub D6Checkbox_Click() If D6Checkbox.Value = True Then D6Port_Frame.Visible = True If D6Checkbox.Value = False Then D6Port_Frame.Visible = False For Each chBox In D6Port_Frame.Controls If TypeOf chBox Is MSForms.CheckBox Then chBox.Value = False Next End If End Sub 

checkbox命名约定:

 In "Sectors" frame: "AlphaSectCheckbox", "BetaSectCheckbox", "GammaSectCheckbox", "DeltaSectCheckbox" In "Antennas" frames: (Alpha) "A1Checkbox", "A2Checkbox", "A3Checkbox", etc / (Beta) "B1Checkbox", "B2Checkbox", "B3Checkbox", etc / (Gamma) "C1Checkbox", "C2Checkbox", "C3Checkbox", etc, etc In "Port" frames: (Alpha - Ant 1) "A1P1Checkbox", "A1P2Checkbox", etc / (Alpha - Ant 2) "A2P1Checkbox", "A2P2Checkbox", etc / (Beta - Ant1) "B1P1Checkbox", "B1P2Checkbox", etc / (Beta Ant2) "B2P1Checkbox", "B2P2Checkbox", etc / (Gamma - Ant1) "C1P1Checkbox", "C1P2Checkbox", etc, etc 

在这里输入图像说明

在这里输入图像说明

在这里输入图像说明

=========================编辑1/11/2016这是我在sous2817回答后实施的,这个工程很好,我可以继续从这里与一小部分的代码。 这是一个名为“clsUFCheckBox”的新类模块:

 Option Explicit Public WithEvents aCheckBox As msforms.CheckBox Private Sub aCheckBox_Click() Dim chBox As Control Dim actFrmStr As String MsgBox aCheckBox.Name & " was clicked" & vbCrLf & vbCrLf & _ "It refers to the frame: " & aCheckBox.Tag & vbCrLf & vbCrLf & _ "Its Checked State is currently " & aCheckBox.Value, vbInformation + vbOKOnly, _ aCheckBox.Name & " & State" actFrmStr = aCheckBox.Tag If aCheckBox.Value = True Then ADSinputform.Controls(actFrmStr).Visible = True If aCheckBox.Value = False Then ADSinputform.Controls(actFrmStr).Visible = False For Each chBox In ADSinputform.Controls(actFrmStr).Controls If TypeOf chBox Is msforms.CheckBox Then chBox.Value = False Next End If End Sub 

这太长了评论,但希望它会让你接近(或至less开始)的解决scheme。

首先,为您的项目添加一个类。 在这个例子中,我调用的是clsUFCheckBox。 将以下代码添加到该类中:

 Option Explicit Public WithEvents aCheckBox As msforms.CheckBox Private Sub aCheckBox_Click() MsgBox aCheckBox.Name & " was clicked" & vbCrLf & vbCrLf & _ "Its Checked State is currently " & aCheckBox.Value, vbInformation + vbOKOnly, _ "Check Box # & State" End Sub 

上面创build一个点击事件,将被激发到集合中的每个checkbox(即将到来)。 此testing代码将显示一个消息框,告诉您单击了哪个checkbox以及当前状态是什么。 显然你会改变这个以适应你所需要的任何逻辑来解决你当前的问题,但这会让你开始。

现在,在你的用户表单代码中,在顶部添加这行(在你的Option Explicit行下面)

 Dim myCheckBoxes() As clsUFCheckBox 

这将创build一个上面创build的类的数组,以将所有checkbox保留在窗体上。 现在在你的Userform_Initialize()事件中,添加下面的代码:

 Dim ctl As Object, pointer As Long ReDim myCheckBoxes(1 To Me.Controls.Count) For Each ctl In Me.Controls If TypeName(ctl) = "CheckBox" Then pointer = pointer + 1 Set myCheckBoxes(pointer) = New clsUFCheckBox Set myCheckBoxes(pointer).aCheckBox = ctl End If Next ctl ReDim Preserve myCheckBoxes(1 To pointer) 

此代码将循环遍历用户窗体上的所有控件,并将checkbox添加到上面创build的数组中。 另外,由于您将所有checkbox与您创build的类关联,因此您可以为它们提供常见的点击事件。 所以你点击每个checkbox,运行相同的点击事件。

所以你去了 在开始时创build的几十个和几十个checkbox,它们都运行相同的_click()事件。 您可以将逻辑放在该单个事件中来处理每个分组。 好的是,您只需编写一次代码,而不必将其添加到每个单独的checkbox_click事件中。

如果你需要一个testing工作簿,所以你可以看到所有的连接,让我知道,我会看看如果我能find一个地方上传一个供您审查。

希望有所帮助。 如果你被卡住,请回邮,我们会继续殴打它。

你可以像这样调用一个处理函数,每个checkbox只传递一个键string。 然后把所有类似的代码放到处理相关帧的处理函数中

 Private Sub cbA1_Click() handleCB ("A1") End Sub Private Sub cbA2_Click() handleCB ("A2") End Sub Public Function handleCB(cb As String) Dim formObj As Control Set formObj = Me("cb" & cb) MsgBox formObj.Name & Chr(10) & formObj.Value 'do code with the other controls that have the string cb in them 'such as your frames etc End Function 

更改/点击事件不应该太重要