我正在尝试从2个单元格输入(startdate,enddate)更新数据透视表(日期)中的过滤器,以便设置startdate(例如01/01/12)和enddate(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文件夹中和Sheet“Pivot”中有“Option Explicit”。 我将范围名称“StartDate”和“EndDate”分配给具有日期输入的两个单元格,并为宏指定了一个按钮。数据透视表被命名为“数据透视表”,应该过滤的相应字段被命名为“周”。但当我按下按钮时没有任何反应......有人看到代码中的错误或我应该以不同的方式实现它吗?
先谢谢!
答案 0 :(得分: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
再次,不确定这是否会揭示任何内容,但可能是代码正在运行但不会比较任何内容。在那个问题上,您是否尝试过修改循环以通过对要选择的值进行硬编码来验证它是否正常工作?如果可行,我们可以将其缩小一点。
答案 1 :(得分: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放在两个创建的变量上