比较date范围Excel VBA

有答案更新:我find了我的问题的答案。 我将在这里放置一个简化的版本,下面的原始问题,只是为了方便,以下更详细的版本作为接受的答案。

我正在写一个VBA函数来筛选一个由用户input的date范围的数据透视表。 出于某种原因,它没有返回预期的结果。

被比较的date有两种不同的date格式。 用户input的date格式为mmmm yyyy(2013年10月)。 当这个值被拉入macros进行比较,它是正确的翻译为10/1/2013。 数据透视表date是以mmm yy格式(10月13日)。 当我使用代码PivotItem.Value调用这个date时,它似乎将date翻译为string“Oct 13”。

我无法弄清楚这个macros在做什么,因为它有些不正常。 如果我在2011年10月到2013年10月运行,那么从2008年1月到9月的所有月份,2008年,2009年,2010年等都会返回。如果我运行的是2013年6月到2013年10月,则每年返回6月到9月。 此外,在每个示例中,macros继续运行超过数据透视表中的最大数据范围,并且出现错误。 当我debugging时,macros正在试图将数据透视表设置为“true”,以便在数据透视表(即2014年1月的数据只经历2013年10月)时甚至不存在该date。 不知道为什么会这样。

下面是代码。 任何有识之士将不胜感激。

更新:

所以问题肯定是date格式。 如果我将数据透视表中的字段设置更改为date格式mm / dd / yyyy(2013/1/1),则macros将按预期工作。 这将是一个简单的解决scheme, 除了表格喂养在用户仪表板中看到的图表,我真的很喜欢格式为mmm yy,因为它看起来更干净。 是否有一种简单的方法来将格式转换为mm / dd / yyyy以进行比较,然后在完成后返回到所需的格式?

而且我仍然想知道为什么不同的date格式返回不同的结果,当被比较的原始数据是相同的,并且都被格式化为date ,而不是像date和文本或什么的。

 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 

回答更新:我replace了我正在使用的循环设置下面的代码行的filter:

 pf.PivotFilters.Add Type:=xlDateBetween, Value1:=strtDate, Value2:=endDate 

这解决了我使用date格式的问题。 在下面的接受答案,以及在这个网站的更多信息

我可能是错的,但是你的一个<字符倒退了 – 你不想要开始date大于variables吗?

您可以尝试先转换stringdate值:

 Dim dateValue as Date 'Set new date filter on all pivot tables For Each pt In ws.PivotTables Set pf = pt.PivotFields("Date") For Each pi In pf.PivotItems If IsDate(pi.Value) Then dateValue = CDate(pi.Value) If dateValue < strtDate Or dateValue > endDate Then pi.Visible = False Else pi.Visible = True End If End If Next pi Next pt 'call this function Function IsDate(byval thisDateString as String) As Boolean On Error Goto ErrorHandler Dim d as Date d = CDate(thisDateString) IsDate = true Exit Function ErrorHandler: IsDate = false End Function 

我发现了一些关于通过VBA设置数据透视表filter的附加信息,它改进了原始代码并解决了我遇到的问题。 我决定发布,因为我发现信息非常有帮助。

有很多不同的filter可以用简单的一行命令设置,而不是像以前那样根据条件手动parsing所有数据和手动设置可见性的复杂循环。 下面是更新的代码,这也解决了我与date格式的问题。

在这个连接到globaliconnect网站的链接上,有一些非常有用的信息,可以使用VBA设置不同的数据透视表filter设置。

我仍然不确定为什么date之前做一个循环比较行为怪异,但date只是有点像我猜…

 Sub filterPivotDate(pt As PivotTable, strtDate As Date, endDate As Date) Dim pf As PivotField Application.ScreenUpdating = False 'Clear date filter and set new filter Set pf = pt.PivotFields("Date") pf.ClearAllFilters 'I REPLACED THE LOOP WITH A SINGLE LINE TO SET A FILTER BETWEEN TWO DATES pf.PivotFilters.Add Type:=xlDateBetween, Value1:=strtDate, Value2:=endDate Application.ScreenUpdating = True End Sub