我有一个电子表格模板,需要根据按下按钮之前勾选的复选框来运行不同的宏。我在一个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语句是如何变得非常长并且肯定不是编写它的最好方法。
答案 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)