答案1
使用如下数据:
在标准模块中输入以下用户定义函数:
Public Function FindAll(v As Variant, rng As Range) As String
Dim i As Long
ary = rng
For i = LBound(ary, 1) To UBound(ary, 1)
If v = ary(i, 1) Then FindAll = FindAll & "," & ary(i, 2)
Next i
FindAll = Mid(FindAll, 2)
End Function
选择一个单元格,比如说D7,然后输入:
=MIN(A:A)
以及C7进入:
=findall(D7,A1:B25)
用户定义函数 (UDF) 非常容易安装和使用:
- ALT-F11 打开 VBE 窗口
- ALT-I ALT-M 打开新模块
- 粘贴内容并关闭 VBE 窗口
如果您保存工作簿,UDF 将随之保存。如果您使用的是 2003 之后的 Excel 版本,则必须将文件保存为 .xlsm 而不是 .xlsx
要删除 UDF:
- 调出如上所示的 VBE 窗口
- 清除代码
- 关闭 VBE 窗口
要从 Excel 使用 UDF:
=我的函数(A1)
要了解有关宏的更多信息,请参阅:
http://www.mvps.org/dmcritchie/excel/getstarted.htm
和
http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx
有关 UDF 的详细信息,请参阅:
http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx
必须启用宏才能使其工作!
答案2
仅使用 Excel 中已有的函数即可解决您的问题。我使用了此关联然后针对您的问题进行了调整。假设您的产品在 A 列,您的值在 B 列,请使用以下公式:
=IFERROR(INDEX($B$2:$B$20,SMALL(IF($A$2:$A$20=$E$3;ROW($A$2:$A$20)-1);ROW()-2));"")
按 ctrl+shift+enter(数组公式)输入并向下拖动以查看所有出现的情况。
它是如何工作的?该if
函数首先检查查找范围中的值是否等于查找值,如果是,则返回该值的索引。(您必须这样做,row(..)-1
因为您的数据从第 2 行开始。row()-2
最后是为了确保您在向下拖动时获得最小值的第一次、第二次……出现。需要 -2,因为您的公式将出现在工作表的第三行。我最终将所有内容包装在一个iferror
函数中,因此只会显示好的值,而不会显示错误消息。