我最近编写了一些代码,以从用户窗体文本框中获取输入并在我的数据库中搜索它。如果找到,我希望它返回该值并将其插入到单元格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
答案 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加载项项目。