簡體   English   中英

跨多個工作表的VBA Vlookup

[英]VBA Vlookup across multiple sheets

因此,我有兩個列表,每個列表在不同的工作表中。 我正在檢查工作表B中的值是否也在工作表A中。為此,我使用VLookup,問題似乎出在range語句上,因為此范圍似乎是“空”的。

我的VBA嘗試是這樣的,

Dim lookupVal As String
Dim myString As String

For i = 1 to N
    lookupVal = Sheets("b").Cells(1 + i, 2)
    myString = Application.WorksheetFunction.VLookup(lookupVal, Sheets("a").range(Sheets("a").Cells(9,3), Sheets("a").Cells(N+8, 3)), 1, False)
    If IsEmpty(myString) Then
        Sheets("b").Cells(1+i, 3) = ""
    Else
        Sheets("b").Cells(1+i, 3) = myString
    End if

Next i

我收到“運行時1004:應用程序定義或對象定義的錯誤”。 任何幫助表示贊賞。

將您的代碼更改為以下內容。

If IsEmpty(myString)是錯誤的方法。 #N/A情況下,該語句仍然是正確的。

這是您要嘗試的嗎?

Sub Sample()
    Dim lookupVal As String
    Dim myString As Variant
    Dim rng As Range

    '~~> Change this whatever you want
    n = 5

    For i = 1 To n
        lookupVal = Sheets("b").Cells(1 + i, 2)

        Set rng = Sheets("a").Range(Sheets("a").Cells(9, 3), Sheets("a").Cells(n + 8, 3))

        myString = Application.Evaluate("=VLOOKUP(" & lookupVal & "," & "a!" & rng.Address & ",1,0)")

        Select Case CVErr(myString)
            Case CVErr(xlErrName), CVErr(xlErrNA), CVErr(xlErrRef), CVErr(xlErrValue)
            Case Else: Sheets("b").Cells(1 + i, 3) = myString
        End Select
    Next i
End Sub

您的代碼中有兩個問題:

  1. 對於worksheetfunction.vlookup ,搜索范圍不能是可變的。 因此,解決此問題的方法是使用其他變量將其永久化

  2. 如果worksheetfunction.vlookup找不到搜索值,則會出現錯誤,在這種情況下,您需要對錯誤處理使用其他操作

  3. 由於單元格的格式(lookup范圍和lookup值)可以不同, lookupVal必須將lookupVal聲明as Range ,但是在代碼單元格中,值始終會轉換為字符串類型,如果將其轉換為字符串類型,則將無法找到數字串

  4. 由於與“ 3”中所述的相同原因,還必須將myString聲明as Variant 例如,單元格的類型可以為double ,但是您的代碼會將其轉換為string

因此,您的更新代碼如下,可以正常工作

Sub test()
Dim lookupVal As Range, myString As Variant, Rng$, n&
n = Sheets("b").[B:B].Cells.Find("*", , , , xlByRows, xlPrevious).Row
On Error Resume Next
For i = 1 To n
    Set lookupVal = Sheets("b").Cells(1 + i, 2)
    Rng = Range(Cells(9, 3), Cells(n + 8, 3)).Address
    myString = WorksheetFunction.VLookup(lookupVal, Sheets("a").Range(Rng), 1, False)
    If Err.Number > 0 Then
        Sheets("b").Cells(1 + i, 3) = ""
        Err.Clear
    Else
        Sheets("b").Cells(1 + i, 3) = myString
    End If
Next i
End Sub

下面的替代方法

Sub test()
Dim cl As Range, Dic As Object
Set Dic = CreateObject("Scripting.Dictionary"): Dic.Comparemode = vbTextCompare
With Sheets("a")
    For Each cl In .Range("C9:C" & .Cells(Rows.Count, "C").End(xlUp).Row)
        If Not Dic.exists(cl.Value) Then Dic.Add cl.Value, cl.Row
    Next cl
End With
With Sheets("b")
    For Each cl In .Range("B2:B" & .Cells(Rows.Count, "B").End(xlUp).Row)
        If Dic.exists(cl.Value) Then cl.Offset(, 1).Value = cl.Value
    Next cl
End With
Set Dic = Nothing
End Sub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM