不同表中的VBA vlookup参考

时间:2013-12-23 08:33:32

标签: excel vba excel-vba

在Excel 2007中,我循环遍历Sheet 2中第4列的值。仍然在Sheet 2中,我想将vlookup公式的结果输出到第5列.vlookup公式需要引用Sheet 1,其中参考列是。为此,我有以下公式

Range("E2") = Application.WorksheetFunction.VLookup(Range("D2"), _
          Worksheets("Sheet1").Range("A1:C65536"), 1, False)

问题,它返回错误代码1004.我读到这是因为我需要在运行公式之前选择Sheet 1,如:

ThisWorkbook.Worksheets("Sheet1").Select

但是搜索到的值Range(“D2”)不属于Sheet 1,并且在将Sheet 1带入视图后仍然返回代码1004。

在这种情况下,引用不同工作表的正确方法是什么?

4 个答案:

答案 0 :(得分:6)

试试这个:

Dim ws as Worksheet

Set ws = Thisworkbook.Sheets("Sheet2")

With ws
    .Range("E2").Formula = "=VLOOKUP(D2,Sheet1!$A:$C,1,0)"
End With

End Sub

这只是你想要的简化版本。
如果您只是在Application输出答案,则无需使用Range("E2")

如果您想坚持逻辑,请声明变量 例如,见下文。

Sub Test()

Dim rng As Range
Dim ws1, ws2 As Worksheet
Dim MyStringVar1 As String

Set ws1 = ThisWorkbook.Sheets("Sheet1")
Set ws2 = ThisWorkbook.Sheets("Sheet2")
Set rng = ws2.Range("D2")

With ws2
    On Error Resume Next 'add this because if value is not found, vlookup fails, you get 1004
    MyStringVar1 = Application.WorksheetFunction.VLookup(rng, ws1.Range("A1:C65536").Value, 1, False)
    On Error GoTo 0
    If MyStringVar1 = "" Then MsgBox "Item not found" Else MsgBox MyStringVar1
End With

End Sub

希望这是你的开始。

答案 1 :(得分:2)

如果Sheet2!D2中存在Sheet1!A:A中的值,则代码可以正常工作。如果没有,则引发错误1004。

要处理此案例,请尝试

Sub Demo()
    Dim MyStringVar1 As Variant
    On Error Resume Next
    MyStringVar1 = Application.WorksheetFunction.VLookup(Range("D2"), _
      Worksheets("Sheet1").Range("A:C"), 1, False)
    On Error GoTo 0
    If IsEmpty(MyStringVar1) Then
        MsgBox "Value not found!"
    End If

    Range("E2") = MyStringVar1

End Sub

答案 2 :(得分:2)

自从我发布这个问题以来,已有很多功能,宏和对象。我在其中一个答案中提到的处理方式是通过创建一个字符串函数来处理由vlookup函数生成的错误,并返回任何内容或vlookup结果(如果有的话)。

Function fsVlookup(ByVal pSearch As Range, ByVal pMatrix As Range, ByVal pMatColNum As Integer) As String
    Dim s As String
    On Error Resume Next
    s = Application.WorksheetFunction.VLookup(pSearch, pMatrix, pMatColNum, False)
    If IsError(s) Then
        fsVlookup = ""
    Else
        fsVlookup = s
    End If
End Function

人们可以争论错误处理的位置或缩短此代码,但它适用于我所有的情况,正如他们所说,"如果它没有破坏,请不要这样做。尝试修复它"。

答案 3 :(得分:0)

您的问题的答案:引用不同表单的正确方法是通过适当地限定您使用的每个Range 。 请阅读this explanation及其结论,我想这将提供重要信息。

您获得的错误可能是由于在搜索范围Sheet2!D2中未找到所需的值Sheet1!A1:A65536。这可能源于两种情况:

  1. 该值实际上不存在(克里斯尼尔森指出)。

  2. 您正在搜索错误的范围。如果ActiveSheetSheet1,则使用Range("D2")而不限定它将搜索Sheet1!D2,即使所需的值存在,它也会抛出相同的错误在正确的范围内。 对此(以及下面的项目)的代码说明如下:

    Sub srch()
        Dim ws1 As Worksheet, ws2 As Worksheet
        Dim srchres As Variant
    
        Set ws1 = Worksheets("Sheet1")
        Set ws2 = Worksheets("Sheet2")
    
        On Error Resume Next
        srchres = Application.WorksheetFunction.VLookup(ws2.Range("D2"), ws1.Range("A1:C65536"), 1, False)
        On Error GoTo 0
        If (IsEmpty(srchres)) Then
          ws2.Range("E2").Formula = CVErr(xlErrNA) ' Use whatever you want
        Else
          ws2.Range("E2").Value = srchres
        End If
    End Sub
    
  3. 我将指出一些值得注意的重点:

    1. 抓住Chris nielsen所做的错误是一种很好的做法,如果使用Application.WorksheetFunction.VLookup可能是强制性的(虽然它不适合处理上面的案例2)。

    2. 此捕获实际上是由单元格中输入的函数VLOOKUP执行的(如果找不到所需的值,则错误的结果显示为#N/A在结果中)。这就是为什么L42的第一个解决方案不需要任何额外的错误处理(由=VLOOKUP...处理)。

    3. 使用=VLOOKUP...Application.WorksheetFunction.VLookup根本不同:第一个留下公式,如果引用的单元格发生变化,结果可能会发生变化;第二个写一个固定值。

    4. L42的两种解决方案都适合Ranges。

    5. 您正在搜索范围的第一列,并返回该列中的值。其他功能可用(尽管你的工作正常)。