1

所以我以为我对 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:根据我对对象事物的理解,我将稍微改变我的问题,但我将如何使用“查找”方法来使用它。所以这里是代码:

Set lookrange = Sheets(1).Range(Cells(2, 1), Cells(200, 1))
Set result = lookrange.Find(what:=searchTerm, lookat:=xlWhole)

在这种情况下,它告诉我lookrange 引起了问题。

4

3 回答 3

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

于 2012-10-03T16:20:34.950 回答
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

会弹出不同的地址干杯

丹尼尔

于 2012-10-03T15:26:37.737 回答
0

关键是lr = Sheets(1).Range("a1", Cells(65, 1))返回一个范围对象。
强调对象。所以你需要set在开始时使用,就像 Daniel 所做的那样。
当您不使用 分配该对象时set,Excel 将使用默认属性,即 Range.Value。所以赋值不会抛出错误,只使用 lr 作为对象。

于 2012-10-03T15:44:39.620 回答