Как проверить, используются ли данные из сводной таблицы в формуле GETPIVOTDATA - PullRequest
1 голос
/ 01 мая 2019

Я использую данные из сводной таблицы в формулах.В сводной таблице много данных, и мне нужно проверить, какие данные уже используются в формулах.

Я уже использовал этот фрагмент кода, чтобы отметить использованные сводные данные, но он не работает дляGETPIVOTDATA формулы:

Cells(24, "g").Precedents.Interior.ColorIndex = 5

enter image description here

1 Ответ

1 голос
/ 06 мая 2019

Как вы уже узнали, Range.Precedents ячейки с формулой GETPIVOTDATA, к сожалению, указывает только на первую ячейку сводной таблицы.Поэтому вы не можете использовать прецеденты для идентификации уже указанной ячейки сводной таблицы.

Мой код выполняет следующие действия:

  • сборка формулы = GETPIVOTDATA () строка для ячейки данных каждой сводной таблицы
  • собирает эти возможные формулы в массив
  • сравнивает каждую используемую формулу, например, в пределахдиапазон G1: G500, с этим массивом
  • , если формула найдена, соответствующая сводная ячейка помечается желтым
    Private Sub EveryPossibleGETPIVOTDATAformula()
        Dim pt As PivotTable
        Dim pi As PivotItem
        Dim pc As PivotCell
        Dim c As Range
        Dim i As Long, j As Long
        Dim PossibleFormulas() As String

        Set pt = ActiveSheet.PivotTables(1)

        ReDim PossibleFormulas( _
            1 To _
            pt.PivotRowAxis.PivotLines.Count * _
            pt.PivotColumnAxis.PivotLines.Count)

        i = 1
        For Each c In pt.DataBodyRange.Cells
            Set pc = c.PivotCell
            PossibleFormulas(i) = _
                "=GETPIVOTDATA(""" & _
                pc.DataField.SourceName & """," & _
                pt.TableRange1.Cells(1).Address
            For Each pi In pc.RowItems
                PossibleFormulas(i) = PossibleFormulas(i) & _
                    ",""" & pi.Parent.Name & _
                    """,""" & pi.Value & """"
            Next pi
            For Each pi In pc.ColumnItems
                PossibleFormulas(i) = PossibleFormulas(i) & _
                    ",""" & pi.Parent.Name & _
                    """,""" & pi.Value & """"
            Next pi
            PossibleFormulas(i) = PossibleFormulas(i) & ")"
            i = i + 1
        Next c


        Dim myPosition As Variant
        For Each c In ActiveSheet.Range("G1:G500") ' adapt it
            If c.HasFormula Then
                myPosition = Application.Match(c.Formula, PossibleFormulas(), 0)
                If IsNumeric(myPosition) Then
                    pt.DataBodyRange.Cells(myPosition).Interior.Color = vbYellow
                End If
            End If
        Next c
    End Sub

. Имейте в виду: работает только, если = GETPIVOTDATA (...) является единственной формулой в ваших клетках.Если вам нужны дальнейшие вычисления, например, умножение (вы сделали это с = GETPIVOTDAT (...) * 2), попробуйте разделить это умножение на дополнительный столбец.

...