从唯一的VBA Sub立即运行多个Subs

时间:2014-01-21 10:03:50

标签: excel vba excel-vba subroutine

我在VBA模块中有三个不同的Subs,并希望从通过VBA按钮激活的唯一Sub调用这些Subs系列。

运行代码下方:

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

3 个答案:

答案 0 :(得分:2)

按如下方式修改代码(将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 :(得分:1)

如果没有看到所有三个潜艇中的代码,就很难回答你的问题。

但有些指示:

  1. 您无需选择每张工作表进行修改 - 只需在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以简化代码,然后您可以删除myCount变量。

  4. 您应始终使用数据类型定义变量,以便最大限度地减少错误,例如使用Dim i As Integer

  5. 始终在每个模块的顶部使用Option Explicit,以尽量减少因拼写错误等造成的混淆和错误。

  6. 我强烈建议你在VBA上运行几个教程,有很多东西。以下是搜索时的第一个,我还没有尝试过:Excel VBA Basic Tutorial 1

答案 2 :(得分:1)

如果这有帮助,我建议先制作另一组3个子测试来测试空白项目。否则请使用上述其他答案之一。

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