【问题标题】:Get value of pivotfields for a particular cell获取特定单元格的数据透视字段的值
【发布时间】:2014-02-01 08:29:45
【问题描述】:

我有一个来自 ssas 连接的数据透视表。表中使用了几个数据透视字段。对于此示例,假设它们是大小、颜色和位置。我的目标是编写一些 vba,在其中传递单元格范围并获取相应枢轴字段的值。

例如,如果我传递B6 的单元格范围,我想知道该单元格来自位置2,颜色2 为size1。如果我通过B8 范围,我会得到 location1、Color3、Size1 等。

到目前为止,这是我能做的。我可以获得该单元格的公式值。这是 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

我还可以遍历数据透视字段并获取它们的名称,(但我不知道如何获取它们的值)[Measures].[myValues]、[d size].[size] 等...使用此代码:

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

我现在的问题是,如何获取特定单元格的这些数据透视字段的值。我希望能够发送B6 并返回,或者可以访问:location2、Color2、Size1

编辑:

越来越近...我现在可以遍历每个字段并获取它们的名称和值,例如 [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

【问题讨论】:

    标签: vba excel pivot-table


    【解决方案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
    

    【讨论】:

    • 代码中的一个错误。第一个if 应该有strOut = "Not a pivot cell"。这个函数会返回[d size].[size]:[d size].[size]&[Size1] 等等。所以和我的一些尝试类似。它确实内置了非常好的所有错误处理,但我想更进一步,只获取Size1 或[Size1] 等的值。
    • 我只发布了这个答案(这是 RoryA 帖子的直接副本),作为一个指针,指向如何遍历与特定“值”单元格。如果您想要的是通用方法,那么您可以传入一个字段名称,并在找到具有您要查找的名称的字段后立即从代码中返回一个值。
    • 嘿,这是一个很棒的功能 +1。现在最困难的部分是我原来的问题。从您的更新中,我仍然得到[d size].[size]&[Size1] 是否让我在& 之后得到结束而无需解析字符串?这才是我真正想要找回的价值。
    • 我想我没有遵循你真正想做的事情。您可以使用我发布的代码来获取与特定值单元格关联的特定字段的值。我没有按照你所说的“解析”字符串的意思,或者你从哪里得到[d size].[size]&[Size1]。
    • 您发布的代码返回[d size].[size]&[Size1],我想让它返回Size1。我已经知道Size1 来自d size 维度。你知道 vba 是否可以在 & 之后给我这个值吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2016-09-25
    • 1970-01-01
    • 2018-03-30
    • 2014-08-29
    • 2013-11-11
    相关资源
    最近更新 更多