我想过滤Oates Cube中两个日期之间的日期。
到目前为止我的代码:
Set pvtField = pt.CubeFields("[DimTime].[Year-Quarter-Month-Day]")
' Add item to the Report Filter
pvtField.CreatePivotFields
pvtField.Orientation = xlRowField
With ActiveSheet.PivotTables(1).PivotFields("[DimTime].[Year-Quarter-Month-Day].[Day]")
Debug.Print end_date 'return Date in the format 'dd.mm.yyyy', it is a valid Date
Debug.Print start_date 'return Date in the format 'dd.mm.yyyy', it is a valid Date
Debug.Print .PivotItems(1).Caption 'returns e.g. Monday, September 04 2006, this is just returned, if i click on the plus sign in the pivot table(see attached picture)
Debug.Print .PivotItems(1).Value 'returns e.g. [DimTime].[Year-Quarter-Month-Day].[Day].&[2006-09-04T00:00:00]
Debug.Print .Name 'returns e.g. [DimTime].[Year-Quarter-Month-Day].[Day]
.ClearAllFilters 'Clear All The Filters
.CubeField.IncludeNewItemsInFilter = True
.PivotFilters.Add2 Type:=xlCaptionIsBetween, Value1:=start_date, Value2:=end_date 'getting here the error
'.PivotFilters.Add2 Type:=xlDateBetween, Value1:=start_date, Value2:=end_date 'getting here the same error
End With
错误消息是:
运行时错误438:对象不支持属性或方法。
手动打开加号(在代码中引用):
更新
好的,到目前为止我的意思是:
使用:
For Each i In .PivotItems
Debug.Print i.Caption 'it prints e.g. Monday, September 04 2017
Next i
我无法在此字段或项目上使用.IsDate,所以它不是日期?
如果我格式化我的start_date到这个格式我得到Montag,2017年9月4日(德语版,因为我使用的是德国电脑)。这与我的问题有关吗?
UPDATE2:
我试过了:
.PivotFilters.Add Type:=xlCaptionIsGreaterThan, Value1:=Format(start_date, "dddd, mmmm dd yyyy") 'getting here the error
结果是,仅在星期三选择了start_date = 2017年8月23日星期三(我已将系统设置从德语更改为英语)
结果问题 - >我可以将我的PivotField转换为日期吗?
UPDATE3
我使用以下for循环转换了Olap Date,现在又出现了一个新错误:
1004:您输入的日期不是有效日期。请再试一次。
For Each i In .PivotItems
Debug.Print i.Caption
'Debug.Print CDate(CStr(i.Caption))
p = i.Caption
u = Split(p, ",")(1)
Debug.Print CDate(u) 'e.g. 04/09/2017
i.Caption = CDate(u)
Next i
'Debug.Print .PivotItems(1).IsDate
.PivotFilters.Add Type:=xlDateBetween, Value1:=start_date, Value2:=end_date 'getting here the error
还尝试使用CDate(u)和start_date / end_date中的Cdbl并收到此错误消息:
5:无效的过程调用或参数。
答案 0 :(得分:0)
启动宏录制器,设置DateBetween滤镜,然后查看它录制的代码。然后将该代码与您上面所做的相比较,您可能能够找到出错的地方。当我这样做时,我得到了这个:
if (userManager.IsInRole(user.Id, "Admin")) {
// this roles is authorized to get the All records
}
else{
// Send a single record ...
}
请注意,宏录制器并不关心日期格式为dddd,mmmm dd yyyy格式......它只使用了适合我所在位置的d / mm / yyyy格式(新西兰)。这可能是你出错的地方。