立即运行多个子从一个独特的VBA子

我在VBA模块中有三个不同的子系统可用,并且想要通过一个VBAbutton激活一个独特的子系统来调用这些子系列。

下面的代码运行:

Sub Updateworkbook() Call Unprotectworkbook Call CopyAndPaste Call Protectworkbook End Sub 

第一个Sub Unprotectworkbook()运行后,另一个Sub不被调用和执行。 为什么会发生?

Unprotectworkbook()子代码下面供您参考

 Sub Unprotectworkbook() Dim myCount Dim i myCount = Application.Sheets.Count Sheets(1).Select For i = 1 To myCount ActiveSheet.Unprotect "password" If i = myCount Then End End If ActiveSheet.Next.Select Next i End Sub 

修改您的代码,如下所示(将End更改为Exit Sub ):

 Sub Unprotectworkbook() Dim myCount Dim i myCount = Application.Sheets.Count Sheets(1).Select For i = 1 To myCount ActiveSheet.Unprotect "password" If i = myCount Then Exit Sub End If ActiveSheet.Next.Select Next i End Sub 

或者您可以简单地将其更改为下一个:

 Sub Unprotectworkbook() Dim sh For Each sh In Sheets sh.Unprotect "password" Next End Sub 

没有看到所有三个子代码,很难回答你的问题。

一些指针虽然:

  1. 您不需要select每个工作表来修改它 – 只需使用Sheet(i).Unprotect "password" 。而不是在for循环中Sheet(i).Unprotect "password"

  2. 另外,因为你有一个for循环,所以如果你已经正确的定义了For i = 1 To myCount语句,你不需要编码什么时候结束。 换句话说,删除If i = myCount Then End部分。

  3. 你可以像下面那样定义For循环: For i = 1 To Application.Sheets.Count简化你的代码,你可以删除myCountvariables。

  4. 您应该始终使用数据types定义您的variables,以最大限度地减less错误,例如使用Dim i As Integer代替。

  5. 始终在每个模块的顶部使用Option Explicit ,以最大限度地减less由拼写错误等引起的混淆和错误。

我强烈build议你在VBA上运行几个教程,周围有很多。 以下是search时仅有的第一个,我还没有尝试过: Excel VBA基础教程1

如果这有帮助的话,我build议先制作另外一组3个零件来testing空白项目。 否则使用上面的其他答案之一。

 Sub msgTEST0() 'Call msgTEST0 Call msgTEST1 Call msgTEST2 Call msgTEST3 End Sub Sub msgTEST1() MsgBox "MSG1" & Space(10), vbQuestion End Sub Sub msgTEST2() MsgBox "MSG2" & Space(10), vbQuestion End Sub Sub msgTEST3() MsgBox "MSG3" & Space(10), vbQuestion End Sub