在一个Excel单元格中做一组求和(数据透视,但不想使用数据透视)

时间:2018-07-26 19:57:26

标签: excel vba excel-vba excel-formula

我尝试使用textjoin函数执行此操作,但无法完全弄清楚。我具有以下动态范围:

Product Problem Type
A       Type1
A       Type2
A       Type1
A       Type1
B       Type2
B       Type2
B       Type3
C       Type3
C       Type1
C       Type2
D       Type3
D       Type3
E       Type1

我可以很容易地在一个单独的列中按总和(类似于SQL)进行分组,按产品类型对Type1和Type2进行求和(不要对Type3求和)。我的目标是创建一个像这样的一个单元格(不确定常规excel公式是否可以实现)

“ A-4,B-2,C2,E-1”。本质上,它在一个单元格中找到唯一的产品类型,并将乘积的Type1和Type2相加。有可能吗?

由于A的类型为type1 / type2,因此该公式会将不同的乘积值返回到每个字母旁边带有数字4的一个单元格中。注意:如果我创建“总计”列并将groupby公式放在其中,则可以可以通过在公式末尾使用B2:B14&D2:D14而不是sum(countif)部分来使其工作。

  {=TEXTJOIN(", ", TRUE, IF(MATCH(B2:B14, B2:B14, 0)=MATCH(ROW(B2:B14), ROW(B2:B14)), B2:B14&SUM(COUNTIFS(B:B,B2,C:C,{"Type1","Type2"})), ""))}

1 个答案:

答案 0 :(得分:1)

假设产品范围为Col A,问题范围为Col B。 这将利用Col D,并在完成后将您的输出放在单元格D1上。如果列D中有数据,请更改代码以使用其他列。

您需要调整第三行以反映工作表名称(将Sheet3与工作表名称交换并保留引号


Option Explicit

Sub Zero()

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet3")
Dim Product As Range, MyString As String

Application.ScreenUpdating = False
    With ws
        .Range("A1:A" & .Range("A" & .Rows.Count).End(xlUp).Row).AdvancedFilter xlFilterCopy, , .Range("D1"), True

            For Each Product In .Range("D2:D" & .Range("D" & .Rows.Count).End(xlUp).Row)
                MyString = MyString & Product & "-" & (Application.WorksheetFunction.CountIfs(.Range("A:A"), Product.Value, .Range("B:B"), "Type1") + _
                                                                              Application.WorksheetFunction.CountIfs(.Range("A:A"), Product.Value, .Range("B:B"), "Type2")) & ", "
            Next Product

        .Range("D1:D" & .Range("D" & .Rows.Count).End(xlUp).Row).ClearContents
        .Range("D1") = Left(MyString, Len(MyString) - 2)
    End With
Application.ScreenUpdating = True

End Sub