下面是一个 VBA 代码示例,应该可以做到这一点:
Sub SubWhyNotSUMIFS()
'Declarations.
Dim RngResult As Range
Dim RngTarget As Range
Dim RngSource As Range
Dim StrPreviousProduct As String
'Settings.
Set RngResult = Range("D1")
Set RngSource = Range("A2:C2")
Set RngSource = Range(RngSource, RngSource.End(xlDown))
'Creating space for the result.
RngResult.EntireColumn.Insert
RngResult.EntireColumn.Insert
RngResult.EntireColumn.Insert
'Reporting the headers of the result list.
Set RngResult = RngResult.Offset(0, -3)
RngResult.Value = "Product"
RngResult.Offset(0, 1) = "Unit with DC Code"
RngResult.Offset(0, 2) = "Unit Without DC Code"
'Covering each cell of the first column of RngSource.
For Each RngTarget In RngSource.Columns(1).Cells
'Checking if it's a different product.
If StrPreviousProduct <> RngTarget.Value Then
'Setting RngResult for a new row.
Set RngResult = RngResult.Offset(1, 0)
'Changing StrPreviousProduct.
StrPreviousProduct = RngTarget.Value
'Reporting the results.
RngResult.Value = RngTarget.Value
RngResult.Offset(0, 1).Value = Excel.WorksheetFunction.SumIfs(RngSource.Columns(3), RngSource.Columns(1), RngTarget.Value, RngSource.Columns(2), "<>0")
RngResult.Offset(0, 2).Value = Excel.WorksheetFunction.SumIfs(RngSource.Columns(3), RngSource.Columns(1), RngTarget.Value, RngSource.Columns(2), 0)
End If
Next
End Sub
您可以对其进行逆向工程。您最感兴趣的行是:
RngResult.Offset(0, 1).Value = Excel.WorksheetFunction.SumIfs(RngSource.Columns(3), RngSource.Columns(1), RngTarget.Value, RngSource.Columns(2), "<>0")
RngResult.Offset(0, 2).Value = Excel.WorksheetFunction.SumIfs(RngSource.Columns(3), RngSource.Columns(1), RngTarget.Value, RngSource.Columns(2), 0)
翻译成实际的公式基本上是这样的:
=SUMIFS(C2:C7,A2:A7,D2,B2:B7,"<>0")
=SUMIFS(C2:C7,A2:A7,D2,B2:B7,"=0")
假设您的列表从单元格 A1(标题)到单元格 C7,则在单元格 D2 中有您正在寻找的独特产品。代码本身动态地覆盖列表。由于看起来您的列表是他们自己的列中唯一的内容,因此公式如下:
=SUMIFS(C:C,A:A,D2,B:B,"<>0")
=SUMIFS(C:C,A:A,D2,B:B,"=0")
应该仍然有效。