我在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
答案 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)
如果没有看到所有三个潜艇中的代码,就很难回答你的问题。
但有些指示:
您无需选择每张工作表进行修改 - 只需在for循环中使用Sheet(i).Unprotect "password"
即可。
此外,由于您有一个for循环,因此如果您已正确定义For i = 1 To myCount
语句,则不需要在应该结束时进行编码。换句话说,请删除If i = myCount Then End
部分。
您可以像以下内容一样定义For循环:For i = 1 To Application.Sheets.Count
以简化代码,然后您可以删除myCount
变量。
您应始终使用数据类型定义变量,以便最大限度地减少错误,例如使用Dim i As Integer
。
始终在每个模块的顶部使用Option Explicit
,以尽量减少因拼写错误等造成的混淆和错误。
我强烈建议你在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