[英]VBA vlookup reference in different sheet
在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。
在這種情況下,引用不同工作表的正確方法是什么?
嘗試這個:
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
。
如果您想堅持邏輯,請聲明變量。
見下面的例子。
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
自從我發布這個問題以來,已有很多函數,宏和對象。 我在其中一個答案中提到的處理方式是通過創建一個字符串函數來處理由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
人們可以爭論錯誤處理的位置或縮短這段代碼,但它適用於我所有的情況,正如他們所說,“如果沒有破壞,不要試圖修復它”。
您的問題的答案: 引用不同表格的正確方法是通過適當地限定您使用的每個Range
。 請閱讀這個解釋及其結論 ,我想這將給出必要的信息。
你得到的錯誤可能是由於在搜索范圍Sheet1!A1:A65536
找不到所需的值Sheet2!D2
。 這可能源於兩種情況:
該值實際上不存在(克里斯尼爾森指出)。
您正在搜索錯誤的范圍。 如果ActiveSheet
是Sheet1
,那么使用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
我將指出一些值得注意的重點:
正如Chris niielsen所做的那樣捕獲錯誤是一種很好的做法,如果使用Application.WorksheetFunction.VLookup
可能是強制性的(雖然它不適合處理上面的案例2)。
這種捕獲實際上是由在單元格中輸入的函數VLOOKUP
執行的(並且,如果沒有找到所尋找的值,則錯誤的結果在結果中表示為#N/A
)。 這就是為什么L42的第一個解決方案不需要任何額外的錯誤處理(它由=VLOOKUP...
)。
使用=VLOOKUP...
與Application.WorksheetFunction.VLookup
根本不同:第一個留下公式,如果引用的單元格改變,其結果可能會改變; 第二個寫一個固定值。
L42的兩種解決方案都適合Ranges。
您正在搜索范圍的第一列,並返回該列中的值。 其他功能可用(雖然你的工作正常)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.