如何使用查找功能

时间:2019-10-30 14:45:05

标签: excel vba

我最近编写了一些代码,以从用户窗体文本框中获取输入并在我的数据库中搜索它。如果找到,我希望它返回该值并将其插入到单元格A1149中;我已经写了下面的代码,但它给我错误#424“ Object Required”。我是VBA的新手,因此非常感谢您提供所有帮助。

Private Sub CMDSearch_Click()

     Dim pesquisa As Range

     Set pesquisa = Worksheets("Petrobras").Activate.Range("$W:$W") _
         .Find(What:=Opp_Num_Search.Value, LookIn:=xlValues, Lookat:=xlWhole).Activate

     Worksheets("Petrobras").Range(A1149).Value = pesquisa.Value

     UserForm1.Hide

End Sub

1 个答案:

答案 0 :(得分:2)

Range.Activate不返回任何内容,就像一个Sub过程:

Public Sub DoSomething()
    ' does something...
End Sub

如果您进行了Set foo = DoSomething.Something,则将收到相同的错误:一个对象是必需的,否则.Something成员调用是非法的(除非现在该错误将在编译时而不运行)时间,因为绑定的工作原理。

Set pesquisa = Worksheets("Petrobras").Activate...

您不想Activate张纸。

部分问题是正在进行的隐式后期绑定:Worksheets返回一个Object,因此,您之后编写的所有内容,所有这些链接的成员调用只能在运行时解决。

通过声明一个显式Worksheet变量使它早绑定:

Dim sheet As Worksheet
Set sheet = Worksheets("Petrobras")

现在,如果您要激活它,可以执行sheet.Activate(但不必这样做)。而且,如果您想从该工作表中获取一个Range,可以进行一个.Range成员调用, IDE现在将帮助您完成

Dim result As Range
Set result = sheet.Range("$W:$W").Find(...)

从不将任何成员调用链接到Range.Find返回的内容。如果搜索结果,则您有一个Range对象。如果没有,则您拥有Nothing-并且对Nothing进行的任何成员调用都将始终引发运行时错误91。

首先验证搜索结果:

If result Is Nothing Then
    MsgBox "Could not find '" & Opp_Num_Search.Value & "' in column W."
    Exit Sub
End If

或者:

If Not result Is Nothing Then
    sheet.Range("A1149").Value = result.Value
End If

请注意,A1149是表示单元格地址的字符串文字,因此必须用双引号(")括起来。如果不是在双引号,它看起来像一个合法的变量名,VBA将其当作..A变量...这会导致另一个错误(1004),因为Range将是相当不悦地工作的值为Variant/Empty

为防止VBA带有拼写错误“声明”运行中的变量(并导致难以发现的错误),请确保在项目中每个模块的最顶部都有Option Explicit

最后一件事:

 UserForm1.Hide

这隐藏了UserForm1默认实例,该实例可能是也可能不是当前显示的对象/实例-表单本身无法知道其显示方式:

UserForm1.Show '<~ shows the default instance
With New UserForm1
    .Show '<~ shows a new (non-default) instance
End With

由于这个原因,您应该避免在表单的代码隐藏中引用默认实例。请改用Me

Me.Hide

那样,您指的是当前显示的表单的任何实例,无论该实例是否为默认实例。有关更多信息,提示,陷阱和涉及用户表单的常见错误,请参见UserForm1.Show

请注意,Rubberduck has quite a few inspections可以识别并警告您(并经常自动修复)大多数这些问题。 Rubberduck是我管理的免费开源VBIDE加载项项目。