【问题标题】:Error 1004 - Vlookup in vba - Unable to get the Vlookup property of the WorksheetFunction class错误 1004 - vba 中的 Vlookup - 无法获取 WorksheetFunction 类的 Vlookup 属性
【发布时间】:2015-09-01 23:26:29
【问题描述】:

我浏览了其他用户遇到的与此问题有关的各种问题,但似乎没有一个解决方案可以修复出现的错误代码。

我有一个表单提示用户输入参考号 - 他们将其输入到文本字段中,然后按 OK

'OK button from form1
    Public Sub CommandButton1_Click()
    refInput = refTextBox.Value
    InputRef.Hide
    ExportShipForm.Show
    End Sub

按下此按钮后,将出现下一个表单,我希望根据第一个表单上输入的参考号填充数据。我有一个更新按钮,它将更新表单上的“标签”以显示数据 - 这是我收到错误的地方。 要更新的第一个标签是通过 Vlookup:

下面的用户点击更新按钮的第二种形式:

Public Sub btnUpdate_Click()
Call ICS_Caption

lbl_ICS.Caption = Label_ICS
End Sub

这会调用下面的函数:

Public Sub ICS_Caption()
Dim ws1 As Worksheet

refInput = InputRef.refTextBox.Value
Set ws1 = Worksheets("MACRO")

dataRef = Worksheets("Shipping Data").Range("A:K")
Label_ICS = WorksheetFunction.VLookup(refInput, dataRef, 7, False)
End Sub

每次都会出现错误 - 我已经在 VBA 外部的单元格中手动运行了 vlookup,它工作正常。 我在 Vlookup 中输入了范围,同时也使用了命名范围,但每个变体都显示相同的错误。

最终,我希望表单 2 上的标签能够根据 Vlookup 的结果进行更新。

有什么想法吗?

【问题讨论】:

  • 你能用你遇到的错误更新你的问题吗?
  • 您好 DragonSamu,已更新错误的标题
  • 你能在Label_ICS = WorksheetFunction.VLookup(refInput, dataRef, 7, False)行之前检查refInput的类型吗?
  • 一般来说,我建议您返回并将每个变量调暗为其特定类型; VBA 允许您在不这样做的情况下使用变量,但是当您没有意识到 Excel 已经假定变量是 A 类型,但您尝试像 B 类型一样使用它(即:字符串与整数等)时,通常会导致痛苦跨度>

标签: forms vba excel vlookup


【解决方案1】:

你需要Dim dataRef as Range然后Set它。

见下面的代码:

Dim DataRef as Range
Set dataRef = Worksheets("Shipping Data").Range("A:K")

就像WorkbookWorksheet 你需要Set Range

正如“Eh”级培根在 cmets 中建议的那样,它总是最好的 Dim 每个参考。
最好的方法是将Option Explicit 一直放在代码的顶部。这会迫使您定义有助于防止错误/错别字等的所有内容。

更新编辑:

问题是您在Sheet 中寻找参考号(因此是Integer),但refInput 被设置为String 这会发生冲突并且.VLookup 会抛出错误,因为它不能找到匹配。

我已经修改了你的代码:

您的 sub 现在是一个返回 .Caption String 的函数

Function ICS_Caption(refInput As Integer)
    Dim dataRef As Range
    Set dataRef = Worksheets("Shipping Data").Range("A:K")
    ICS_Caption = WorksheetFunction.VLookup(refInput, dataRef, 7, False)
End Function

更新按钮调用您的Function 并提供数据:

Public Sub btnUpdate_Click()
    lbl_ICS.Caption = ICS_Caption(InputRef.refTextBox.Value)
End Sub

通过使用Function,您可以提供Integer 值并获取返回值,而无需Global 字符串或整数。

这将是您的下一个障碍,因为您只能使用 Global VariableModules/Userforms 之间转移 Variables

我什至建议直接使用第二个UserformInitialize Event 中的函数来加载数据,然后Userform 显示这对用户更友好,然后需要提供数据,然后仍然需要推送更新按钮。

【讨论】:

  • 嗨 DragonSamu,我已将 Option Explicit 添加到所有模块和表单,并且还对每个引用应用了 dim。但是,错误仍然出现。 DataRef 和 inputRef 都被分配了一个暗淡(分别是范围和整数),但没有乐趣。 Ben 在下面建议使用正确的库 - 我有 Visual basic for applications/MS Excel 15.0 Obj library/OLE Automation/MS Office 15.0 obj library/MS Forms 2.0 obj library。
  • @jamesc100 我已经研究了.VLookup 的工作原理,并且您正在搜索的数据必须存在(如果您使用.VLookup)在第一个Column 中,如果不存在,它将抛出错误。您搜索的数据是否存在于第一个Column 中?我已经测试了你的代码,如果你的搜索数据出现在第一个 Column 中,它就可以完美运行
  • 数据存在于第一列是。 vLookup 正在尝试查找“DataRef”范围内第一列中的 refInput。
  • @jamesc100 如果可以,请上传您的文件并发布链接,以便我查看,正如我所说,我使用用户表单测试了您的代码,但没有出现错误。
  • dropbox.com/s/r0612gxusvz4rks/… - @DragonSamu - 这是文件的链接
【解决方案2】:
  1. 验证您在 VBA IDE > 工具 > 参考中没有丢失的库

  2. 尝试使用工作表单元格作为存储和检索 refTextBox.Value 的地方,而不是 refInput(我假设它是一个全局变量):

    Public Sub CommandButton1_Click()
    ...
    Worksheets("Shipping Data").Range($M$1).Value=refTextBox.Value  
    End Sub
    
    Public Sub ICS_Caption()
    Dim refInput as Long'My assumption
    ...
    refInput=Worksheets("Shipping Data").Range($M$1).Value
    ...
    End Sub
    
  3. 确保所有代码窗口的顶部都有Option Explicit

【讨论】:

  • 您能否解释将数据存储到Workbook 而不是Variable 的逻辑?我真的不明白其中的逻辑。
  • 这将排除 Form 2 尝试访问 Form 1 上不再可用的对象的错误 - 在发布对完整错误消息的澄清之前,这是可能的。我认为现在不相关。
猜你喜欢
  • 2014-05-13
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多