所以我想我有VBA的OK把握,但现在这个错误真的缠着我,我不能找出问题。 下面是一个极短的子程序(从一个模块运行):
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:我要改变我的问题有点像我了解有关对象的事情,但我做什么用的“发现”的方法使用它。 因此,这里的代码:
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
不成功。
的一点是, lr = Sheets(1).Range("a1", Cells(65, 1))
返回一个范围对象。
重视的对象 。 所以,你需要使用set
在一开始,丹尼尔一样。
当你分配一个对象而不set
,Excel使用默认的属性,它是Range.Value。 所以转让不抛出一个错误,只能作为一个对象不使用LR。
可能是你的范围定义是不正确的......不知道你想什么来实现有,但张(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
会弹出不同的地址干杯
丹尼尔