Excel VBA多个复选框激活部分代码
我正在处理的VBA代码当前一次更新一个Worksheet上的六个不同的数据表 - 它删除密码保护,计算第一个数据表,硬编码值并移动到下一个,然后再锁定一切,并说谢谢。Excel VBA多个复选框激活部分代码
其目的是让一个宏能够“分离”处理单个数据表的代码的六个部分,使得它只更新已由用户选择的那些数据表,同时保留单个代码(不是每个选项的单独子),并且通过单个CommandButton激活整个过程。
为了达到这个目的,除了编写实际的代码之外,我创建了一个UserForm,并插入了六个CheckBox和一个CommandButton,但是如何进一步处理它。如何根据选中的框激活/禁用部分代码?
所以在VBA中有事件监听器。这可以在工具栏下面编辑器的上半部分看到。下拉到左边是对象。下降到正确的事件。
快速方法是查看用户窗体并双击该对象。这将根据该操作为该对象创建一个Private Sub
。所以下面的代码是一个带有三个选项按钮的用户窗体。与你相同的逻辑只需插入你需要的代码。
Private Sub OptionButton1_Click()
MsgBox "1"
End Sub
Private Sub OptionButton2_Click()
MsgBox "2"
End Sub
Private Sub OptionButton3_Click()
MsgBox "3"
End Sub
此外,如果选项按钮是通过检查其.Value
属性选择,您可以检查。检查后运行一些代码。
Private Sub CommandButton1_Click()
If UserForm1.OptionButton1.Value = True Then
'Execute Code
ElseIf UserForm1.OptionButton2.Value = True Then
'Execute Code
Else
'Execute Code
End If
End Sub
代码在模块1
Private Sub select_column_a()
Range("A:A").Select
End Sub
呼叫内的另一个子
Private Sub CommandButton1_Click()
Module1.select_column_a
End Sub
感谢你的支持 - 在试用过程中。但有一点 - 代码是在第一单元中,在开始时,整个工作簿被逐一解锁,一些准备工作被解锁,然后我想用UserForm带上复选框和CommandButton。你是说我应该将整个代码输入到Button的Private Sub中?我希望通过单击工作表上的按钮来调用用户窗体,选择选项(复选框),然后让CommandButton激活代码的其余部分,并将这些框的值考虑在内。 –
那么你可以在Module1中保留一个Private Sub并在Userform中调用它。代码将运行或可以被调用,不管它是私人的还是锁定的表格。 – fcsr
你甚至可以命名Subs相同的名称,只要它们在不同的模块中,然后用模块名称调用它们。 Module1.subber和Module2.subber – fcsr
@fscr再次感谢你 - 就像一个魅力,与一些补充,这就是为什么我张贴这里是为了像我这样的其他初学者的利益。
在一个命令我插入表子很简单:
Private Sub CommandButton1_Click()
UserForm1.Show
End Sub
这说明所有的复选框我UserForm1和一个命令按钮说:“去”
GO按钮(也CommandButton1的 - 有没有冲突)有这里面:
Private Sub CommandButton1_Click()
code
End Sub
其中的代码是我的代码名称存储在模块1(是的,我没有...) - 它顺利执行它没有任何九月愤怒的召唤功能。这里的问题,可能存在向后兼容性问题?我在Excel 2016中工作,并了解到,例如ISFORMULA在这里是新的,并抛出旧机器上的问题。
那么整个代码踢在
Sub code()
UserForm1.Hide
其次是各种行动,直到它到达我的复选框,上述的建议(以ammendments):
Application.Cursor = xlWait
Application.DisplayStatusBar = True
Application.StatusBar = "Calculating Sensitivities..."
Application.EnableCancelKey = xlDisabled
If UserForm1.CheckBox1.Value = True Then
Range("A6:G15").Select
Selection.Table ColumnInput:=Range("AD3")
Application.Calculate
Range("B7:G15").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
ElseIf UserForm1.CheckBox2.Value = True Then
Range("AD17:AM26").Select
Selection.Table ColumnInput:=Range("AD2")
Application.Calculate
Range("AE18:AM26").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
等。
的代码执行剩余的选项选中,然后是结束如果和其他代码(清理,锁定表等),直到
Application.ScreenUpdating = True
Application.EnableCancelKey = xlEnabled
End Sub
都没有任何错误。再次感谢你!
RE your mod flag:首先,收到答案并不一定表明您的问题对我们的格式而言是明确的或可接受的。回答者可能刚刚猜对。这个问题对我来说是有问题的,即使是现在的格式,至少有两个原因:(1)它不包括使我们“现在拥有”的(mcve),(2)它几乎肯定是“太宽泛“,因为一个好的答案将不得不向你解释VBA编程的基础知识,这实际上比我们预期的Stack Overflow的答案要多。 –
至于为什么你的编辑后的问题被置于“搁置”没有导致重新开放......它实际上[把问题放在重新打开的队列中](https://*.com/review/reopen/16920148),社区成员审查您的编辑并确定他们不足以激发重新开放问题。作为主持人,我不愿意推翻值得信赖的社区成员,尤其是考虑到我的保留意见,这个问题太广泛了。通常情况下,你可以缩小一点,但得到答案后很难。这就是为什么我们尽早关闭。 –
不够公平,我承认这是一个非常基本的问题,并且在内容上表达了一些措辞...... –