2015-07-17 3 views
1

У меня есть значение для RowField.Name и значение для PivotItem.Name в RowFields, я хочу выделить конкретную ячейку. Но я не могу найти способ, который позволяет мне перебирать все видимые RowField.Найти адрес конкретного PivotItem

В идеале я хочу что-то вроде этого:

Sub LoopThroughPivotAndFindValue() 
dim pt as PivotTable, pi as PivotItem, pf as PivotField 

Set pt = wb.PivotTables("PivotTableNo1") 

For each pf in pt.PivotFields 
    For each pi in pf.PivotItems 
    If pf.Name = "Test" And pi.Name = "Value" Then 
     'Ideally here would be the output of the address within the sheet 
    End If 
    Next pi 
next pf 
End Sub 

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

У кого-нибудь есть идея?

+0

Если я правильно понимаю, что вам нужно, вы можете проверить видимые PivotItems, оценив свойство '.Visible'. Пример: 'If pi.Visible = True Then' –

ответ

2

Не зная точно, как выглядит сводная таблица, я точно не могу ответить, но могу вам сказать, что то, что вы собираетесь использовать, - это метод GetPivotData, где вы можете назвать поле и элемент, который вы ищете get и он вернет диапазон.

Надеюсь, что это трюк!

+0

Работает ли он с VBA? – Spurious

+1

@Spurious: просто нажмите на ссылку, и у вас будет свой ответ, что она работает в VBA! ;) – R3uK

+0

Извините, что ответили только сейчас, но он не работает для того, что я ищу. Я хочу получить адрес элемента Row, я, похоже, не могу получить его с помощью метода GetPivotData. – Spurious

1

UDF может быть полезно также, это может быть хорошим началом для вас:

Sub test_Spurious() 
    MsgBox LoopThroughPivotAndFindValue("Test", "Value") 
End Sub 

А вот функция:

Function LoopThroughPivotAndFindValue(ByVal PivotFieldName As String, ByVal PivotItemName As String) As String 
Dim pT As PivotTable, _ 
    pI As PivotItem, _ 
    pF As PivotField, _ 
    FoundIt As Boolean 

FoundIt = False 
Set pT = ActiveSheet.PivotTables(1) 

For Each pF In pT.PivotFields 
    For Each pI In pF.PivotItems 
     If pF.Name = PivotFieldName And pI.Name = PivotItemName Then 
      'Ideally here would be the output of the address within the sheet 
      On Error GoTo ErrHandler 
      FoundIt = True 
      LoopThroughPivotAndFindValue = pI.LabelRange.Address 
      Exit For 
      On Error GoTo 0 
     End If 
    Next pI 
Next pF 

If FoundIt Then GoTo FreeObjects 
ErrHandler: 
    LoopThroughPivotAndFindValue = "Nothing" 

FreeObjects: 
    Set pT = Nothing 
End Function 

Так что, я бы сказал, что лучший способ чтобы сохранить результат в переменной temp и проверить, является ли оно Nothing (в обычном тексте, а не в параллельном объекте), а затем используйте адрес, чтобы его покрасить!

+0

Попробуй свое решение. – Spurious

+0

Я пробовал ваше решение, я также расширил его для своих целей и немного изменил его, опубликую свое решение в качестве ответа. – Spurious

+0

@Spurious: Можете ли вы принять ответ, чтобы подтвердить свой вопрос, как решены plz? – R3uK

Смежные вопросы