VBA更改数据透视表字段:错误1004

时间:2017-04-15 18:30:14

标签: excel vba pivot-table

项目

我有一个工作簿,每周提供一次工时信息。通过Userform查看和修改所有内容。在Userform我有ListBox1来显示相关周的PivotTableX,以便我可以轻松查看本周的每日和总加班时间。在我的Userform我有两个单选按钮,将PivotTableX交替显示总小时数加班时间

enter image description here

问题

当我点击单选按钮时,要更改PivotField,我会收到Error 1004。我已经做了相当多的搜索,但我找不到有效的解决方案。我可能不太了解数据透视表背后的代码,足以知道解决方案何时在我面前。

守则

以下是引发错误的代码:

Private Sub OptionButton1_Change()
    Dim ws As Worksheet
    Dim wsName As String
    Dim pvtTable As PivotTable

    Set ws = ThisWorkbook.Sheets(SelSheet())
    ws.Select
    Set pvtTable = ws.PivotTables("PivotTable" & ws.Index)

    With pvtTable
        If OptionButton1.Value = True Then 'Total Time
            .AddDataField .PivotFields("TOTAL (W/O LUNCH)"), "Sum of TOTAL (W/O LUNCH)", xlSum
            .PivotFields("Sum of PREMIUM TIME").Orientation = xlHidden
        Else
            .AddDataField .PivotFields("PREMIUM TIME"), "Sum of PREMIUM TIME", xlSum
            .PivotFields("Sum of TOTAL (W/O LUNCH)").Orientation = xlHidden
        End If
    End With
End Sub

.AddDataField行抛出错误。这让我觉得我的代码没有找到工作表上的数据透视表。为了解决这个问题,我没有使用PivotTables()索引号,而是专门用名称来呼唤它。创建新工作表时,将根据工作表索引创建表和数据透视表并对其进行编号。我的工作表永远不会改变它们的索引位置,因为它们是按照从最旧到最新的顺序创建的。

我也认为这个问题可能来自未被选中的工作表,因为我在过去遇到了与1004类似的问题,因此我选择了工作表但没有做任何事情。

在您提问之前,SelSheet()是一个简单的函数,可根据ComboBox4(“Week”旁边的组合框)中的选择返回工作表的名称。我会在最后添加片段(它有效,但不是问题。)

我已经确认正在选择正确的工作表,并且表格和数据透视表的名称也通过Debug.Print也是正确的。

SelSheet()函数

Function SelSheet() As String
    Dim ws As Worksheet
    Dim wsName As String
    wsName = ComboBox4.Value
    Set ws = ThisWorkbook.Sheets(Replace(wsName, "/", ""))
    SelSheet = ws.Name
End Function

评论部分

请求中包含的信息

Debug.Print结果 enter image description here

1 个答案:

答案 0 :(得分:0)

解决方案

questionnaire讨论后,我发现了问题所在:

使用数据透视表,如果您尝试sktneer该位置中该数据透视表上已存在的字段,您将收到错误1004。

此外,如果您尝试将字段的方向设置为已有的方向,则会收到错误1004.

以下是我对代码所做的更改,清除了我遇到的所有问题:

.AddXxxxField

感谢您的帮助With pvtTable For Each pfData In .DataFields pfData.Orientation = xlHidden Next pfData If OptionButton1.Value = True Then 'Total Time .AddDataField .PivotFields("TOTAL (W/O LUNCH)"), "Sum of TOTAL (W/O LUNCH)", xlSum Else .AddDataField .PivotFields("PREMIUM TIME"), "Sum of PREMIUM TIME", xlSum End If End With