使用VBA过滤OLAP数据透视表

问题描述 投票:0回答:2

我可以通过 OLAP 数据透视表访问我们的数据库。我经常想根据多个客户号码(不连续)进行过滤。然而,客户列表太长,尝试滚动并手动选择客户是不可能的。我希望通过添加切片器并使用宏来选择可见切片器项目来解决问题(尽管我对其他想法持开放态度)。我希望有一个工作表,我可以在其中添加我想要过滤的客户号码列表,在运行时将宏应用于切片器。

当我录制宏时,它生成了以下代码:

ActiveWorkbook.SlicerCaches("Slicer_Client_ID").VisibleSlicerItemsList = Array _
        ( _
        "[DimMatter].[CurrClientNumber].&[090204]", _
        "[DimMatter].[CurrClientNumber].&[092223]", _
        "[DimMatter].[CurrClientNumber].&[102028]", _
        "[DimMatter].[CurrClientNumber].&[103118]", _
        "[DimMatter].[CurrClientNumber].&[104382]")

所以我编写了代码来创建一个数组,我希望将其输入到可见切片器项目列表中:

    Set wb = Workbooks("workbook.xlsm")
    Set iws = wb.Sheets("Client List")
    Set tws = wb.Sheets("Table_Sheet")

    
    s_count = iws.Range("A1").End(xlDown).Row
    
    'initialize the array
    ReDim s_array(s_count - 2)
    'populate the array
    For i = 2 To s_count
        arr_itm = iws.Range("A1").Offset(i - 1, 0).Value
        s_array(i - 2) = "[DimMatter].[CurrClientNumber].&[" & arr_itm & "]"
    Next i

    wb.SlicerCaches("Slicer_Client_ID").VisibleSlicerItemsList = Array(s_array)

我不知道如何将数组实际输入到切片器项目列表中。当我运行上面的代码时,我收到一条错误:“运行时错误‘1004’:在 OLAP 多维数据集中找不到该项目”。

我是使用数组和 OLAP 多维数据集的新手,所以希望得到任何反馈。

excel vba olap-cube
2个回答
1
投票

数组函数采用值列表并将它们转换为数组。使用 Array(s_array)

 会给出一个单元素数组,其中一个元素本身就是一个具有 (s_count - 1) 个元素的数组 - 即从零到 (scount - 2)。换句话说,您创建了一个具有边界的二维数组(0 To 0, 0 To s_count - 2)。

要解决这个问题,只需直接使用

s_array

 并省略 
Array(...)
 部分:

wb.SlicerCaches("Slicer_Client_ID").VisibleSlicerItemsList = s_array


注意:答案假设默认值

Option Base 0

 有效并且数组以元素 0 开始


0
投票
非常感谢你们提供此代码。将数组传递到常规数据透视表与常规自动过滤器和强大的数据透视表数据模型过滤器之间显然存在特殊性。我无法使用 Power Pivot 数据模型过滤器弄清楚这一点,但添加切片器并将数组传递给切片器最终成功了。我永远感激你们俩!

© www.soinside.com 2019 - 2024. All rights reserved.