更新答案:我找到了我的问题的答案。为了方便起见,我将在此处的原始问题下方放置一个简化版本,下面有一个更详细的版本作为接受的答案。
我正在编写一个 VBA 函数来按用户输入的日期范围过滤数据透视表。由于某种原因,它没有返回预期的结果。
被比较的日期采用两种不同的日期格式。用户输入的日期采用 mmmm yyyy 格式(2013 年 10 月)。当将此值拉入宏进行比较时,它会正确转换为 2013 年 10 月 1 日。数据透视表日期采用 mmm yy 格式(10 月 13 日)。当我用代码调用这个日期时,PivotItem.Value
它似乎将日期转换为字符串“10 月 13 日”。
我不太清楚宏在做什么,因为它的行为有些不规律。如果我在 2011 年 10 月到 2013 年 10 月运行它,它会返回每年 1 月到 9 月、2008 年、2009 年、2010 年等的所有月份。如果我在 2013 年 6 月到 2013 年 10 月运行它,它会返回每年 6 月到 9 月. 此外,在每个示例中,宏继续运行超过数据透视表中的最大数据范围并出现错误。当我调试时,宏正在尝试将数据透视表中甚至不存在的日期的可见性设置为“真”(即 2014 年 1 月的 IE,当数据仅通过 2013 年 10 月时)。不知道为什么会这样。
下面是代码。任何见解将不胜感激。
更新:
所以问题肯定是日期格式。如果我将数据透视表中的字段设置更改为日期格式 mm/dd/yyyy (10/1/2013),那么宏将完全按预期工作。这将是一个简单的解决问题的方法,除了该表正在提供用户仪表板中看到的图表,我真的希望采用 mmm yy 格式,因为它看起来更干净。有没有一种简单的方法可以在宏内将格式转换为 mm/dd/yyyy 以进行比较,然后在完成后返回所需的格式?
而且我仍然想了解为什么不同的日期格式会返回如此不同的结果,当被比较的原始数据是相同的,并且两者都被格式化为日期,而不是日期与文本之类的东西时。
Sub filterPivotDate(pt As PivotTable, strtDate As Date, endDate As Date)
Dim pf As PivotField
Dim pi As PivotItem
'Clear current date filter
Set pf = pt.PivotFields("Date")
pf.ClearAllFilters
'Set new date filter
For Each pi In pf.PivotItems
If pi.Value >= strtDate And pi.Value <= endDate Then
pi.Visible = True
Else
pi.Visible = False
End If
Next pi
end sub
回答更新: 我用以下代码行替换了用于设置过滤器的循环:
pf.PivotFilters.Add Type:=xlDateBetween, Value1:=strtDate, Value2:=endDate
这解决了我在使用日期格式时遇到的问题。更多信息在下面接受的答案中,以及在这个网站上