首页 > 解决方案 > 运行时错误 1004 消息 - 无法获取 WorksheetFunction 类的 VLookup 属性

问题描述

我希望有人可以帮助

运行时错误 1004 消息 - 无法获取 WorksheetFunction 类的 VLookup 属性。

我遇到了两个与此错误代码有关的问题。

我有一个文件,其中包含一个用户表单,我可以通过它轻松添加和修改记录。自从我最近升级到 Surface Pro 7 后,我被迫通过我的 MS 帐户使用 MS 365。像许多其他人一样,我的许多文件都受到 Excel 365-64 位中缺少的工具和功能的影响。通过选择安装 32 位版本,我已经能够恢复这些工具和功能,但是我仍然有一些问题。

问题 1 - 当我尝试在用户表单的查找文本框中输入数值时,会发生此错误。虽然这在以前版本的 Excel 中不是问题,但在 MS 365 中是这样。为了避免这种情况,我需要将所有查找值转换为文本格式。不是很好,但它有效。

现在解决了这个问题,又出现了一个问题,它返回相同的运行时错误和消息。

问题 2 - 我的用户表单使用框架来分隔不同的信息组,并且我已将选项卡设置为以正确的顺序移动。因此,我初始化了用户表单并完成了所需的详细信息,并且查找单元格完美运行。我使用命令按钮将记录添加到工作表并清除和设置用户表单,就像刚刚打开一样。

我开始在“已清除”表单中输入新的详细信息,直到我跳到包含查找文本框的第三帧之前都没有问题。在我输入任何信息之前,我得到了相同的运行时错误。

有 5 个这样的查找文本框,但是当我检查代码中的调试时,突出显示的是最后一个文本框的代码。我还没有隔离这个文本框以查看错误是否仍然出现,调试突出显示下一个最后的代码。

表单和代码应该对输入的第一条记录有效,但对随后的记录无效,这似乎是不合逻辑的,尤其是在两者使用相同的初始化代码时。

下面是查找代码(其中包括检查以确保匹配记录出现在查找表中)和“添加记录”命令代码的最后几行,一旦将详细信息添加到工作表中就会清除表单。

任何帮助将不胜感激

查找代码

Private Sub txtDepotCode_AfterUpdate()
    'Looks up the Depot Location and Operator information and applies this to the databasse and the user form
    If WorksheetFunction.CountIf(Sheet2.Range("J2:L250"), Me.txtDepotCode.Value) = 0 Then
        MsgBox "This is an invalid code", 0, " Validation Check"
        Me.txtDepotCode.SetFocus
        Me.txtDepotCode.Value = ""
        Exit Sub
    End If
    
    With Me
        .txtDepotLocation = Application.WorksheetFunction.VLookup(Me.txtDepotCode, Sheet2.Range("J2:L250"), 2, False)
        .txtDepotOperator = Application.WorksheetFunction.VLookup(Me.txtDepotCode, Sheet2.Range("J2:L250"), 3, False)
    End With
End Sub

添加记录代码(最终操作)

Call UserForm_Initialize
cboType.SetFocus

也用于初始化用户表单和清除用户表单的命令。

标签: excelvbaoffice365

解决方案


查找使用Application.Match

Private Sub txtDepotCode_AfterUpdate()
    
    Dim rg As Range: Set rg = Sheet2.Range("J2:L250")
    Dim cString As String: cString = Me.txtDepotCode.Value
    Dim cIndex As Variant: cIndex = Application.Match(cString, rg.Columns(1), 0)
   
    If IsNumeric(cIndex) Then
        Me.txtDepotLocation = rg.Cells(cIndex, 2).Value
        Me.txtDepotOperator = rg.Cells(cIndex, 3).Value
    Else
        MsgBox "This is an invalid code", 0, " Validation Check"
        Me.txtDepotCode.SetFocus
        Me.txtDepotCode.Value = ""
    End If

End Sub

推荐阅读