【问题标题】:VBA to make range("K1") = a slicer item valueVBA制作范围(“K1”)=切片器项目值
【发布时间】:2016-03-20 04:06:13
【问题描述】:

我有一个搜索框 (K1),它将搜索切片器项目并显示适当的图表,但是,如果用户选择使用切片器来显示特定图表,K1 中的值将与切片器项目不匹配。

它们匹配的唯一时间是用户使用搜索框时。我在单元格 O1 中创建了一个公式,它返回 1(如果它们匹配)或返回 0(如果它们不匹配),然后尝试将 K1 = 设置为项目值(代码的引用部分)的不同变体。

请查看我的仪表板图片链接以供参考。

我对 VBA 非常陌生,因此非常感谢任何 ELI5 答案。

Sub SearchPivots()


Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.Calculation = xlCalculationManual

'Set the Variables to be used
Dim pt As PivotTable
Dim Field As PivotField
Dim NewCat As String

On Error GoTo 28


'Find Pivot Table
Set pt = Worksheets("Overall Pivot").PivotTables("NAMERPM")

Set Field = pt.PivotFields("Filter Field")
NewCat = Worksheets("Resource Dashboard").Range("K1").Value

Application.Calculation = xlCalculationAutomatic

'This updates and refreshes the PIVOT table
With pt
    Field.ClearAllFilters
    Field.CurrentPage = NewCat
    pt.RefreshTable
End With

'With Field
'    If Range("O1").Value = 0 Then
'        Range("K1") = Field.CurrentPage.Value
'    End If
'End With

    Exit Sub
28:
    MsgBox "That project number is not listed.  Please check the project number and try again."

Application.ScreenUpdating = True
Application.DisplayStatusBar = True




End Sub

【问题讨论】:

    标签: vba excel excel-2010 pivot-table slicers


    【解决方案1】:

    Tony,在此链接中,您将找到一个无需 VBA 即可完成此操作的 hack。 http://dailydoseofexcel.com/archives/2014/08/16/sync-pivots-from-dropdown/

    【讨论】:

    【解决方案2】:

    我不确定我是否理解这个问题,切片器如何控制显示哪个图表,但下面的代码将通过可透视的更改事件获取选定的切片器项目(但他们当然可以选择很多)

    Private Sub Worksheet_PivotTableChangeSync(ByVal Target As PivotTable)
    Dim sItem As Excel.SlicerItem
    Dim msg As String
    Dim lastrow As Long
    Dim nextrow As Long
    Dim i As Long
    
        nextrow = 0
        For i = 1 To Target.Slicers.Count
    
            msg = Target.Slicers(i).Name & vbNewLine
    
            For Each sItem In Target.Slicers(i).SlicerCache.VisibleSlicerItems
    
                nextrow = nextrow + 1
                msg = msg & vbTab & sItem.Name & vbNewLine
            Next sItem
    
            MsgBox msg
        Next i
    End Sub
    

    按名称引用特定切片器

    Private Sub Worksheet_PivotTableChangeSync(ByVal Target As PivotTable)
    Dim sItem As Excel.SlicerItem
    Dim nextrow As Long
    Dim i As Long
    Dim msg As String
    
        nextrow = 0
    
        With Target.Slicers("Filter_Field")
    
            msg = .Name & vbNewLine
    
            For Each sItem In .SlicerCache.VisibleSlicerItems
    
                nextrow = nextrow + 1
                msg = msg & vbTab & sItem.Name & vbNewLine
            Next sItem
    
            MsgBox msg
        End With
    End Sub
    

    【讨论】:

    • 嗨,鲍勃 - 感谢您的信息。切片器绑定到与图表的过滤器字段绑定的数据透视表。所以,用户可以在K1中输入一个项目号,然后点击搜索;唯一的问题是,如果他们使用切片器,K1 不会更新切片器项目值,这会使观众感到困惑,因为遗留项目编号仍在显示。那有意义吗?我会试试你的代码,但这会放在工作表上还是模块上?
    • 它将进入具有枢轴托尼的工作表中,因为它是事件代码。如果看起来没问题,您需要删除 MsgBox,然后将单元格 K1 设置为该选定值。
    • 我这样做了,但现在它显示了另一个切片器的名称。如何让它指向有问题的切片器(“Slicer_Filter_Field”)?再次感谢您的帮助。
    • 我的代码会遍历每个附加到枢轴的切片器,如果你只想要一个,你可以指定那个。 Slicer_Filter_Field 是公式名,名字大概就是Filter_Field。您可以用我不知道如何将代码添加到评论中的名称替换索引,因此我已将其添加到我的原始答案中。
    • 托尼,我很难理解遍历切片器项目如何返回切片器名称。你有没有机会把工作簿贴在某个地方让我看?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 2017-09-14
    • 2021-05-30
    相关资源
    最近更新 更多