所以我认为我对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
EDIT2: 我将稍微改变一下我的问题,因为我理解对象的东西,但我用“find”方法使用它。 所以这是代码:
Set lookrange = Sheets(1).Range(Cells(2, 1), Cells(200, 1))
Set result = lookrange.Find(what:=searchTerm, lookat:=xlWhole)
在这种情况下,它告诉我lookrange导致问题。
答案 0 :(得分:3)
确定。你有几个问题。
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
的结果)将导致错误。
答案 1 :(得分:0)
可能你的范围定义不正确...不确定你想要在那里实现什么但是sheet(1).range(myrange)返回一个范围对象。
Sub tetPop()
Call popAddress(10, 12)
Call popAddress(14, 21)
Call popAddress(11, 18)
End Sub
Sub popAddress(ByVal row As Integer, ByVal col As Integer)
Dim lr As Range
Set lr = Sheets(1).Range("a1", Cells(row, col))
MsgBox lr.Address
' or better and direct
MsgBox Sheets(1).Range("a1", Cells(row, col)).Address
End Sub
弹出不同的地址 干杯
丹尼尔
答案 2 :(得分:0)
重点是lr = Sheets(1).Range("a1", Cells(65, 1))
返回一个范围对象
强调对象。所以你需要在开始时使用set
,就像Daniel所做的那样
在没有set
的情况下分配该对象时,Excel使用默认属性Range.Value。因此赋值不会抛出错误,只使用lr作为对象。