excel - 匹配 2 列和第三列的结果

标签 excel vba compare multiple-columns

需要帮助比较(匹配)2 个工作表中的 2 列,如果匹配,则返回第二个工作表的第 3 列的值。

    With Range("B3:B" & Range("A" & Rows.Count).End(xlUp).Row)
        .Formula = "=INDEX($D:$D,MATCH(1,(Sheet1!B$1=Sheet2!$C:$C)*(Sheet1!$A3=Sheet2!$A:$A),0))"
        .Value = .Value
    End With

表 1:

enter image description here

表 2:

enter image description here

如果我将公式放入每个单元格中(整个月),此函数将比平时花费更长的时间。所以尝试这个 With 函数,但需要一个更好的代码,应该运行得更快。任何建议..

最佳答案

使用字典字典匹配列

Sub MatchColumns()
    
    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
    
    Dim sws As Worksheet: Set sws = wb.Worksheets("Sheet2")
    Dim srg As Range: Set srg = sws.Range("A1").CurrentRegion ' ("A1:D13")
    Dim rCount As Long: rCount = srg.Rows.Count - 1
    Dim Data As Variant: Data = srg.Resize(rCount).Offset(1).Value ' ("A2:D13")
    
    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
    dict.CompareMode = vbTextCompare
    
    Dim Key As Variant
    Dim r As Long

    For r = 1 To rCount
        Key = Data(r, 1)
        If Not dict.Exists(Key) Then
            Set dict(Key) = CreateObject("Scripting.Dictionary")
        End If
        dict(Key)(Data(r, 3)) = Data(r, 4)
    Next r
    
    ' Print the contents of the dictionary in the Immediate window (Ctrl+G).
'    Dim iKey As Variant
'    For Each Key In dict.Keys
'        Debug.Print Key
'        For Each iKey In dict(Key).Keys
'            Debug.Print iKey
'        Next iKey
'    Next Key
    
    Dim dws As Worksheet: Set dws = wb.Worksheets("Sheet1")
    
    Dim drrg As Range ' The Row (Column Labels, Headers) ' ("B1:E1")
    Set drrg = dws.Range("B1", dws.Cells(1, dws.Columns.Count).End(xlToLeft))
    Dim rData As Variant: rData = drrg.Value
    Dim cCount As Long: cCount = drrg.Columns.Count
    
    Dim dcrg As Range ' The Column (Row Labels) ' ("A3:A5")
    Set dcrg = dws.Range("A3", dws.Cells(dws.Rows.Count, "A").End(xlUp))
    Dim cData As Variant: cData = dcrg.Value
    rCount = dcrg.Rows.Count
    
    ReDim Data(1 To rCount, 1 To cCount)
    
    Dim c As Long
    
    For r = 1 To rCount
        Key = cData(r, 1)
        If dict.Exists(Key) Then
            For c = 1 To cCount
                If dict(Key).Exists(rData(1, c)) Then
                    Data(r, c) = dict(Key)(rData(1, c))
                End If
            Next c
        End If
    Next r
    
    dws.Range("B3").Resize(rCount, cCount).Value = Data ' ("B3:E5")
    
End Sub

关于excel - 匹配 2 列和第三列的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71975737/

相关文章:

vba - VBA Excel 中的子函数或函数

vba - 如何使用VBA将Excel中的数据以文本形式导出到Word

java - 如何比较STL数据结构中的对象

Java比较带哈希和不带哈希的字符串

vba - 清除 K 列中包含 "remove"的每一行的 B 至 G 列内容

vba - 无法滚动网页的分屏

python - 如何对 pandas 数据框列进行分组并将不同的组保存到同一 excel 文件中的多个工作表?

vba - Excel 公式或 VBA 代码搜索列的项目列表并消除重复计数

vba - 每 x 行插入空白行

Javascript:搜索数组以查看它是否包含字符串的一部分