替换另一张表中列值匹配的 Excel 行

替换另一张表中列值匹配的 Excel 行

我有 2 张具有匹配列的工作表,每张工作表的第一列包含一个键。工作表 2 包含工作表 1 中的部分行,其中包含更新的数据。如果存在匹配的键,我该如何用工作表 2 中的行替换工作表 1 中的行。

示例表 1

钥匙 姓名 城市
123 鲍勃 西雅图
124 史蒂文 芝加哥
125 汤姆 圣地亚哥

示例表 2

钥匙 姓名 城市
123 鲍勃·多伊 纽约

新工作表 1

钥匙 姓名 城市
123 鲍勃·多伊 纽约
124 史蒂文 芝加哥
125 汤姆 圣地亚哥

我不确定这是否可以通过 VLOOKUP 来完成,或者我是否应该为其创建一个脚本。

答案1

更新工作表

目的地/来源初始

最初的

目的地决赛

结果

在标准模块中例如Module1

Option Explicit

Sub UpdateWorksheet()
    
    Const sName As String = "Sheet2"
    Const dName As String = "Sheet1"
    Const CritCol As Long = 1
    
    Dim wb As Workbook: Set wb = ThisWorkbook
    
    Dim scrg As Range: Set scrg = wb.Worksheets(sName).Range("A1").CurrentRegion
    If scrg.Rows.Count = 1 Then
        MsgBox "No data in the source worksheet.", _
            vbCritical, "Update Worksheet"
        Exit Sub
    End If
    Dim srCount As Long: srCount = scrg.Rows.Count - 1
    Dim srg As Range: Set srg = scrg.Resize(srCount).Offset(1)
    Dim sData As Variant: sData = srg.Value
    
    Dim scData As Variant
    If srCount = 1 Then
        ReDim scData(1 To 1, 1 To 1): scData(1, 1) = srg.Columns(CritCol).Value
    Else
        scData = srg.Columns(CritCol).Value
    End If
    
    Dim dcrg As Range: Set dcrg = wb.Worksheets(dName).Range("A1").CurrentRegion
    If dcrg.Rows.Count = 1 Then
        MsgBox "No data in the destination worksheet.", _
            vbCritical, "Update Worksheet"
        Exit Sub
    End If
    Dim drCount As Long: drCount = dcrg.Rows.Count - 1
    Dim drg As Range: Set drg = dcrg.Resize(drCount).Offset(1)
    Dim dData As Variant: dData = drg.Value

    Dim cCount As Long: cCount = drg.Columns.Count
    
    Dim rValue As Variant
    Dim rIndex As Variant
    Dim r As Long
    Dim c As Long
    
    For r = 1 To drCount
        rValue = dData(r, CritCol)
        If Len(rValue) > 0 Then
            rIndex = Application.Match(rValue, scData, 0)
            If IsNumeric(rIndex) Then
                For c = 1 To cCount
                    dData(r, c) = sData(rIndex, c)
                Next c
            End If
        End If
    Next r
    
    drg.Value = dData
    'drg.EntireColumn.AutoFit
    'wb.Save

    MsgBox "Worksheet updated.", vbInformation, "Update Worksheet"
            
End Sub

答案2

为了Excel 2019 或更低版本

=IFERROR(INDEX(Sheet2!A2:C3,MATCH(INDEX(Sheet1!A2:C5,,1),INDEX(Sheet2!A2:C3,,1),0),{1,2,3}),Sheet1!A2:C5)

这是一个数组公式,因此如果您的 Excel 是 2016 年之前的版本,则必须使用CTRL+ SHIFT+输入ENTER

为了Excel 365,您可以更轻松地修改公式:

=LET( st, Sheet1!A2:C5,
      ct, Sheet2!A2:C3,
       skeys, INDEX( st,, 1), ckeys, INDEX( ct,, 1),
       IFERROR( INDEX(ct,MATCH( skeys, ckeys, 0 ),SEQUENCE(1,COLUMNS(st))), st )
      )

将 Sheet1 中的起始表放入变量中英石并将校正表放入变量中电脑断层扫描。它可以输入到新工作表的左上角,然后它会自动溢出以自动完成结果,如下面的屏幕截图所示。

我必须扩展你的表格来测试它,所以我使用了:

工作表1

在此处输入图片描述

工作表2

在此处输入图片描述

新页

在此处输入图片描述

相关内容