VBA vlookup参考在不同的工作表

在Excel 2007中,我循环了第2页中的第4列的值。仍然在第2页中,我想将我的查找公式的结果输出到第5列中。该查找公式需要引用表1中的参考列。 为了做到这一点,我有以下公式

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

问题,它返回错误代码1004.我读,这是因为我需要select工作表1之前运行的公式,如:

 ThisWorkbook.Worksheets("Sheet1").Select 

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

在这种情况下引用另一张纸的正确方法是什么?

尝试这个:

 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 

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

如果你想坚持你的逻辑,就声明variables。
看下面的例子。

 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 

希望这个得到你的开始。

您的代码工作正常,只要Sheet1!A:A的值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 

自从我发布这个问题以来,已经有很多函数,macros和对象了。 我在这里的答案中提到的处理方式是创build一个string函数,该函数处理由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 

人们可以争论error handling的位置或者缩短这个代码,但是对于我来说,它在任何情况下都是有效的,正如他们所说的那样,“如果没有破坏,就不要试图修复它”。

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

您得到的错误可能是由于在search范围Sheet1!A1:A65536找不到所寻求的Sheet2!D2值。 这可能源于两种情况:

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

  2. 你正在寻找错误的范围。 如果ActiveSheetSheet1 ,那么使用Range("D2")而不限定它将searchSheet1!D2 ,即使find的值存在于正确的范围内,也会抛出相同的错误。 代码核算这个(和下面的项目)如下:

     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 

我将指出一些其他值得注意的地方:

  1. 像克里斯·尼尔森那样捕捉错误是一个很好的做法,如果使用Application.WorksheetFunction.VLookup (尽pipe它不适合处理上面的情况2),可能是强制性的。

  2. 这种捕获实际上是通过函数VLOOKUP在单元格中input的(如果找不到所需的值,则错误的结果在结果中显示为#N/A )。 这就是为什么L42的第一个解决scheme不需要任何额外的error handling(这是由=VLOOKUP...照顾)。

  3. 使用=VLOOKUP...Application.WorksheetFunction.VLookup有着根本的不同:​​第一个离开了一个公式,如果单元格引用了变化,结果可能会改变; 第二个写一个固定值。

  4. L42的两个解决scheme都可以适用Ranges。

  5. 您正在search范围的第一列,并返回该列中的值。 其他function可用(虽然你的工作正常)。