2015-08-28 222 views
1

我浏览过其他用户遇到的这个问题已经提出的各种问题,而且这些解决方案似乎都没有解决即将出现的错误代码。错误1004 -Vlookup在vba中 - 无法获取WorksheetFunction类的Vlookup属性

我有提示输入参考号码用户的形式组织 - 它们输入到文本字段这一点,然后按OK

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

一旦被按下,接下来的形式出现,我想根据第一个表单上的参考编号输入数据。我有一个更新按钮,它将更新表单上的“标签”以显示数据 - 这是我收到错误的地方。 更新的第一个标签是通过VLOOKUP:

下面的用户点击更新按钮2号形式:

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的结果。

任何想法?

+0

你可以更新你的问题,你得到什么错误? – DragonSamu

+0

Hi DragonSamu,已更新标题并显示错误 – jamesc100

+0

您能否在'Label_ICS = WorksheetFunction.VLookup(refInput,dataRef,7,False)'行之前检查'refInput'的类型。 – ManishChristian

回答

1

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

见下面的代码:

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

就像一个WorkbookWorksheet需要SetRange

正如级“呃,”培根建议在评论它总是最好Dim每一个参考。
这样做的最好方法是将Option Explicit一直放在代码的顶部。这将迫使你定义的一切,这有助于其防止错误/错字的等

更新编辑:

的问题是你在你的Sheet(因此是Integer),但refInput寻找一个参考数设置作为String这个冲突和.VLookup引发错误,因为它找不到匹配项。

我已经重新设计你的代码:

现在你子是返回.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值并返回没有ne的返回值编辑有Global字符串或整数。

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

我甚至建议直接使用功能在你的第二UserformInitialize Event加载数据的Userform显示,这是对用户更友好,然后需要提供数据,然后尚需推更新按钮之前。

+0

嗨DragonSamu,我已经在Option Explicit中添加了所有模块和表单,并且还将dim应用于每个引用。但是,错误仍然出现。 DataRef和inputRef都分配了一个dim(分别为范围和整数),但没有喜悦。本建议下面有正确的库 - 我有Visual Basic应用程序/ MS Excel 15.0 Obj库/ OLE自动化/ MS Office 15.0 obj库/ MS Forms 2.0 obj库。 – jamesc100

+0

@ jamesc100我已经研究过.VLookup是如何工作的,并且如果不存在,那么您在第一个“Column”中搜索的数据必须存在(如果您使用'.Lookup')则会抛出错误。您搜索的数据是否出现在第一个“Column”中?我测试了你的代码,它的工作完美,如果你的搜索数据出现在第一列'列' – DragonSamu

+0

数据存在于第一列是。 vLookup试图找到位于“DataRef”范围中第一列的refInput。 – jamesc100

0
  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

+0

您能解释一下将数据存储到'Workbook'而不是'Variable'的逻辑吗?我真的没有看到这方面的逻辑。 – DragonSamu

+0

它将排除表单2尝试访问表单1上不再可用的对象时的错误 - 在发布完整错误消息的说明之前,它可能会发生错误。我认为现在没有关系。 – Ben