0

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

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”分配给具有日期输入的两个单元格,并为宏分配了一个按钮。数据透视表名为“数据透视表”,应过滤的相应字段名为“周”。但是当我按下按钮时,什么也没有发生......有人在代码中看到错误还是我应该以不同的方式实现它?

预先感谢!

4

2 回答 2

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

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

于 2012-08-16T20:19:34.343 回答
0

我的猜测是您的问题出在您的 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 放在您创建的两个变量上

于 2012-08-16T20:42:58.430 回答