筛选来自Olap cube

时间:2017-09-11 09:09:09

标签: vba date filter pivot-table olap

我想过滤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:对象不支持属性或方法。

手动打开加号(在代码中引用):

Manually opened plus signs

更新

好的,到目前为止我的意思是:

使用:

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:无效的过程调用或参数。

1 个答案:

答案 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格式(新西兰)。这可能是你出错的地方。