Excel技术问询:如何按姓名和姓氏查找当前行的历史薪资记录
实现双条件匹配的Excel旧薪资查找方案
需求说明
在Excel表格中,需根据当前行的**Name(姓名)和Surname(姓氏)双条件,查找当前行之前的匹配记录,将对应Current Salary(当前薪资)的值填入该行的Old Salary(旧薪资)**列。例如:
| ID | Name | Surname | Current Salary | Old Salary |
|---|---|---|---|---|
| 1 | Lisa | Smith | 10000 | |
| 2 | Thomas | Phu | 5000 | |
| 3 | Lisa | Franklin | 90000 | |
| 3 | Lisa | Smith | 20000 | 10000(匹配第一行的姓名+姓氏,取对应薪资) |
修改后的VBA函数(双条件适配)
针对你提供的单条件VBA函数,修改为支持双条件匹配且仅查找当前行之前记录的版本:
Function OldSalaryLookup(LookupName As String, LookupSurname As String, DataRange As Range) As Variant Dim currentRow As Long Dim i As Long ' 获取当前公式所在的行号 currentRow = Application.Caller.Row ' 从当前行的上一行开始,向上遍历数据区域查找匹配项 For i = currentRow - 1 To DataRange.Row Step -1 ' 确保遍历的行在指定的数据范围内 If i >= DataRange.Row Then ' 匹配姓名和姓氏双条件 If DataRange.Cells(i - DataRange.Row + 1, 2) = LookupName And _ DataRange.Cells(i - DataRange.Row + 1, 3) = LookupSurname Then ' 返回对应行的Current Salary(第4列) OldSalaryLookup = DataRange.Cells(i - DataRange.Row + 1, 4) Exit Function End If End If Next i ' 无匹配记录时返回空值 OldSalaryLookup = "" End Function
使用方法
- 按
Alt + F11打开VBA编辑器,插入一个新模块,将上述代码粘贴进去。 - 返回Excel,在Old Salary列的第一个数据单元格(比如E2)中输入公式:
=OldSalaryLookup(B2, C2, $A$1:$D$100)B2:当前行的姓名单元格C2:当前行的姓氏单元格$A$1:$D$100:包含所有数据的区域(根据实际数据范围调整)
- 下拉填充公式到所有需要计算的行即可。
非VBA替代方案(公式实现)
如果不想使用VBA,可以直接用XLOOKUP函数(适用于Excel 365/2021及以上版本):
=XLOOKUP(B2&C2, $B$1:B1&$C$1:C1, $D$1:D1, "", 0, 1)
B2&C2:拼接当前行的姓名和姓氏作为查找值$B$1:B1&$C$1:C1:仅查找当前行之前的姓名+姓氏拼接区域$D$1:D1:对应区域的Current Salary- 最后一个参数
1表示从上到下查找第一个匹配项(即最早的历史记录)
内容的提问来源于stack exchange,提问作者user20381296
相关产品推荐
相关产品推荐

