所以我以为我对 VBA 有很好的掌握,但现在这个错误真的让我很烦恼,我无法弄清楚问题所在。
这是一个非常短的子程序(从模块运行):
Sub test()
Dim lr
lr = Sheets(1).Range("a1", Cells(65, 1))
MsgBox lr.Address
End Sub
无论出于何种原因,这都会引发“应用程序定义/对象定义错误”
谁能解释一下?
编辑:
这也会引发同样的错误:
MsgBox Sheets(1).Range("a1", Cells(65, 1)).Address
编辑2:
我将稍微改变我的问题,因为我对对象的了解,但我用“查找”方法来使用它。
所以这里是代码:
Set lookrange = Sheets(1).Range(Cells(2, 1), Cells(200, 1))
Set result = lookrange.Find(what:=searchTerm, lookat:=xlWhole)
在这种情况下,它告诉我lookrange 引起了问题。
最佳答案
好的。你有几个问题。
Option Explicit
sub test()
Dim lr as Range
set lr = Sheets(1).Range("a1", Cells(65, 1))
MsgBox lr.Address
End Sub
首先,作为 VBA 新手,请使用
Option Explicit
几乎总是在模块的顶部,因此您需要确定变量的尺寸。第二,你从来不声明
lr
作为对象类型 - 确保将其声明为类型 Range
- 您不一定必须这样做,但是,这是一种很好的做法。三、需要使用
set
正如其他人在分配对象时指出的那样,例如 Range
值,否则您将始终收到该错误。到你问题的第二部分。
MsgBox Sheets(1).Range("a1", Cells(65, 1)).Address
将此更改为
With Sheets(1)
MsgBox .Range(.Range("A1"), .Cells(65, 1)).Address
End With
如果您曾经从不同于
Sheet1
的工作表运行它你会得到错误,因为 Cells(65,1)
引用不会出现在 Sheet1
- Excel 会认为您的意思是当前工作表。第三部分
Set lookrange = Sheets(1).Range(Cells(2, 1), Cells(200, 1))
Set result = lookrange.Find(what:=searchTerm, lookat:=xlWhole)
与第二部分有相同的问题。另请注意,如果
result
,您完全有可能会运行错误。如果 Find
找不到,上面的第二个语句(Find
的结果)将导致错误不成功。
关于excel - vba 简单范围/对象错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12711519/