使用循环根据选中的checkbox在Excel中运行某些macros

我有一个电子表格模板,需要运行不同的macros,在按下button之前勾选了哪个checkbox。 我在一个if语句中写了一个这样的语句,这个语句在一些checkbox中没有问题,但是为了计算所有的场景,需要构build的ifs的数量要长得多。 现在有6箱可以检查,这应该运行的所有可能性。

让我们保持简单,并调用checkboxCB1 – CB6,他们应该运行相应的macrosM1 – M6取决于哪些CB的检查,在任何组合(即,你可以select运行CB1和CB5运行M1和M5,或者你可以select全部6个运行全部6个macros)。

现在看起来像:

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语句变得非常长,当然不是编写它的最好方法。

看来你可能过于复杂的事情(或者我不完全确定你在做什么)。 如果有6个checkbox,并且勾选了checkbox1,则运行macro1。 checkbox2打勾,运行macros2等,然后你可以做一些事情,如:

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

如果checkbox名称和子名称是相关的1:1,那么创build这么多的IF条件有更好的方法。

考虑以“CB”开头的这些checkbox:
的CheckBox

使用Module1中的代码:

 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时 ,你会得到:
产量