按单元格输入更新数据透视表筛选器

时间:2012-08-16 19:58:08

标签: excel excel-vba excel-2007 vba

我正在尝试从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”分配给具有日期输入的两个单元格,并为宏指定了一个按钮。数据透视表被命名为“数据透视表”,应该过滤的相应字段被命名为“周”。但当我按下按钮时没有任何反应......有人看到代码中的错误或我应该以不同的方式实现它吗?

先谢谢!

2 个答案:

答案 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放在两个创建的变量上