繁体   English   中英

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

[英]VBA Change Pivot Table Field: Error 1004

该项目

我有一个工作簿,其中包含每周的工时信息。 一切都可以通过Userform查看和修改。 在用户Userform我有一个ListBox1来显示相关周的PivotTableX表,以便我可以轻松地看到一周的每日和总加班时间。 在我的用户Userform我有两个单选按钮,它们将交替显示PivotTableX以显示“ 总小时数”或“ 加班时间”

在此处输入图片说明

问题

单击单选按钮以更改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 (“周”旁边的组合框)中的选择返回工作表的名称。 我将在最后添加代码段(它起作用了,这不是问题。)

我已验证选择了正确的工作表,并且通过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结果 在此处输入图片说明

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

使用数据透视表,如果您尝试.AddXxxxField该位置的那个数据透视表上已经存在一个字段,则会收到错误1004。

另外,如果您尝试将字段的方向设置为它已经具有的方向,则会收到错误1004。

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

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

谢谢您对sktneer的帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM