Как вы уже узнали, 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), попробуйте разделить это умножение на дополнительный столбец.