【问题标题】:Complex pivot-like summary without VBA没有 VBA 的复杂枢轴式摘要
【发布时间】:2012-08-12 05:20:37
【问题描述】:

给定一组这样的数据:

User    Item1 Desc.    Item1 Sel.    Item2 Desc.    Item2 Sel.    Item3 Desc.    Item3 Sel.
UserA   Item 1         Yes           Item 2         Yes           Item 3         Yes
UserB   Item 1         Yes           Item 2         No            Item 3         No
UserB   Item 1         Yes           Item 2         Yes           Item 3         No
UserC   Item 1         Yes           Item 2         No            Item 3         Yes
UserA   Item 1         No            Item 2         Yes           Item 3         Yes
UserA   Item 1         Yes           Item 2         No            Item 3         Yes

有没有一种方法可以使用内置的 Excel 工具、函数或公式来生成这样的输出

Item    UserA    UserB    UserC
Item1   1        0        0
Item2   1        1        1
Item3   0        2        0

ItemsUsers 在哪里合并,呈现的值是表中Nos 的计数?

我被要求为我的一位同事准备这个,最后创建了下面的 VBA 函数。它又快又脏,当然需要重构,但它确实让我得到了我需要的东西。

Sub SummarizeData()

Dim wksSrc As Worksheet
Dim dicAssoc As Object
Dim l As Long
Dim i As Integer
Dim rngCell As Range
Dim v As Variant

    Set dicAssoc = CreateObject("Scripting.Dictionary")
    With ThisWorkbook.Sheets.Add()
        .Name = "Results"
        Set wksSrc = ThisWorkbook.Sheets("data")
        For l = 2 To 184
            If Not dicAssoc.exists(wksSrc.Range("C" & l).Value) Then
                dicAssoc.Add wksSrc.Range("C" & l).Value, wksSrc.Range("C" & l).Value
            End If
        Next l
        .Range("A1:A26").Value = ThisWorkbook.Sheets("Sheet5").Range("A1:A26").Value
        l = 2
        For Each v In dicAssoc.items
            .Cells(1, l).Value = v
            l = l + 1
        Next v
        For Each rngCell In wksSrc.Range("A2:CT184").Cells
            For l = 2 To 26
                If rngCell.Value = .Cells(l, 1).Value Then
                    If rngCell.Offset(0, 1).Value = "No" Then
                        For i = 2 To 148
                            If .Cells(1, i).Value = wksSrc.Range("C" & rngCell.Row).Value Then
                                .Cells(l, i).Value = .Cells(l, i).Value + 1
                            End If
                        Next i
                    End If
                End If
            Next l
        Next rngCell
    End With
End Sub

我最初试图在没有代码的情况下解决这个问题,但经过一些试验和错误后,我决定最好不要在这个项目上浪费我的一整天。我想我可以试试DCOUNTA,但这需要我提取多行额外的数据,这会浪费空间:

DCOUNT 条件示例:

Item1 Sel.    Item2 Sel.    Item3 Sel.    User
No                                        UserA
              No                          UserA
                            No            UserA
No                                        UserB
              No                          UserB
                            No            UserB

等等等等。大约有 25 个项目和大约 25 个用户,这将是一个巨大的块,其中大部分都必须手动创建。到那时,我还不如手动计算所有东西。

我还考虑过使用VLOOKUPHLOOKUPINDEXINDIRECT 的组合,但我永远无法得到一个将Nos 计数的结果ALL ;它总是抓住它找到的第一行。

我想知道是否有一种相对简单的方法来生成此摘要不使用使用 VBA。

【问题讨论】:

  • 我不确定我是否理解。你是如何得到如上图所示的输出的?
  • 没关系 :) 你试过 sumproduct 公式吗?
  • @SiddharthRout 根据数据表,UserA 有 3 个条目。在这些条目中,Item1 Sel. 有 1 个NoItem2 Sel. 有 1 个,Item3 Sel. 没有。因此,UserA 的输出是 1, 1, 0。相反,在Item1 Sel. 的所有条目中,只有一个是No,恰好是UserA。因此,Item1 的输出是1, 0, 0。如果您还有什么需要我澄清的,请告诉我!
  • @SiddharthRout 不,我不熟悉该功能。 (非常快速地)查看有关它的应用程序帮助,我不确定我将如何获得我正在寻找的东西。
  • 这是你想要的吗? wikisend.com/download/352772/untitled.png 已使用公式生成输出

标签: vba excel excel-2003 pivot-table


【解决方案1】:

使用SUMPRODUCT 公式可以轻松实现您想要的。

请查看随附的示例和屏幕截图。

要查找项目 1 和用户 1 的“否”数字,我使用的公式是

=SUMPRODUCT(($A$2:$A$7=$B$11)*($C$2:$C$7="No"))

同样,你必须为剩下的事情做。

示例文件

http://wikisend.com/download/725440/Gaffi.xlsx

快照

【讨论】:

  • +1 一如既往地提供出色的客户体验和解释!注: - 您可以将=SUMPRODUCT(($A$2:$A$7=$B$11)*($C$2:$C$7="No")) 替换为=COUNTIFS($C$2:$C$7,"No",$A$2:$A$7,B$11)) (如果您没有XL2007 或更高版本,请忽略此评论)
  • 我回来添加评论。自从与我共享此工具以来,我遇到了许多使用SUMPRODUCT 简化的情况。这是任何优秀的 Excel 用户都应该拥有的东西!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
相关资源
最近更新 更多