我最近写了一些代码来在工作表中找到一个值。如果存在所述值,则它将活动单元偏移到第一行。如果该值不存在,则会显示一条错误消息。我遇到了由于“运行时91错误”或需要对象的编译错误而拒绝我的变量的问题。我是VBA的新手,任何人都有可能知道此错误的原因。下面是我的便于查看的代码。
Private Sub CommandButton1_Click()
Dim IDNUM As Boolean
Set IDNUM = Worksheets("Petrobras").Range("V:V").Find(TXTOPPNUM_Insert.Value, , , LookAt:=xlWhole).Select
If IDNUM = False Then
MsgBox "This Opportunity has Not Been Registered Yet"
Else
ActiveCell.Activate
ActiveCell.Offset(0, -21).Activate
End If
End Sub
答案 0 :(得分:1)
Dim IDNUM As Boolean
这将声明标识符IDNUM
,并为其分配足够的内存以为其存储Boolean
值。请注意,可能的布尔值是True
和False
。
Set IDNUM = ...
这是一个Set
赋值,这意味着VBA将期望赋值运算符的左侧(即=
)是 reference 类型(即对象引用)。但是IDNUM
是Boolean
,因此Set
分配是非法的。
您希望这是一个值赋值:
Let IDNUM = ...
但是,Let
关键字是多余/过时的,因此您可以这样做:
IDNUM = ...
现在,分配的右侧也有问题:
Worksheets("Petrobras").Range("V:V") _
.Find(TXTOPPNUM_Insert.Value, , , LookAt:=xlWhole) _
.Select
首先,表达式没有定义的类型:(Range).Select
方法不返回任何值,因此表达式不能合法出现在=
运算符的右侧。
(Range).Find
确实返回了一些内容-但它返回了一个Range
对象引用,当找不到所需的内容时,它返回了{{1} }-一个特殊的参考值,基本上表示“这里没有对象”,并且对Nothing
进行的任何成员调用(如.Select
)将始终引发运行时错误91。永远不要假设{{1} }将返回有效的对象引用。
相反,将搜索结果捕获到对象变量中:
Nothing
请注意,因为您使用的是命名参数,所以无需指定可选的空位置参数。也就是说Range.Find
将为未指定的每个可选参数使用未指定的默认值,因此建议始终提供每个可选参数-否则,您将受到用户的任何限制上次他们按下 Ctrl + F 时。
如果返回的对象不是Dim findResult As Range
Set findResult = Worksheets("Petrobras").Range("V:V").Find(TXTOPPNUM_Insert.Value, LookAt:=xlWhole)
,然后,则可以使用它:
Range.Find
最后,请注意,Nothing
是多余的:布尔值是是布尔表达式,因此与If Not findResult Is Nothing Then
IDNUM = findResult.Value 'not sure what you mean to do here
Else
'no found. now what?
Exit Sub
End If
或If {bool-expression} = {True|False} Then
文字的比较是完全多余的。使用True
逻辑运算符,而不要与False
进行比较:
Not
...并考虑通过将“ nope”情况放在最后并逆转条件来避免产生负面影响:
False
请注意,If Not IDNUM Then
MsgBox "This Opportunity has Not Been Registered Yet"
Else
ActiveCell.Offset(0, -21).Activate
End If
已已激活-If IDNUM Then
ActiveCell.Offset(0, -21).Activate
Else
MsgBox "This Opportunity has Not Been Registered Yet"
End If
不会执行任何操作。
...并且您根本不需要关心ActiveCell
-您想要的单元格为ActiveCell.Activate
范围:
ActiveCell
回顾:
findResult