我正在尝试使用vlookup或类似功能来搜索工作表,匹配帐号,然后返回指定的值。我的问题是有重复的帐号,我希望结果将结果连接成一个字符串。
Acct No CropType
------- ---------
0001 Grain
0001 OilSeed
0001 Hay
0002 Grain
在第一个工作表中,在第二个工作表上我有Acct No和其他信息,我需要将所有匹配结果放到第二个工作表上的一列中,即。 “谷物油籽干草”
答案 0 :(得分:8)
这是一个可以为你做的功能。它与Vlookup略有不同,你只会给它搜索列,而不是整个范围,然后作为第三个参数,你会告诉它剩下多少列(负数)或右(正)以获得你的回报值。
我还添加了使用分隔符的选项,在您的情况下,您将使用“”。这是函数调用,假设第一行的帐号是A,结果是行B:
=vlookupall("0001", A:A, 1, " ")
这是功能:
Function VLookupAll(ByVal lookup_value As String, _
ByVal lookup_column As range, _
ByVal return_value_column As Long, _
Optional seperator As String = ", ") As String
Dim i As Long
Dim result As String
For i = 1 To lookup_column.Rows.count
If Len(lookup_column(i, 1).text) <> 0 Then
If lookup_column(i, 1).text = lookup_value Then
result = result & (lookup_column(i).offset(0, return_value_column).text & seperator)
End If
End If
Next
If Len(result) <> 0 Then
result = Left(result, Len(result) - Len(seperator))
End If
VLookupAll = result
End Function
注意:
答案 1 :(得分:2)
执行此操作的一种方法是使用数组公式将所有匹配填充到隐藏列中,然后将这些值连接到字符串中以供显示:
=IFERROR(INDEX(cropTypeValues,SMALL(IF(accLookup=accNumValues,ROW(accNumValues)-MIN(ROW(accNumValues))+1,""),ROW(A1))),"")
以数组公式输入(Ctrl + Shift + Enter),然后根据需要进行复制。
如果您需要解释公式的任何部分,请告诉我。
答案 2 :(得分:0)
我刚遇到类似的问题,我已经查了很长时间的类似解决方案了,但事实并没有让我信服。您必须编写一个宏或一些特殊功能,而对于我的需求,最简单的解决方案是在例如使用数据透视表。 Excel中。
如果您从数据创建一个新的数据透视表,并首先添加“Acct No”作为行标签,然后将“CropType”添加为RowLabel,您将有一个非常好的分组,为每个帐户列出所有裁剪类型。但它不会在单个单元格中这样做。
答案 3 :(得分:0)
这是我的代码甚至比excel vlookup更好,因为你可以选择标准colum,并且肯定是分隔符(Carriege也返回)......
Function Lookup_concat(source As String, tableau As Range, separator As String, colSRC As Integer, colDST As Integer) As String
Dim i, y As Integer
Dim result As String
If separator = "CRLF" Then
separator = Chr(10)
End If
y = tableau.Rows.Count
result = ""
For i = 1 To y
If (tableau.Cells(i, colSRC) = source) Then
If result = "" Then
result = tableau.Cells(i, colDST)
Else
result = result & separator & tableau.Cells(i, colDST)
End If
End If
Next
Lookup_concat = result
End Function
还有礼物,您还可以对同一单元格的多个元素进行查找(基于相同的分隔符)。真的很有用
Function Concat_Lookup(source As String, tableau As Range, separator As String, colSRC As Integer, colDST As Integer) As String
Dim i, y As Integer
Dim result As String
Dim Splitted As Variant
If separator = "CRLF" Then
separator = Chr(10)
End If
Splitted = split(source, separator)
y = tableau.Rows.Count
result = ""
For i = 1 To y
For Each word In Splitted
If (tableau.Cells(i, colSRC) = word) Then
If result = "" Then
result = tableau.Cells(i, colDST)
Else
Dim Splitted1 As Variant
Splitted1 = split(result, separator)
If IsInArray(tableau.Cells(i, colDST), Splitted1) = False Then
result = result & separator & tableau.Cells(i, colDST)
End If
End If
End If
Next
Next
Concat_Lookup = result
End Function
上一个子需要此功能
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)
End Function
答案 4 :(得分:-1)
Function VLookupAll(vValue, rngAll As Range, iCol As Integer, Optional sSep As String = ", ")
Dim rCell As Range
Dim rng As Range
On Error GoTo ErrHandler
Set rng = Intersect(rngAll, rngAll.Columns(1))
For Each rCell In rng
If rCell.Value = vValue Then
VLookupAll = VLookupAll & sSep & rCell.Offset(0, iCol - 1).Value
End If
Next rCell
If VLookupAll = "" Then
VLookupAll = CVErr(xlErrNA)
Else
VLookupAll = Right(VLookupAll, Len(VLookupAll) - Len(sSep))
End If
ErrHandler:
If Err.Number <> 0 Then VLookupAll = CVErr(xlErrValue)
End Function
像这样使用:
=VLookupAll(K1, A1:C25, 3)
在A1:A25范围内查找K1值的所有出现值,并从C列返回相应的值,以逗号分隔。
如果要对值求和,可以使用SUMIF,例如
=SUMIF(A1:A25, K1, C1:C25)
对C1:C25中的值求和,其中A列中的相应值等于K1的值。
ALL D BEST。