Excel VBA为什么不接受我的用户定义变量

时间:2019-11-21 22:11:15

标签: excel vba

我最近写了一些代码来在工作表中找到一个值。如果存在所述值,则它将活动单元偏移到第一行。如果该值不存在,则会显示一条错误消息。我遇到了由于“运行时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

1 个答案:

答案 0 :(得分:1)

Dim IDNUM As Boolean

这将声明标识符IDNUM,并为其分配足够的内存以为其存储Boolean值。请注意,可能的布尔值是TrueFalse

Set IDNUM = ...

这是一个Set赋值,这意味着VBA将期望赋值运算符的左侧(即=)是 reference 类型(即对象引用)。但是IDNUMBoolean,因此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