我有一个工作簿,每周提供一次工时信息。通过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
(“Week”旁边的组合框)中的选择返回工作表的名称。我会在最后添加片段(它有效,但不是问题。)
我已经确认正在选择正确的工作表,并且表格和数据透视表的名称也通过Debug.Print
也是正确的。
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
答案 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
!