我正在尝试搜索下面指定范围中包含的3列。我花了很长时间在网上看,我发现了类似的问题,但当我将它应用到我的时候,我得不到正确的答案。到目前为止(来自另一个问题答案)我有:
Dim result As Range
Set result = range("DailyTable[[AmtNumberOut]:[AMTOutstanding]]").find(What:="#N/A Requesting Data...", After:=ActiveCell, LookIn:= _
xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
xlNext, MatchCase:=False, SearchFormat:=False)
If result Is Nothing Then
ElseIf IsEmpty(result.Offset(0, 2)) Then
MsgBox ("Please wait for information to finish downloading. Import cancelled.")
Exit Sub
Else
MsgBox ("Please wait for information to finish downloading. Import cancelled.")
Exit Sub
End If
据我所知,如果找不到可能导致数据类型问题的值,则find返回任何内容,但我尝试将结果定义为Range,Object,Variant,String以及所有给出不匹配错误。我还读到某处它可以返回布尔输出(它也不起作用)。我花了很长时间坚持一个简单的问题,我会非常感谢任何答案!
感谢。
答案 0 :(得分:1)
Range.Find
返回Range
对象引用,已初始化或未初始化。如果Range.Find
找到了任何内容,则会获得Range
对象引用,否则会得到Nothing
,这是一个未初始化的对象引用,会使您的代码抛出运行时错误91“对象引用而不是设置“如果你试图对其进行成员调用。
我尝试将结果定义为Range,Object,Variant,String,并且都给出了不匹配错误。
你想要一个Range
。 Object
可以正常工作,但它会使所有成员调用后期绑定,即在运行时解决 - 你没有得到智能感知或自动完成,VBA很乐意编译错字无论是否指定 Option Explicit
。
Variant
也可以正常工作,但是你再次失去了IntelliSense,并且你将对象引用包装成Variant/Object
,这会产生你不需要的开销。
String
很危险。首先,为了让它有机会工作,您需要删除Set
关键字。然后这就是你真正做的事情,隐式默认成员访问和隐式类型转换都是明确的:
Dim result As String
result = CStr(Range(...).Find(...).Value)
隐式默认成员调用.Value
首先对Nothing
是非法的,然后无法保证CStr
字符串转换成功:如果单元格包含错误值(例如#N/A
),这就是你得到类型不匹配运行时错误的地方,因为Error
值无法隐式(或显式)转换到String
(或其他任何东西,实际上)。
如果您使用result As Range
获得类型不匹配,那么您正在使用返回的Range
对象的Value
(隐式或显式)执行某些操作并且该值为Error
- 您无法将错误值与任何类型进行比较。您需要使用If IsError(result) Then
来包装它正在使用的任何内容 - 但看起来您发布的代码都不会导致与Dim result As Range
的类型不匹配错误,假设.Offset(0,2)
也不是错误值。
答案 1 :(得分:1)
在你的发现中你有
After:=ActiveCell,
如果您的活动单元格不在您引用的表格中,则会引发不匹配错误," DailyTable"。
此外,如果偏移量为空,您的逻辑将显示消息框。所以如果Result什么都没有,那么什么也没有,但是如果偏移是空的,你得到消息。只要这是你想要的,那你为什么要检查偏移是否为空?