【问题标题】:VBA select pivot table by ActivecellActivecell的VBA选择数据透视表
【发布时间】:2018-09-27 07:50:55
【问题描述】:

在我的 Excel 工作表中,每个月都会从另一个文件中复制数据透视表,因此每次将新的数据透视表复制到我的工作表时,名称都会更改。我想使用宏来设置数据透视表过滤器,但不知道如何在不知道名称的情况下引用该表。我使用下面的代码,它有时可以工作,但有时会出错。你能看看我的代码是否有任何错误吗?或者如果我的情况有其他解决方案?

另一个问题是,我的代码在两个工作表中调整了两个数据透视表,但是,代码有时(大部分时间)最终只在一张工作表上工作。有人知道原因吗?

Sub getdeb()
Dim irfile As String
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim ws3 As Worksheet
Dim ws4 As Worksheet

With Application.FileDialog(msoFileDialogFilePicker)
    .AllowMultiSelect = False
    .Title = "Please select a file"
    .ButtonName = "Select"
    .InitialFileName = "C:\"
    If .Show = -1 Then
        irfile = .SelectedItems(1)

        Set wbtarget = ThisWorkbook
        Set wbsource = Workbooks.Open(irfile)

        Set ws1 = wbsource.Sheets("NN Re inzake ART Non-Life")

        Set ws2 = wbsource.Sheets("NN Re inzake ART Life")

        ws2.Cells.Copy Destination:=wbtarget.Sheets("Life").Range("A1")

        ws1.Cells.Copy Destination:=wbtarget.Sheets("NonLife").Range("A1")

        wbsource.Close

        Else
            MsgBox "No file was selected"

    End If
End With

With ThisWorkbook

Set ws3 = Sheets("Life")
Set ws4 = Sheets("NonLife")
ws3.Cells.Clear
ws4.Cells.Clear

End With

With ws3

    With ActiveCell.PivotTable.PivotFields("GAUDI rubriek")
    .PivotItems("A_INT_RENTS_ACCR    ").Visible = False
    .PivotItems("A_OTH_ACCR_ASSETS   ").Visible = False
    .PivotItems("L_COST_PAYABLE      ").Visible = False
    .PivotItems("L_CRED_DIR          ").Visible = False
    .PivotItems("L_CRED_OTH_3P       ").Visible = False
    .PivotItems("L_CRED_OTH_IC       ").Visible = False
    .PivotItems("L_CRED_REINS_IC     ").Visible = False
    .PivotItems("L_DEF_TAX_LIAB      ").Visible = False
    .PivotItems("L_INCOME_TAX        ").Visible = False
    .PivotItems("L_INT_RENTS_ACCR    ").Visible = False
    .PivotItems("L_OTH_PROV          ").Visible = False
    .PivotItems("A_TAX_REC           ").Visible = False
    .PivotItems("L_CRED_REINS_3P     ").Visible = False
    End With

    With ActiveCell.PivotTable.PivotFields("Issuer")
    .ClearAllFilters
    .EnableMultiplePageItems = True
    .PivotItems(" ").Visible = False
    End With

    .Range("N9") = "GRID Mapping DvS"
    .Range("O9") = "GRID Name Mapping DvS"
    .Range("P9") = "Country Mapping DvS"
    .Range("Q9") = "Instrument ID DvS added"
    .Range("R9") = "Country Mapping DvS2"
    .Range("R9") = "Thomson-Reuters id"
    .Range("Q10") = "=$B10&"" ""&$A10"
    .Range("N10:R100").FillDown

End With

With ws4

    With ActiveCell.PivotTable.PivotFields("GAUDI rubriek")
    .PivotItems("A_INT_RENTS_ACCR    ").Visible = False
    .PivotItems("A_OTH_ACCR_ASSETS   ").Visible = False
    .PivotItems("L_COST_PAYABLE      ").Visible = False
    .PivotItems("L_CRED_DIR          ").Visible = False
    .PivotItems("L_CRED_OTH_3P       ").Visible = False
    .PivotItems("L_CRED_OTH_IC       ").Visible = False
    .PivotItems("L_CRED_REINS_IC     ").Visible = False
    .PivotItems("L_DEF_TAX_LIAB      ").Visible = False
    .PivotItems("L_INCOME_TAX        ").Visible = False
    .PivotItems("L_INT_RENTS_ACCR    ").Visible = False
    .PivotItems("L_OTH_PROV          ").Visible = False
    .PivotItems("A_TAX_REC           ").Visible = False
    .PivotItems("L_CRED_REINS_3P     ").Visible = False
    End With

    With ActiveCell.PivotTable.PivotFields("Issuer")
    .ClearAllFilters
    .EnableMultiplePageItems = True
    .PivotItems(" ").Visible = False
    End With

    .Range("N9") = "GRID Mapping DvS"
    .Range("O9") = "GRID Name Mapping DvS"
    .Range("P9") = "Country Mapping DvS"
    .Range("Q9") = "Instrument ID DvS added"
    .Range("R9") = "Country Mapping DvS2"
    .Range("R9") = "Thomson-Reuters id"
    .Range("N10:R500").FillDown
    .Calculate

End With
End Sub

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    为了引用数据透视表和数据透视字段,它应该存在。这部分代码删除了ws3上的所有数据透视表,因此无法进一步引用:

    ws3.Cells.Clear
    With ws3
        With ActiveCell.PivotTable.PivotFields("GAUDI rubriek")
    

    尝试将您的代码修改为:

    With ws3.Range(ActiveCell.Address).PivotTable.PivotFields("GAUDI rubriek")
    

    ws3ws4 无处不在。因此,您将在相关工作表上引用相关的ActiveCell 地址。

    【讨论】:

    • 对不起,我没有展示完整的代码,否则太长了。实际上,这两个工作表都分配给了我的一个工作表。我会把我的完整代码放进去。
    • 请看我更新的代码。它仍然不是完整的代码。但我将 ws3 和 ws4 设置为我的工作表之一
    • @Gong - 写一个minimal reproducible example 可能看起来微不足道,但这确实是一个最佳实践。我已经更新了答案。
    • 我使用了您的代码,它显示相同的消息:运行时错误“1004”:无法获取 Range 类的数据透视表属性
    • 代码会停在这一行:With ws3.Range(ActiveCell.Address).PivotTable.PivotFields("GAUDI rubriek")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    相关资源
    最近更新 更多