我有一个VLOOKUP
用于查找Account #
并返回的字段Rep
。该Account #
字段包含历史数据(每个帐户,包括不活跃帐户)。我如何设置一个VLOOKUP
来查看通过检查每个来提取代表名称Account #
?
Account # | Email | Rep Name | Match Name
12345 | [email protected] | Rep Name | Rep Name Match
4564566, 45678 | [email protected] | Rep Name | #N/A
答案1
没有账户的最大数量。查找会将代表姓名与“活跃”账户列表(通常在单独的选项卡中)进行核对。有些账户有 5 个以上的账户号。导出中没有硬编码的最大值。
答案2
虽然有多种方法可以使用内置 Excel 功能或公式来完成此操作,但没有一种特别有吸引力。
基本思路是将实际包含多个帐户的“帐户编号”项拆分到不同的单元格中,对每个包含的帐户进行单独的代表名称查找,然后挑选出成功的查找(如果有)。可以使用“数据”选项卡中的“文本到列”命令或一组字符串解析公式来完成拆分。可以使用嵌套IF(ISERROR(...))
函数或更奇特的数组公式来“挑选”成功的查找。
在此,VBA 解决方案是一个合理的选择。
以下用户定义函数将包含一个或多个帐户的字符串(或对字符串的单元格引用)和对查找范围的引用作为其参数;如果字符串中存在帐户匹配项,则返回代表名称。可选的第三个参数可用于指定帐户字符串中帐户之间的分隔符。如果未指定,则该函数使用逗号和空格(“”,“)的默认分隔符。
该函数将返回其找到的第一个帐户匹配项的代表名称,忽略帐户字符串中可能找到的其他帐户的任何匹配项。如果未找到帐户匹配项,该函数将返回 #VALUE! 错误。
Option Explicit
Function AcctRepLookup(Accts As String, RepLookUpRange As Range, Optional Separator As Variant) As Variant
Dim acctArray As Variant
Dim acct As Variant
Dim lookupArray As Variant
Dim i As Long
If IsEmpty(Separator) Then
Separator = ", "
End If
acctArray = Split(Accts, Separator) 'put acct list into array
lookupArray = RepLookUpRange.Value 'put lookup table into array
For Each acct In acctArray 'loop through accounts
For i = LBound(lookupArray) To UBound(lookupArray) 'loop through lookup table
If UCase(acct) = UCase(lookupArray(i, 1)) Then
AcctRepLookup = lookupArray(i, 2) 'a match:) exit with rep name
Exit Function
End If
Next i
Next acct
AcctRepLookup = CVErr(xlErrValue) 'no match:( exit with error
End Function
要在您正在使用的工作簿中安装该函数,首先在功能区的“开发人员”选项卡上选择“Visual Basic”选项(左侧第一项),然后从菜单栏中选择“插入/模块”将该函数粘贴到出现的代码窗格中。