【问题标题】:Update PivotTable Filter by Cell Input按单元格输入更新数据透视表筛选器
【发布时间】:2012-08-16 19:58:07
【问题描述】:

我正在尝试从 2 个单元格输入(开始日期、结束日期)更新我的数据透视表(日期)中的过滤器,以便设置开始日期(例如 01/01/12)和结束日期(28/03/12 ) 数据透视表将自动应用过滤器,仅显示范围内的日期。 为此,我在网上找到了一些VBA代码sn-ps:

Option Explicit

Sub FilterPivotDates()
'
Dim dStart As Date
Dim dEnd As Date
Dim pt As PivotTable
Dim pf As PivotField
Dim pi As PivotItem

Application.ScreenUpdating = False
On Error Resume Next

dStart = Sheets("Pivot").Range("StartDate").Value
dEnd = Sheets("Pivot").Range("EndDate").Value

Set pt = ActiveSheet.PivotTable2
Set pf = pt.PivotFields("Week")

pt.ManualUpdate = True

pf.EnableMultiplePageItems = True

For Each pi In pf.PivotItems
  pi.Visible = True
Next pi

For Each pi In pf.PivotItems
  If pi.Value < dStart Or pi.Value > dEnd Then
    pi.Visible = False
  End If
Next pi

Application.ScreenUpdating = False
pt.ManualUpdate = False

Set pf = Nothing
Set pt = Nothing

End Sub

我在工作表的 Modules 文件夹和工作表“Pivot”中放置了“Option Explicit”。 我将范围名称“StartDate”和“EndDate”分配给具有日期输入的两个单元格,并为宏分配了一个按钮。数据透视表名为“数据透视表”,应过滤的相应字段名为“周”。但是当我点击按钮时,什么也没有发生……有人看到代码中的错误还是我应该以不同的方式实现它?

先谢谢了!

【问题讨论】:

    标签: excel excel-2007 vba


    【解决方案1】:

    尝试更改结尾

    Application.ScreenUpdating = False
    

    Application.ScreenUpdating = True
    

    可能是您正确地完成了所有操作,但只是看不到它 :) 如果不是这种情况(听起来好像不是),可能是您没有比较相似的类型。这不是一个答案,但它可能有助于找出问题所在:尝试为循环放置一些调试语句以确定输入单元格中的值/类型:

    Debug.Print "dStart Value: " & dStart.Value
    Debug.Print "dEnd Value: " & dEnd.Value
    Debug.Print "dStart Type: " & VarType(dStart)
    Debug.Print "dEnd Type: " & VarType(dEnd)
    

    然后在循环中添加另一个检查:

    For Each Pi In pf.PivotItems
      Debug.Print "Pi Value: " & Pi.Value
      Debug.Print "Pi Type: " & VarType(Pi.Value)
      If Pi.Value < dStart Or Pi.Value > dEnd Then
        Pi.Visible = False
      End If
    Next Pi
    

    同样,不确定这是否会揭示任何内容,但可能是代码正在运行,但没有进行任何比较。关于这一点,您是否尝试过修改循环以通过硬编码要选择的值来验证它是否正在工作?如果可行,我们可以进一步缩小范围。

    【讨论】:

    • 哈,我想这不会那么容易。我现在唯一的另一个想法是,也许您正在比较不同类型(或相同格式)的值?我会在我的(不正确的)答案中添加一些您可以尝试的其他内容。
    • 好的,感谢您的详细解答!我必须承认我更像是一个 VBA 新手,但我试图按照您所说的进行操作:) 插入调试标记后,您发送的消息在执行时出错,提示“dStart.Value”和 Sub FilterPivotDates 存在无效限定符() 标记为黄色
    • 哈,一切都开始了——这很好。基本思想(看起来@scott 也在想同样的事情)是您的代码可能工作得很好,但它试图比较与您期望的值不同的值。要使用debug 的东西,请打开编辑器(您粘贴代码的位置),单击查看并选择即时窗口。您应该会看到那里打印出一堆变量名称/值 - 如果您看到的内容与您预期的不同,那可能就是问题所在。
    • 谢谢! ..hm那里没有印刷任何东西。这很奇怪
    • 好吧,这缩小了一点——听起来它根本没有运行。如果您愿意,很高兴进入聊天室,但以防万一 - 您是否验证了宏已启用?有时您的工作簿可能会在没有通知的情况下关闭宏,这意味着它根本无法运行。
    【解决方案2】:

    我的猜测是您的问题出在您的 dstart 和 dend 中。通过获取该值,我相信它会将日期更改为 excel 数值。

    尝试更改此行:

        If pi.Value < dStart Or pi.Value > dEnd Then
    

    类似于:

        If cdate(pi.value)< cdate(dStart) Or cdate(pi.value) > cdate(dend) then
    

    如果这不起作用,请尝试仅将 cdate 放在您创建的两个变量上

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 2019-02-02
      • 2013-10-02
      • 1970-01-01
      • 2016-01-07
      相关资源
      最近更新 更多