基于数据透视表中设置的过滤器的“计数”

时间:2010-11-05 15:31:15

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

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

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

  

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

     

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

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

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

2 个答案:

答案 0 :(得分:0)

以下是一些非常粗略的笔记说明。它们只进行了最低限度的测试,并且使用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

答案 1 :(得分:0)

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

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