首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vba更新枢轴项

vba更新枢轴项
EN

Stack Overflow用户
提问于 2016-02-01 21:53:06
回答 1查看 2.7K关注 0票数 0

我有一个报告,通过和改变各种枢轴字段,并将一些数据复制到另一个工作表。我为它做了一个宏,但是它实际上只是记录了我的点击的结果。我想写一个子,我可以传递一个枢轴表,枢轴字段和一个枢轴项目的名称,并让它更新字段的方式,而不是复制和粘贴的行动一遍又一遍。这是其中的一个部分,它在枢轴表中设置了三个过滤器。

代码语言:javascript
复制
`Worksheets("Closed Pivot").Activate
With ActiveSheet.PivotTables("PivotTable5").PivotFields("Business")
        .PivotItems("NEW").Visible = True
        .PivotItems("Pre-Paid Maint").Visible = False
        .PivotItems("Renewal").Visible = False
        .PivotItems("Training / Pro Svc").Visible = False
        .PivotItems("Upsell/Cross-sell").Visible = False
        .PivotItems("(blank)").Visible = False
        .PivotItems("#N/A").Visible = False
    End With
            ActiveSheet.PivotTables("PivotTable5").PivotFields("Stage"). _
        EnableMultiplePageItems = True
    With ActiveSheet.PivotTables("PivotTable5").PivotFields("Revenue Channel")
        .PivotItems("2-Tier Distributor").Visible = True
        .PivotItems("Direct Sales").Visible = True
        .PivotItems("Direct VAR").Visible = True
        .PivotItems("Ecommerce").Visible = True
        .PivotItems("Maintenance Renewal").Visible = True
        .PivotItems("(blank)").Visible = True
    End With

    With ActiveSheet.PivotTables("PivotTable5").PivotFields("Stage")
        .PivotItems("Closed Lost").Visible = False
        .PivotItems("Closed Won").Visible = True
        .PivotItems("(blank)").Visible = False
    End With`
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-03 10:34:45

有两个选项:要么将枢轴、字段和项的名称作为字符串传递给子对象,要么传递对象本身。将名称作为字符串传递时:

代码语言:javascript
复制
Sub FilterPivotByNames(wsStr as string, ptStr as string, pfStr as string, piStr as string)
Dim ws as Worksheet 
Dim pt as PivotTable
Dim pf as PivotField
Dim pi as PivotItem

Set ws = Worksheets(wsStr)
Set pt = ws.PivotTables(ptStr)
Set pf = pt.PivotFields(pfStr)

With pf
    For each pi in pf.PivotItems
        If pi.name = piStr Then
             pi.Visible = True
        Else
             pi.Visible = False
        End If
    Next pi
End With

End Sub

用法:

代码语言:javascript
复制
Sub test()
FilterPivotByNames "Sheet1", "PivotTable5", "Stage", "Closed Won" 'Just send the names as parameters; the FilterPivotByNames routine knows how to find the appropriate object.
End Sub

当传递对象本身时:

代码语言:javascript
复制
Sub FilterPivotByObject(pt as PivotTable, pf as PivotField, pi as PivotItem)
Dim pItem as PivotItem
For each pItem in pt.pf.PivotItems
    If pItem = pi then 
        pItem.visible = True
    Else
        pItem.visible = False
    End If
End Sub

用法:

代码语言:javascript
复制
Sub test2()
Dim pt as PivotTable
Dim pf as PivotField
Dim pi as PivotItem
Set pt = Worksheets("Sheet1").PivotTables("PivotTable5")
Set pf = pt.PivotFields("Stage")
Set pi = pf.PivotItem("Closed Won")
FilterPivotByObject(pt, pf, pi) 'In this scenario we first make sure we have the pivottables in variables and use those as the parameters, instead of just the names.
End Sub

您可能希望对多值筛选器等进行扩展。此外,根据谁将使用subs,也可能需要进行一些错误处理。意外值将导致错误(例如,当PivotTable5 on Worksheet1不存在时)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35141088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档