我有两列 钥匙和价值 (标准地图)
有重复的键。删除重复的键(即删除重复项按钮)很简单。但这会删除值列中的一些有用数据(或者打乱配对)。
真正应该做的是合并数据,以便根据重复键将值连接起来。理想情况下,这应该在考虑特定格式的情况下完成,但这并不重要。
对于数值来说,这似乎相对简单,但对于基于文本的要求来说则不那么简单。
例如http://www.extendoffice.com/documents/excel/1268-excel-combine-duplicate-rows-and-sum.html
我希望求和等同于连接;但遗憾的是事实似乎并非如此。
答案1
我思考这听起来像类似问题我刚刚用 VBA 回答了这个问题。对于您的解决方案,您需要复制列Key
,删除重复项,然后使用公式调用返回以逗号分隔的值字符串的 UDF。
这是该问题的最终结果:
代码如下:
Option Explicit
Function LookupCSVResults(lookupValue As Variant, lookupRange As Range, resultsRange As Range) As String
Dim s As String 'Results placeholder
Dim sTmp As String 'Cell value placeholder
Dim r As Long 'Row
Dim c As Long 'Column
Const strDelimiter = "|||" 'Makes InStr more robust
s = strDelimiter
For r = 1 To lookupRange.Rows.Count
For c = 1 To lookupRange.Columns.Count
If lookupRange.Cells(r, c).Value = lookupValue Then
'I know it's weird to use offset but it works even if the two ranges
'are of different sizes and it's the same way that SUMIF works
sTmp = resultsRange.Offset(r - 1, c - 1).Cells(1, 1).Value
If InStr(1, s, strDelimiter & sTmp & strDelimiter) = 0 Then
s = s & sTmp & strDelimiter
End If
End If
Next
Next
'Now make it look like CSV
s = Replace(s, strDelimiter, ",")
If Left(s, 1) = "," Then s = Mid(s, 2)
If Right(s, 1) = "," Then s = Left(s, Len(s) - 1)
LookupCSVResults = s 'Return the function
End Function
为了帮助展示示例,这里是在单元格中显示的公式E1
:
=LookupCSVResults(D1,B1:B7,A1:A7)
以下是该范围内数据的 CSV 版本A1:D7
:
亚当,红色,,红色
亚当,绿色,,绿色
亚当,蓝色
,,蓝色 鲍勃,红色,,黄色
鲍勃,黄色,,
鲍勃,绿色,,
卡尔,红色,,
答案2
我已经在整个互联网上搜索了这个问题。我修改了以下行:
If lookupRange.Cells(r, c).Value = lookupValue Then
至此,部分字符串匹配即可生效:
If InStr(1, lookupRange.Cells(r, c).Value, lookupValue) Then