Excelmacros – 行以逗号分隔的单元格(保留/聚合列)

基于这个数据:

<- A (Category) -> <- B (Items) -> 1 Cat1 a 2 Cat1 b 3 Cat1 c 4 Cat2 d 5 Cat3 e 6 Cat4 f 7 Cat4 g 

我需要这个:

  <- A (Category) -> <- B (Items) -> 1 Cat1 a,b, c 2 Cat2 d 3 Cat3 e 4 Cat4 f, g 

如果你想保留你的原始数据,只是把数据总结在别的地方,你可以使用下面的方法。

在VB中创build一个用户定义的函数,就像CONCATENATE一样,但是可以在数组公式中使用。 这将允许您在CONCATENATE函数中为范围variables添加IF语句。 这是我扔在一起的一个快速版本:

 Private Function CCARRAY(rr As Variant, sep As String) 'rr is the range or array of values you want to concatenate. sep is the delimiter. Dim rra() As Variant Dim out As String Dim i As Integer On Error GoTo EH rra = rr out = "" i = 1 Do While i <= UBound(rra, 1) If rra(i, 1) <> False Then out = out & rra(i, 1) & sep End If i = i + 1 Loop out = Left(out, Len(out) - Len(sep)) CCARRAY = out Exit Function EH: rra = rr.Value Resume Next End Function 

所以你可以在这个表中使用下面的内容来总结项目:

 {=CCARRAY(IF(A1:A7="Cat1",B1:B7),", ")} 

input公式时请记得按Ctrl + Shift + Enter。

你可以试试这个:

 Sub GroupMyValues() Dim oCell As Excel.Range Dim sKey As String Dim sResult As String Set oCell = Worksheets(2).Range("A1") While Len(oCell.Value) > 0 If oCell.Value <> sKey Then 'If first entry, no rows to be deleted If sKey <> "" Then oCell.Offset(-1, 1).Value = sResult End If sKey = oCell.Value sResult = oCell.Offset(0, 1).Value Set oCell = oCell.Offset(1, 0) Else sResult = sResult & ", " & oCell.Offset(0, 1).Value Set oCell = oCell.Offset(1, 0) oCell.Offset(-1, 0).EntireRow.Delete End If Wend 'Last iteration oCell.Offset(-1, 1).Value = sResult End Sub