【问题标题】:How do I get all the different unique combinations of 3 columns using VBA in Excel?如何在 Excel 中使用 VBA 获得 3 列的所有不同唯一组合?
【发布时间】:2016-09-07 21:17:02
【问题描述】:

我有一个包含多列的 Excel 工作表,其中 3 列形成一个“唯一键”。
如果我在 A 列中有水果(Apple、Banana、Orange),在 B 列中有一些名称(John、Peter),在 C 列中有类似 Yes/No 的内容,我希望能够从值所在的行中获取值的总和在这些列中是相同的。 例如,对于其中 A、B 和 C 列分别为 Apple、John、Yes 的行,D 列中所有值的总和。

抱歉文字混乱,但我不知道如何更清楚地表达我的问题。我从来没有在 VBA 中做过任何事情,所以我有点迷失在这里......

以下是预期结果的示例。

【问题讨论】:

  • 看看SUMIFS函数。
  • 由于这不是使用 VBA,我已添加为评论。在 2007 年或以后,您可以使用 SUMIFS,正如 Doug 所提到的: =SUMIFS($D$1:$D$6,$A$1:$A$6,"Apple",$B$1:$B$6,"John" ,$C$1:$C$6,"Yes") 在 2003 年您可以使用 SUMPRODUCT:=SUMPRODUCT(($A$1:$A$6="Apple")*($B$1:$ B$6="约翰")*($C$1:$C$6="是")*$D$1:$D$6)
  • 感谢您的回复。 @Darren,问题是,我事先不知道存在哪些组合。目标是列出所有唯一组合和其他一些列的总和。我可以在不使用 VBA 的情况下做到这一点吗?
  • 显示样本数据和预期结果的内容将有助于我们理解。
  • 你说得对,我在原帖中添加了一张简单的图片。如何为数据源上的每个唯一组合生成右侧的行?

标签: vba excel


【解决方案1】:

也可以转到数据选项卡 -> 删除重复项。然后,您可以选择要在删除重复项时比较哪些列。

【讨论】:

    【解决方案2】:

    我事先不知道存在哪些组合。目标是列出所有唯一组合和其他一些列的总和。我可以在不使用 VBA 的情况下做到这一点吗?

    不需要公式/VBA。使用数据透视表汇总所有组合。看截图

    如果您仍然想要 VBA,那么也可以这样做:)

    编辑

    我很快就写了这篇

    Sub sample()
        Dim ws As Worksheet
        Dim lRow As Long, i As Long, j As Long
        Dim col As New Collection
        Dim Itm
        Dim cField As String
    
        Const deLim As String = "#"
    
        Set ws = ThisWorkbook.Sheets("Sheet1")
    
        With ws
            lRow = .Range("A" & .Rows.Count).End(xlUp).Row
    
            For i = 2 To lRow
                cField = .Range("A" & i).Value & deLim & _
                         .Range("B" & i).Value & deLim & _
                         .Range("C" & i).Value
    
                On Error Resume Next
                col.Add cField, CStr(cField)
                On Error GoTo 0
            Next i
    
            i = 2
    
            .Range("A1:C1").Copy .Range("F1")
            .Range("I1").Value = "Count"
    
            For Each Itm In col
                .Range("F" & i).Value = Split(Itm, deLim)(0)
                .Range("G" & i).Value = Split(Itm, deLim)(1)
                .Range("H" & i).Value = Split(Itm, deLim)(2)
    
    
                For j = 2 To lRow
                    cField = .Range("A" & j).Value & deLim & _
                             .Range("B" & j).Value & deLim & _
                             .Range("C" & j).Value
    
                    If Itm = cField Then nCount = nCount + 1
                Next
                .Range("I" & i).Value = nCount
    
                i = i + 1
                nCount = 0
            Next Itm
        End With
    End Sub
    

    【讨论】:

    • 这看起来非常接近我想要的。无论如何将其显示为单元格,类似于我的示例?因为这些数据随后将用于其他目的。非常感谢您的帮助!
    • 对于您需要的确切格式,您需要 VBA
    • 刷新页面。我也提供了一个 VBA 示例
    • 您的 VBA 代码计算行数,但我想我可以调整它来计算其他列的总和。非常感谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多