运行时错误1004:无法获取工作表类的透视表属性。

4

我录制了这个宏来更新16个图表的日期范围。但是,正如您所看到的,我遇到了运行时错误。

我查看了stackoverflow上与此相关的其他线程,但没有一个接近。Excel上可恶的帮助按钮也没有帮助。请问您能给出建议吗?以下是代码:

ActiveSheet.ChartObjects("Chart 18").Activate
ActiveChart.Axes(xlCategory).Select
ActiveSheet.ChartObjects("Chart 18").Activate
With ActiveSheet.PivotTables("PivotTable2").PivotFields("Date")
    .PivotItems("Sep-15").Visible = False
    .PivotItems("Aug-14").Visible = True
End With
3个回答

2

以下是一些简单的代码,可以帮助你接近目标。你需要将代码中的"MySheet"改为包含数据透视表的工作簿中的工作表名称,同时保证你的日期字段确实按照"Mmm-YY"格式进行文本格式化。

Sub ShowThirteenDatesStartingLastMonth()
    Sheets("MySheet").PivotTables("PivotTable2").PivotCache.Refresh

    Dim Dt As String

    With Sheets("MySheet").PivotTables("PivotTable2").PivotFields("Date")        
    For h = 1 To .PivotItems.Count - 1
        On Error Resume Next
        .PivotItems(h).Visible = False
    Next h

    For i = 1 To 13
        On Error Resume Next
        Dt = Format(DateSerial(Year(Date), Month(Date) - i, 1), "Mmm-YY")
        .PivotItems(Dt).Visible = True
    Next i
    End With
End Sub

ayyzad,我非常想知道这个解决方案是否适用于您。根据我所了解到的有限信息,我认为它会起作用。我假设您拥有一个基本的数据透视表,左侧是某种列表,而这些日期则横跨在顶部,这些日期实际上代表列表中每个项目的每月年度数据的文本字段。我按照自己的方式设置了数据透视表并进行了测试,效果非常好。(实际上我在这个过程中学到了一些东西!) - Josh Fierro
此外,如果您的数据是使用文本日期字段进行设置的话,我想建议一种潜在的更改方式。根据您希望如何对枢轴输出中的日期进行排序(无论您是否希望这种情况下重复的两个月份(在本例中为Sep-14和Sep-15)并排出现,还是希望它们按照实际日期进行排序),使用每个月1日设置的实际日期格式或以年份而不是月份为开头的全数字文本格式会更有意义。当然,这将需要对代码进行更改,但我很乐意提供帮助。 - Josh Fierro
哇,这个完美地运行了。谢谢你。当我运行它时,所有的信息都更新了,图表也是如此。第一次运行它时,它从aug-14 aug-15变成了sept 14-sept-15。正是我们想要的!但是当我再次运行它时,数据发生了变化,但是日期仍然停留在sept 14-sept-15。你也遇到了这个问题吗? - ayyzad
由于我没有你的工作簿,所以我不能确定到底发生了什么,但我的测试是在一个非常简单的数据集上进行的,对我来说完美地运行了。你所说的“数据变化”是什么意思?数据的位置是否改变(在数据透视表中很常见),还是实际值发生了变化?如果数据透视表中的值正在改变,那么它们必须在源数据中发生变化。在我能够真正洞察这个问题之前,我需要看到你的工作簿。无论如何,如果我的回答对你有帮助,请将其标记为答案,并在可能的情况下投票支持它。 - Josh Fierro
如果我需要它显示本月为Aug-'14 - Aug-'15,那么需要调整什么? - ayyzad
显示剩余4条评论

0

没有你的工作簿示例很难确定,但我建议尝试给工作表命名而不是使用“activesheet”。此外,激活或选择任何内容通常都不是一个好主意,相反,你应该允许代码在不选择任何内容的情况下尽可能地完成工作。类似这样的代码可能会更好:

With Sheets("MySheet").PivotTables("PivotTable2").PivotFields("Date")
.PivotItems("Sep-15").Visible = False
.PivotItems("Aug-14").Visible = True
End With

非常感谢你,乔希。你能否再回答一个跟进问题呢? - ayyzad
有没有一种方法,也许使用IF语句,可以使这些日期自动更改?每次运行此代码时,我希望代码将日期向前移动一个月。所以,现在它从8月14日到8月15日。我想让它从9月14日到9月15日...这可能吗?如果可以,请指教一下? - ayyzad
我们需要处理多少数据?如果不超过30,000行,您可以使用一系列匹配和间接公式来编译与数据透视表相同的数据和布局,但具有您可能正在寻找的动态灵活性,从而摆脱一些数据透视表的限制。 - Josh Fierro
现在是M yy。我试图将时间从2014年8月至2015年8月更改为2014年9月至2015年9月。因此,每次运行时,我需要移动到下一个月,即Sep 2014-Sep 2015,然后Oct 2014-Oct 2015,然后Nov 2014-Nov 2015,以此类推。 - ayyzad
你用什么标准来确定每次想要查看哪个日期范围?无论是什么标准,它都可以编码到你的宏中。例如,如果是当前月份的前一个月,则可以使用一些日期函数来组合表示这些日期的文本字符串,假设它们是文本字符串而不是实际格式化的日期。如果它们是实际格式化的日期,那就更容易了。 - Josh Fierro
显示剩余5条评论

0
正如Josh所说,您应该引用确切的工作表名称,甚至可能是确切的数据透视表名称。
此外,您应该避免使用.Select,而是为每个数据透视图声明一个变量,例如。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接