«Счет», основанный на фильтрах, установленных в сводной таблице - PullRequest
0 голосов
/ 05 ноября 2010

Итак, мы импортировали данные, которые мы запросили, а затем создали сводную таблицу из этого запроса.По сути, это список файлов, каждый из которых имеет уникальные идентификационные номера и различные атрибуты (расширение файла, тип документа, хэш и т. Д.).В любом случае эти данные основаны на результатах поиска по ключевым словам из другой программы.Это означает, что для одного и того же уникального идентификатора может быть несколько записей, поскольку имеется несколько обращений.

Сводная таблица позволяет нам иллюстрировать / манипулировать с помощью фильтрации определенных критериев (например, нам не нужны определенные расширения файлов илинам не нужны записи с FIELD X или FIELD Y0. С отчетом все в порядке, но мы хотим создать форму / запрос / отчет / что угодно, что вытянет «счет» (на основе уникального идентификатора), который игнорирует дубликаты. Например,После того, как все фильтры установлены в сводной таблице, на основе фильтров / выходных данных сводной таблицы, мы хотим что-то вроде этого:

.PDF файлов: 200 | всего для поля х | всегополе y | etc

.DOCX файлов: 320 | всего для поля x | всего для поля y | и т.д.

Очевидно, что мы хотим игнорировать дубликаты одного и того же уникального идентификатора вcount.

Каков наилучший способ сделать это, учитывая, что мы будем динамически и часто манипулировать сводной таблицей? Идеальный вариант - иметь сводную таблицу и другоеЭто значит, что объект (форма / отчет / и т. д.) открыт, и поскольку сводная таблица манипулирует, все, что отображается, также меняет счет.

Ответы [ 2 ]

0 голосов
/ 18 ноября 2010

, если это поможет: http://lazyvba.blogspot.com/2010/11/improve-your-pivot-table-to-count.html

он даст вам уникальное количество идентификационных номеров по нужным вам номерам, и вы все равно сможете манипулировать осью

0 голосов
/ 18 ноября 2010

Вот несколько очень грубых заметок.Они только минимально протестированы, и использование 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
...