【问题标题】:A "Count" Based off Filters set in a Pivot Table基于数据透视表中设置的过滤器的“计数”
【发布时间】:2011-05-05 16:15:43
【问题描述】:

因此,我们已经导入了我们查询过的数据,然后根据该查询创建了一个数据透视表。它本质上是一个文件列表,每个文件都有唯一的 ID 号和各种属性(文件扩展名、文档类型、哈希等)。在任何情况下,这些数据都是基于来自不同程序的关键字搜索的“命中”。这意味着同一唯一 ID 可能有多个记录,因为有多个匹配项。

数据透视表允许我们通过过滤掉某些条件来说明/操作(例如,我们不想要某些文件扩展名,或者我们不想要带有 FIELD X 或 FIELD Y0 的记录。报告很好,但我们想要制作一个表单/查询/报告/任何将拉出忽略重复项的“计数”(基于唯一 ID)的内容。例如,一旦在数据透视表中设置了所有过滤器,则基于数据透视表的过滤器/输出,我们想要这样的东西:

.PDF 文件:200 |字段 x 的总计 |总字段 y |等等

.DOCX 文件:320 |字段 x 的总计 |字段 y 的总计 |等等

显然,我们希望在计数中忽略相同唯一 ID 的重复项。

考虑到我们将经常动态地操作数据透视表,最好的方法是什么?理想的情况是打开数据透视表和另一个对象(表单/报告/等),并且随着数据透视表的操作,显示的计数也会发生变化。

【问题讨论】:

    标签: ms-access ms-access-2007 vba pivot-table


    【解决方案1】:

    这里有一些非常粗略的笔记。它们只进行了最低限度的测试,使用 IN 将是一场具有很多值的灾难,但是,切换这一轮并使用排除列表很容易。也许你能得到一些想法。

    Dim oPTable ''PivotTable
    Dim oPM   ''PivotMember
    Dim oFUpd ''PivotFilterUpdate
    Dim oChildren ''ChildMembers
    Dim fset ''FieldSet
    
    Dim sWhere As String
    Dim sTemp As String
    Dim sSQL As String
    Dim sDelim As String
    Dim aStates As Variant
    
    Dim i As Integer
    
    Dim rs As DAO.Recordset
    
    
    sDelim = """"
    aStates = Array("Cleared", "Checked")  ''Possible states
    
    Set oPTable = Forms(0).PivotTable.ActiveView
    
    sWhere = vbNullString
    
    For Each fset In oPTable.FieldSets
    
        sTemp = vbNullString
    
        Set oChildren = oPTable.FieldSets(fset).Member.ChildMembers
    
        For i = 0 To oChildren.Count - 1
            Set oPM = oChildren(i)
            Set oFUpd = oPM.Field.FieldSet.CreateFilterUpdate
    
            If aStates(oFUpd.StateOf(oPM) - 1) = "Checked" Then
                Select Case fset.BoundField.DataType
                    Case adChar, adLongVarWChar
                        sTemp = sTemp & "," & sDelim & oPM.Caption & sDelim
                    Case adInteger
                        sTemp = sTemp & "," & oPM.Caption
                    Case adDate
                        sTemp = sTemp & ",#" & oPM.Caption & "#"
                    Case Else
                       '' The above is a very short list.
                       '' Stop
    
                End Select
    
            End If
        Next
    
        If sTemp > vbNullString Then
            sWhere = sWhere _
                   & " AND [" & fset.Name & "] IN ( " & Mid(sTemp, 2) & ")"
        End If
    Next
    
    sSQL = "SELECT DISTINCT ID FROM [" & oPTable.Control.DataMemberCaption & "] "
    sSQL = sSQL & "WHERE 1=1" & sWhere
    Set rs = CurrentDb.OpenRecordset(sSQL)
    MsgBox "Unique: " & rs.RecordCount
    

    【讨论】:

      【解决方案2】:

      如果有帮助: http://lazyvba.blogspot.com/2010/11/improve-your-pivot-table-to-count.html

      它会通过你想要的数字为你提供唯一的 ID 号码,你仍然可以操纵枢轴

      【讨论】:

      • Access 数据透视表与 Excel 数据透视表不太一样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 2018-09-07
      • 1970-01-01
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      相关资源
      最近更新 更多