我有 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
新页