我有 600 个商品代码,每个代码都用整体商品代码中的属性进行编码。例如,我们可能有普通商品 600,然后是 600BK(黑色机身)和 600BKR(黑色机身,红色细节)和 600BKR-YEL(黑色机身,红色细节,黄色底座)。
所以我得到了商品代码列表:
600
600BK
600BKR
600BKR-YEL
然后在单独的工作表上查找每个代码的列表以及它代表的含义:
BK Black Body
R Red Detail
YEL Yellow Base
我想编写一个函数,它可以查找查找表上的项目标题中的每个代码,然后返回每个找到的代码的所有相应值,最好在一个单元格中。
600
600BK Black Body
600BKR Black Body Red Detail
600BKR-YEL Black Body Red Detail Yellow Base
这可能吗?
答案1
我会做类似以下的事情。假设您的商品代码列表位于 Sheet1 的 A 列,即第 2-20 行,而您的查找列表位于 Sheet2 的 A 列和 B 列,即第 2-10 行:
=IFERROR(VLOOKUP(MID(A2,4,2),Sheet2!$A$2:$B$4,2,0),"")&" "
&IFERROR(VLOOKUP(MID(A2,6,1),Sheet2!$A$2:$B$4,2,0),"")&" "
&IFERROR(VLOOKUP(MID(A2,8,3),Sheet2!$A$2:$B$4,2,0),"")
在单元格 B2 中,然后向下复制 Sheet1 中的所有行。
虽然它确实将查找放在一个公式中,但如果您有许多代码,这种方法会非常麻烦。我建议您在 Sheet1 中为每个代码位置插入辅助行(例如 mid(A2,4,2)),然后将它们连接成一个字符串。
答案2
简短的回答是“是”,但答案可能比较长。
由于您的问题中没有排除许多可能性(例如,普通物品的编码长度超过三个数字或字母数字,每个普通物品的代码超过三个,代码的重要性因普通物品而异等),我建议最安全的做法是从解析代码开始。这应该可以避免 GR 是灰色主体带红色细节(通常是兼容的配色方案!)或绿色主体等复杂情况。
假设这些已经被解析(从第 2 行开始在 B:D 三列中),之后很容易,使用您的查找表(单独工作表上的表)命名codes
:
=VLOOKUP(B2,codes,2,0)&VLOOKUP(C2,codes,2,0)&VLOOKUP(D2,codes,2,0)
在您的商品代码表中。为了在值之间留出空格,我假设代码数组右侧列中的所有条目都以空格结尾(很容易排列,例如将 =A2&" " 复制下来等)。
因此,困难的部分可能是从项目代码中解析出代码,为此我建议添加如下所示的列(如果有三个以上的代码,则添加更多列):
公式如下:
ColumnB 用于定义从哪里开始查找代码(如果纯代码不是三个数字)。ColumnC:D 用于从哪里开始搜索下一个代码/下一个代码的长度。我同意这并不优雅,但相对通用。在向右侧工作之前,请确保左侧的解析正确。
解析成功后,我建议复制/粘贴特殊/值(以摆脱公式),然后替换空白的使用句号(以避免查找公式出错而不会使其变得更复杂)*。此外,假设您的商品代码列表位于 ColumnA 中,请在应用上述查找公式之前删除 ColumnsB:F(或调整引用以适应)-并根据需要添加更多查找。
*疏忽:确保在查找表的每一列的单元格中添加句号。
添加 c5、c6 和 c7 的列以允许 (a) 最大长度 7 和 (b)“最坏情况”场景(即所有单个字符)。
答案3
这是使用搜索功能的版本(不区分大小写的 find 版本)。设置如下。
在工作表 1 中,要查找的代码从工作表 1 的 A 列开始。最终结果将在 B 列中。C、D 等列将唯一代码水平排列在第 1 行中,即“BK”在 C1 中,“R”在 D2 中,等等。实现此目的的实际方法是简单地复制查找表中的代码列表,然后通过选择性粘贴将它们水平转置到单元格 C1、D1 等中。
然后首先在单元格 B2 中输入以下公式:
=IF(NOT(ISERROR(SEARCH(C$1,$A2))),VLOOKUP(C$1,Sheet2!$A$2:$B$4,2,0),"")
将此公式从 C 列复制到第 2 行中创建的代码列数。
最后,在单元格 C2 中,连接第 2 行的所有结果,即公式
=D2&" "&E2&" "&F2
等等,对于第 1 行中包含代码的所有列。这个步骤很繁琐,但可以使用以下 VBA 函数简化,该函数允许连接范围内的所有单元格:
Function Concat(useThis As Range, Optional delim As String) As String
' this function will concatenate a range of cells and return the result as a single string
' useful when you have a large range of cells that you need to concatenate
' source: http://chandoo.org/wp/2008/05/28/how-to-add-a-range-of-cells-in-excel-concat/
Dim retVal As String, dlm As String, cell As Range
retVal = ""
If delim = Null Then
dlm = ""
Else
dlm = delim
End If
For Each cell In useThis
If CStr(cell.Value) <> "" And CStr(cell.Value) <> " " Then
retVal = retVal & CStr(cell.Value) & dlm
End If
Next
If dlm <> "" Then
retVal = Left(retVal, Len(retVal) - Len(dlm))
End If
Concat = retVal
End Function
您可以将此功能插入并复制到 Developer VBA 中的模块中。用法很简单 - 例如 concat(C1:D1," ")。
请注意,这种方法适用于所有 2 个字符的代码,并且如果 1 个字符的代码不在 2+ 个字符的代码中(即,如果不存在诸如“R”和“BR”的代码对),则该方法也适用于所有 1 个字符的代码。