我在Excel背景下学习了3周的新手学习VBA(30年前我在Pascal的最后一次编程课程之后。)我无法理解为什么有时执行一些涉及工作表的代码需要该工作表被激活。我的具体问题,通过一些玩具代码:
Public Sub Test()
Dim Rng As Range
Set Rng = Worksheets("Sheet2").Range(Cells(1, 1), Cells(5, 1)).Find(What:="Prize",LookIn:=xlValues)
If Rng Is Nothing Then
MsgBox "Nothing there"
Else
MsgBox "Found the prize"
End If
End Sub
如果我在Sheet1处于活动状态时调用Test()(例如通过Sheet1上的UserForm),我会得到一个"应用程序定义或对象定义的错误"。如果Sheet2处于活动状态,则代码可以正常运行。
为什么Sheet2必须处于活动状态才能执行此代码?我可以通过激活sub中的Sheet2然后再次激活Sheet 1来解决这个问题,但这看起来很笨拙。还有更好的方法吗?
感谢您的帮助!我在实际代码中遇到了其他类似的激活问题。
答案 0 :(得分:1)
由于您没有为Cells指定工作表,因此该对象将引用活动工作表。但是您的Range明确定义为引用Sheet2。由于存在冲突,因此会产生错误。
使用该语法,您可以执行以下操作:
With Worksheets("Sheet2")
Set Rng = range(.Cells(1,1),.Cells(5,1)).Find(...
end with