因此,我们导入了我们查询过的数据,然后根据该查询创建了一个数据透视表。它本质上是一个文件列表,每个文件都有唯一的ID号和各种属性(文件扩展名,文档类型,哈希等)。在任何情况下,此数据都基于来自不同程序的关键字搜索的“点击”。这意味着,由于存在多个匹配,因此可能存在多个相同唯一ID的记录。
数据透视表允许我们通过过滤掉某些标准来说明/操纵(例如我们不想要某些文件扩展名,或者我们不想要具有FIELD X或FIELD Y0的记录。报告很好,但我们想要制作一个表单/查询/报告/任何会拉出“计数”(基于唯一ID)忽略重复的内容。例如,一旦所有过滤器都设置在数据透视表中,基于数据透视表的过滤器/输出,我们想要这样的东西:
.PDF文件:200 |字段x |的总计总场y |等
.DOCX文件:320 |字段x |的总计场y的总和等
显然,我们希望忽略计数中相同唯一ID的重复项。
考虑到我们将动态且经常地操纵数据透视表,最好的方法是什么?理想的情况是将透视表和另一个对象(表单/报表/等)打开,并且随着透视表的操作,显示计数的任何变化也是如此。
答案 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号码,您仍然可以操纵枢轴