2014-01-29 4 views
0

У меня сводная таблица из ssas-соединения. В таблице используются несколько опорных полей. Для этого примера предположим, что это размер, цвет и местоположение. Моя цель - написать некоторую vba, где я передаю диапазон ячеек и получить значение соответствующих pivotfields.Получить значение pivotfields для конкретной ячейки

Например, если я передаю диапазон ячеек для B6, я хочу знать, что эта ячейка находится из location2 в color2 для size1. Если я прохожу диапазон B8 я получаю LOCATION1, color3, Size1 и т.д.

enter image description here

Вот что я могу сделать до сих пор. Я могу получить значение формулы для этой ячейки. Вот результат для B6: GETPIVOTDATA("[Measures].[myValues]",$A$1,"[d size].[size]","[d size].[size].&[Size1]","[d color].[color]","[d color].[color].&[Color2]","[d location].[location]","[d location].[location].&[location2]") с этим кодом:

Function xxx(ByVal xyz As Range) As Variant 
    xxx = xyz.Formula 
End Function 
Sub blah() 
    MsgBox (xxx(ActiveWorkbook.Sheets("Sheet1").Range("D13"))) 
End Sub 

Я также могу перебрать pivotfields и получить их имена, (но я не знаю, как получить их значения) [Measures].[myValues], [d size].[size] и т.д .. . с этим кодом:

With Worksheets("Sheet1").PivotTables(1) 
    For i = 1 To .PivotFields.Count 
     MsgBox .PivotFields(i).Name 
    Next 
End With 

Мой вопрос теперь, как я могу получить значение этих pivotfields для конкретной ячейки. Я хотел бы иметь возможность отправлять B6 и получить обратно, или иметь доступ к: location2, Color2, Size1

Edit:

Получение ближе ... Теперь я могу Переберите каждого поля и получить их имена и значения как этот [d size].[size]&[Size1] и т.д., но сейчас я хочу, чтобы иметь возможность получить только значение Size1 или [Size1]:

Sub Test() 
    Dim iRange As Variant 
    iRange = ActiveCell.Address 
    FieldPicker (iRange) 
End Sub 

Function FieldPicker(targetCell As Variant) As Variant 
    With Range(targetCell).PivotCell 
     For i = 1 To .RowItems.Count 
      MsgBox .RowItems(i).SourceName 
     Next 
    End With 
End Function 

ответ

1

адаптированный от ответа RoryA здесь: http://www.mrexcel.com/forum/excel-questions/332678-pivottable-problem.html

'Given a pivottable value cell and a category name, return the category value 
'Note: you would need morte code to account for a "page" category 
Function PivotCategoryValue(rngInput As Range, fldName As String) As String 

    Dim pc As PivotCell 
    Dim pf As PivotField, pi As PivotItem 
    Dim rv As String 

    On Error Resume Next 
    Set pc = rngInput.PivotCell 
    On Error GoTo err_handle 

    If pc Is Nothing Then 
     rv = "Not a pivot cell" 
    Else 
     Select Case pc.PivotCellType 
     Case xlPivotCellValue 
      If pc.RowItems.Count Then 
       For Each pi In pc.RowItems 
        If pi.Parent.Name = fldName Then 
        rv = pi.Value 
        GoTo done 
        End If 
       Next pi 
      End If 
      If pc.ColumnItems.Count Then 
       For Each pi In pc.ColumnItems 
        If pi.Parent.Name = fldName Then 
        rv = pi.Value 
        GoTo done 
        End If 
       Next pi 
      End If 
     Case Else 
      rv = "Not a pivot data cell" 
     End Select 
    End If 
done: 
    PivotCategoryValue = rv 
Exit Function 

err_handle: 
    PivotCategoryValue = "Unknown error" 
End Function 
+0

Одна ошибка в коде. Первый 'if' должен иметь' strOut = "Не опорную ячейку" '. Эта функция вернет '[d size]. [Size]: [d size]. [Size] & [Size1]' и т. Д. Таким образом, это похоже на некоторые из моих попыток. У него есть вся обработка ошибок, в которой очень хорошо, но я хочу пойти еще дальше и получить только значение 'Size1' или' [Size1] 'и т. Д. –

+0

Я только опубликовал этот ответ (который является прямым копия записи RoryA) в качестве указателя на то, как циклически перебирать различные значения категорий (в 'RowItems' и' ColumnItems'), связанные с определенной ячейкой «значение». Если вы хотите использовать общий подход, вы можете передать имя поля и вернуть значение из кода, как только найдете поле с именем, которое вы ищете. –

+0

Смотрите мой обновленный код. –

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