Answers:
看起来你正在尝试使用Excel作为关系数据库,它并不是那么出色。最重要的是,除非近年来发生了变化(我没有乐于在Excel 2010之后使用任何东西),否则没有工作表函数可以将范围或数组转换为分隔字符串。你必须提出一个VBA工作表函数来做到这一点。
您可以使用数组公式和VBA的组合来执行您想要的操作。在你走得更远之前,如果你发现自己定期做这样的事情,我强烈建议你使用真正的数据库程序。我过去曾经滥用Excel来做简单的类似关系数据库的任务,但只是简单的。如果我不得不做更复杂的事情,那将是非常痛苦的。
假设您要搜索的ID在单元格中F1
并且您的表格被调用Table1
,则输入以下内容作为数组公式(使用control-shift-enter,而不是enter)。SimpleCat
是你的VBA连接工作表函数。
=SimpleCat(IF(Table1[Deal ID (Primary Key)]=$F$1, Table1[Name], ""))
一SimpleCat
,会为这个特定实例的工作如下:
Function SimpleCat(Args() As Variant) As Variant
Dim a As Variant
SimpleCat = ""
For Each a In Args
If a <> "" Then SimpleCat = SimpleCat & a & ", "
Next
If Len(SimpleCat) > 0 Then SimpleCat = Left$(SimpleCat, Len(SimpleCat) - 2)
End Function
我把它作为练习让你扩展SimpleCat
以使其更通用,因为拥有更全功能的通用连接功能在任何人的工具箱中都很有用。
说明:
当评估为数组公式时,将整个表列与单个值进行比较将生成TRUE
s和FALSE
s 的数组。使用一个IF
将构造一个新数组,从你正在使用的数组的正确位置拉取值,如果是真的那边IF
,并填写你正在使用的空字符串,如果是假的一面IF
。该SimpleCat
函数将所有非空值放在这个新数组中,并在它们之间使用逗号。
我会采取这个功能......
Function ConcatRange(inputRange As Range, Optional delimiter As String) As String
Dim oneCell As Range
Dim usedRange As Range
Set usedRange = Application.Intersect(inputRange.Parent.usedRange, inputRange.Cells)
If Not (usedRange Is Nothing) Then
For Each oneCell In usedRange
If oneCell.Text <> vbNullString Then
ConcatRange = ConcatRange & delimiter & Trim(oneCell.Text)
End If
Next oneCell
ConcatRange = Mid(ConcatRange, Len(delimiter) + 1)
End If
End Function
并修改它以创建一个类似于的新函数:
Function ConcatIf(KeyRange as Range, KeyValue as Variant, DataColumnOffset As Integer)
它将在KeyRange中循环遍历每个单元格,并且只有当其值等于KeyValue时,才会连接其中的值 oneCell.Offset(0, DataColumnOffset)