2015-11-03 111 views
0

我有一个电子表格模板,需要运行不同的宏,根据在按下按钮之前勾选了哪些复选框。我在一个if语句中写了一个if语句,这个语句在一些复选框中没有问题,但是为了解决所有场景中需要构建的ifs的数量会呈指数级增长。现在有6个盒子可以检查,这应该运行所有的可能性。使用循环根据选中的复选框在Excel中运行某些宏

让我们保持简单并调用复选框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 

但你可以看到书面如果每一个场景说法变得很长,肯定不会写它的最佳方式。

+0

“ElseIf ActiveShee t.CheckBoxes(“CB1”)。Value = 1_ 和ActiveSheet.CheckBoxes(“CB1”)。Value = 0 Then'不会发生 – sous2817

+0

你是什么意思?这是目前如何工作的一个例子。 – wmab

+0

复选框(“CB1”)不能同时为1和0。你有一个错字。它应该是复选框(“CB2”).Value = 1和复选框(“CB1”)。值= 0.无论哪种方式,我认为有一个更简单的方法(正如我在我的答案中概述) – sous2817

回答

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 
+0

如果所有这些都失败,您是否需要使用.value = 0的全部6个选项来执行elseif以获得消息框? – wmab

+0

@wmab看我的编辑。有很多方法可以做到这一点,但我认为这可能是最简单最容易遵循的方式。 – sous2817

+0

谢谢@ sous2817工作!我必须将ActiveSheet更新为表单(“表单1”),因为宏指向不同的表单,因此无法找到它在当前活动表单上查找的复选框,但运行良好,线路比我的第一次尝试少很多! – wmab

1

如果该复选框名称和子名称都与1:1,有一个更好的方法,然后创造这么多的IF条件。

考虑这些复选框命名为 “CB” 开始:模块1
CheckBoxes

随着代码在

Option Explicit 

Private Const PREFIX As String = "Module1.M" ' <-- Change this to match your Module Name and Prefix of the Sub Names 

Sub LoopCheckboxes() 
    Dim sRun As String, oChkBox As Object 
    For Each oChkBox In ActiveSheet.CheckBoxes 
     With oChkBox 
      Debug.Print "Checkbox name: " & .Name 
      If .Value = 1 Then 
       sRun = PREFIX & Mid(.Name, 3) 
       Debug.Print "sRun: " & sRun 
       Application.Run sRun 
      End If 
     End With 
    Next 
End Sub 

Sub M1() 
    Debug.Print "M1()" 
End Sub 

Sub M2() 
    Debug.Print "M2()" 
End Sub 

Sub M3() 
    Debug.Print "M3()" 
End Sub 

当您执行LoopCheckBoxes,您可以:
Output

+0

嘿谢谢@PatricK!他们没有完全用这种方式标记,但我可以轻松更新它们。我需要根据这些选择构建一些宏来做不同的事情,所以下次我会尝试你的方法,非常感谢! – wmab

+1

欢迎@wmab。顺便说一句,请不要使用该复选框名称约定,因为“** CB1 **”是有效的单元格地址。也许“** CB_1 **”是更好的方法。 – PatricK