Excel VBA运行宏设置OLAP切片器昨日日期报错1004求助
问题根因
- 原代码将
MyDate变量直接写死在OLAP成员路径的字符串中,VBA不会解析字符串内部的变量名,实际传入的是文本MyDate而非日期值,触发类型转换报错 MyDate被定义为Range对象而非日期类型值,就算成功解析变量也会传入对象而非日期值,同样会触发类型错误- OLAP数据源的切片器成员有固定格式要求,需要按数据源的日期层级格式拼接成员路径,格式不匹配就会触发OLAP Cube找不到成员的报错
修正后代码方案
方案1:读取Slicers工作表D2单元格的日期值
Sub Update_date() Dim MyDate As Date ' 读取单元格日期值,转换为日期类型 MyDate = ThisWorkbook.Worksheets("Slicers").Range("D2").Value ' 拼接OLAP成员路径,通用格式为[维度].[层级].&[日期值],日期格式需和Cube中保持一致 Dim olapMember As String olapMember = "[Sales Orders].[Ship Date].&[" & Format(MyDate, "yyyy-mm-dd") & "]" ' 赋值给切片器 ActiveWorkbook.SlicerCaches("Slicer_Ship_Date").VisibleSlicerItemsList = Array(olapMember) ActiveWorkbook.SlicerCaches("Slicer_Ship_Date1").VisibleSlicerItemsList = Array(olapMember) End Sub
方案2:直接代码生成昨日日期,无需依赖单元格值
Sub Update_date_Yesterday() ' 直接获取昨天日期,无需读取单元格 Dim yesterday As Date yesterday = Date - 1 Dim olapMember As String ' 如果Cube中日期格式不是yyyy-mm-dd,可修改Format参数匹配实际格式 olapMember = "[Sales Orders].[Ship Date].&[" & Format(yesterday, "yyyy-mm-dd") & "]" ActiveWorkbook.SlicerCaches("Slicer_Ship_Date").VisibleSlicerItemsList = Array(olapMember) ActiveWorkbook.SlicerCaches("Slicer_Ship_Date1").VisibleSlicerItemsList = Array(olapMember) End Sub
异常排查
如果仍报找不到成员的错误,按以下步骤处理:
- 手动点击切片器选中任意日期,在VBA立即窗口执行
? ActiveWorkbook.SlicerCaches("Slicer_Ship_Date").VisibleSlicerItemsList(0),即可输出正确的OLAP成员格式,对照修改代码中Format的日期格式即可 - 确认Cube中存在昨日的日期值,若当天数据尚未同步也会触发找不到成员的报错
内容的提问来源于stack exchange,提问作者András
相关产品推荐
相关产品推荐

