Excel 基于密钥检索数据的更快VBA VLookup替代方案

Excel 基于密钥检索数据的更快VBA VLookup替代方案,excel,vba,vlookup,Excel,Vba,Vlookup,我正在尝试匹配一个大型数据集,并使用VBA将值从一张图纸复制到另一张图纸。我目前正在使用Vlookup,但是这个过程对于单个列来说太慢了,所以我正在测试它,它是不可行的。是否有一种更有效的方法基于密钥匹配数据?基本上,我的数据是这样的,我试图使用“键”将“数据”从数据集A复制到B 数据集A: Key Data 123 yes 231 yes 435 no 数据集B: Key Data 453 231 我目前的代码如下: Sub copyData() Dim myLas

我正在尝试匹配一个大型数据集,并使用VBA将值从一张图纸复制到另一张图纸。我目前正在使用Vlookup,但是这个过程对于单个列来说太慢了,所以我正在测试它,它是不可行的。是否有一种更有效的方法基于密钥匹配数据?基本上,我的数据是这样的,我试图使用“键”将“数据”从数据集A复制到B

数据集A:

Key  Data
123  yes
231  yes
435  no
数据集B:

Key  Data
453  
231
我目前的代码如下:

    Sub copyData()

Dim myLastRow As Long
Dim backlogSheet As Worksheet
Dim combinedSheet As Worksheet

Set backlogSheet = Sheets("All SAMs Backlog")
Set combinedSheet = Sheets("COMBINED")
myLastRow = backlogSheet.Cells(Rows.Count, "B").End(xlUp).Row

Application.ScreenUpdating = False

For myRow = 3 To myLastRow

    curLoc = backlogSheet.Cells(myRow, "C")

    searchVal = Range("D" & myRow).Value

    statusVal = Application.VLookup(curLoc, combinedSheet.Range("A:B"), 2, False)

    'Range("D" & myRow).Cells.Value = testVal
Next myRow

MsgBox ("done")
End Sub

非常感谢您的帮助。

从源代码中填充字典,获取目标代码的数组并用源代码的字典填充,最后将结果数组放回目标工作表

Sub copyData()
    Dim i As Long, arr As Variant, dict As Object

    Set dict = CreateObject("scripting.dictionary")
    dict.comparemode = vbTextCompare

    With Worksheets("COMBINED")
        'put combined!a:b into a variant array
        arr = .Range(.Cells(2, "A"), .Cells(.Rows.Count, "B").End(xlUp)).Value2
        'loop through array and build dictionary keys from combined!a:a, dictionary item from combined!b:b
        For i = LBound(arr, 1) To UBound(arr, 1)
            dict.Item(arr(i, 1)) = arr(i, 2)
        Next i
    End With

    With Worksheets("All SAMs Backlog")
        'put 'all sams backlog'!c:d into a variant array
        arr = .Range(.Cells(3, "C"), .Cells(.Rows.Count, "C").End(xlUp).Offset(0, 1)).Value2
        'loop through array and if c:c matches combined!a:a then put combined!b:b into d:d
        For i = LBound(arr, 1) To UBound(arr, 1)
            If dict.exists(arr(i, 1)) Then
                arr(i, 2) = dict.Item(arr(i, 1))
            Else
                arr(i, 2) = vbNullString
            End If
        Next i
        'put populated array back into c3 (resized by rows and columns)
        .Cells(3, "C").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
    End With

    MsgBox ("done")

End Sub

您可以使用Power Query进行合并。为什么不将Vlookup输入第一个工作表单元格,然后向下复制?如果不想保留公式,请复制列并将特殊值粘贴到列本身以保留找到的值。@teylyn数据量将需要许多vlookup,这将导致文件大小过大且过慢。至于粘贴这些值,这是不实际的,而且会留下错误的空间。我想不惜一切代价避免这样做。哇,这样做很完美,而且速度也很快!然而,我并不完全明白发生了什么。你能评论一下吗?我会记下答案。因为我想将其应用于其他专栏,但很快就很难弄清楚重复使用的内容和位置。也会帮助其他遇到这个答案的人。谢谢你的评论!因此,如果我想在当前使用的列之外,对另一个列执行相同的过程,那么需要做很多工作吗?我想我会在“组合”循环中将B改为C,但从那里开始呢?所有的细节和复杂之处似乎都太多了,无法在评论中讨论,所以可能是a。我自己做过,完成了90%。与最后的10%抗争,并发布了一个新问题。如果你知道答案,请放心!()