答案1
不使用 VBA 的巧妙解决方案
- 插入
=""
到 G2:G6。 - 插入
=IF(NOT(ISNA(MATCH($A2,D$2:D$5,0))),CONCATENATE(G2,IF(G2="","",", "),D$1),G2)
H2 并将其复制到 H2:J6 - 插入
=J2
到B2并复制到B2:B6
如果添加机架,则需要在 J 柱右侧添加列。
如果 Excel 中有一个好的字符串连接函数,我们就可以缩短它......
解释
我们需要放入=""
G 列,因为我希望在 H 到 J 列中有相同的代码并且没有多余的 if 子句。
长命令解释道:
- A2 位于 D2:D5 列的哪一行(如果不存在则为 #NA)=> MATCH(A2,D2:D5,0)
- A2 不在 D2:D5 列中 => ISNA(MATCH(A2,D2:D5,0))
- 反转“A2 是否不在 D2:D5 列中”=>NOT(ISNA(MATCH(A2,D2:D5,0)))
- 如果发生上述情况则执行此操作,否则执行该操作 => IF(NOT(ISNA(MATCH(A2,D2:D5,0))),THIS,THAT)
- 这个(A2 在列中 = 我们想要写下“Rack 1”)=> CONCATENATE(G2,IF(G2="","",", "),D1)
- 那(我们没有新东西)=> G2
答案2
以下是使用 VBA/宏的操作:
Public Function racks(code As String, range As range) As String
result = ""
Separator = ","
colRanges = range.Columns.Count
rowRanges = range.Rows.Count
For i = 1 To colRanges
For j = 2 To rowRanges
If code = range.Cells(j, i) Then
If result <> "" Then
result = result & Separator & range.Cells(1, i)
Else
result = range.Cells(1, i)
End If
j = rowRanges
End If
Next j
Next i
racks = result
End Function
使用 Alt+F11 打开 VBA/Macros,在下方插入一个新模块本工作簿,并将此代码粘贴到右侧。
该函数使用两个参数,代码和范围它将在哪里进行搜索。
例如,对于细胞B2 根据您的示例,它将是=racks(A2,$D$1:$F$5)
。