使用循环基于选中的复选框在Excel中运行某些宏

时间:2015-11-03 02:32:41

标签: excel vba excel-vba

我有一个电子表格模板,需要根据按下按钮之前勾选的复选框来运行不同的宏。我在一个if语句中写了这个,这对于几个复选框来说很好,但是为了计算所有场景需要构建的ifs数量会成倍增长。现在有6个盒子可以检查,这应该适用于所有可能性。

让我们保持简单,并调用复选框CB1 - CB6,他们应该运行相应的宏M1 - M6,具体取决于检查哪个CB,任意组合(即,你可以选择运行CB1和CB5来运行M1和M5 ,或者你可以选择全部6来运行所有6个宏。)

现在看起来像:

Sub Checkboxes()
If ActiveSheet.CB("CB1").Value = 1_
and ActiveSheet.CB("CB2").Value = 1 Then
Call M1
Call M2
ElseIf ActiveSheet.CheckBoxes"CB1").Value = 1_
And ActiveSheet.CheckBoxes("CB2").Value = 0 Then
Call M1
ElseIf ActiveSheet.CheckBoxes("CB2").Value = 1_
And ActiveSheet.CheckBoxes("CB1").Value = 0 Then
Call M2
Else: MsgBox "Please select at least one option to proceed."
End If
End Sub

但是你可以看到为每个场景写一个if语句是如何变得非常长并且肯定不是编写它的最好方法。

2 个答案:

答案 0 :(得分:1)

看起来你可能会让事情变得复杂(或者我并不完全确定你之后的事情)。如果有6个复选框,并且勾选了checkbox1,请运行macro1。勾选checkbox2,运行宏2等,然后你可以做类似的事情:

If ActiveSheet.CB("CB1").Value = 1 then Call M1
If ActiveSheet.CB("CB2").Value = 1 then Call M2
If ActiveSheet.CB("CB3").Value = 1 then Call M3
If ActiveSheet.CB("CB4").Value = 1 then Call M4
If ActiveSheet.CB("CB5").Value = 1 then Call M5
If ActiveSheet.CB("CB6").Value = 1 then Call M6

右?不应该是一个长期的,抽出的理由" If,elseif"条款涵盖不同的情景。

要检查是否有任何代码运行,这是一种方法。有更优雅的方式,但这应该让你开始,并且很容易让你看到发生了什么,并在需要时扩展一点。随着您获得VBA的更多经验,您无疑会将其重构为更优雅。

Sub Test()
Dim AtLeastOneRan As Boolean

    If ActiveSheet.CB("CB1").Value = 1 Then
        AtLeastOneRan = True
        Call M1
    End If

    If ActiveSheet.CB("CB2").Value = 1 Then
        AtLeastOneRan = True
        Call M2
    End If

    If ActiveSheet.CB("CB3").Value = 1 Then
        AtLeastOneRan = True
        Call M3
    End If

    If ActiveSheet.CB("CB4").Value = 1 Then
        AtLeastOneRan = True
        Call M4
    End If

    If ActiveSheet.CB("CB5").Value = 1 Then
        AtLeastOneRan = True
        Call M5
    End If

    If ActiveSheet.CB("CB6").Value = 1 Then
        AtLeastOneRan = True
        Call M6
    End If
    If Not AtLeastOneRan Then MsgBox "Please select at least one option to proceed."
End Sub

答案 1 :(得分:1)

如果复选框名称和子名称以1:1相关,那么创建如此多的IF条件会有更好的方法。

考虑这些以“CB”开头的复选框:
CheckBoxes

代码位于 Module1

var data = $('#data_1'); 
if(jQuery.contains(document.documentElement, data[0])){
    // #data_1 element attached to DOM
} else {
    // is not attached to DOM
}

当您执行 LoopCheckBoxes 时,您会得到:
Output