【问题标题】:Running at once multiple Subs from an unique VBA Sub从唯一的 VBA 子程序一次运行多个子程序
【发布时间】:2014-01-21 10:03:50
【问题描述】:

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

【问题讨论】:

  • 您的代码是正确的。 Unprotectworkbook sub 中可能有一些内容,因此您需要将其代码添加到您的问题中。您的工作簿中是否有任何会影响代码执行的事件?
  • 你能显示Unprotectworkbook的代码吗?
  • 如果看不到您的subs 的内容,很难回答您的问题。这就像蒙着眼睛大海捞针。
  • 使用您的逻辑,无需过多更改代码,只需将End 更改为Exit ForExit Sub

标签: vba excel subroutine


【解决方案1】:

修改你的代码如下(将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

【讨论】:

    【解决方案2】:

    如果不查看所有三个子中的代码,很难回答您的问题。

    一些建议:

    1. 您无需选择每个工作表来修改它 - 只需在 for 循环中使用 Sheet(i).Unprotect "password" 即可。

    2. 1234563换句话说,删除If i = myCount Then End 部分。
    3. 您可以像下面这样定义 For 循环:For i = 1 To Application.Sheets.Count 以简化您的代码,然后您可以删除 myCount 变量。

    4. 您应该始终使用数据类型定义变量以尽量减少错误,例如改用 Dim i As Integer

    5. 总是在每个模块的顶部使用Option Explicit,也可以尽量减少因拼写错误等引起的混乱和错误。

    我强烈建议您阅读一些有关 VBA 的教程,其中有很多。以下只是搜索时第一个上去的,我没试过:Excel VBA Basic Tutorial 1

    【讨论】:

      【解决方案3】:

      如果这有帮助,我建议先制作另外一组 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
      

      【讨论】:

        猜你喜欢
        • 2022-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-29
        • 1970-01-01
        相关资源
        最近更新 更多