Excel 循环遍历数组并更改OLAP数据透视表上的过滤器

Excel 循环遍历数组并更改OLAP数据透视表上的过滤器,excel,vba,pivot-table,Excel,Vba,Pivot Table,我对VBA非常陌生,因此我正在寻找有关设置宏的帮助,该宏将从特定范围向数组中添加值,然后在该数组中循环以更新透视表上的过滤器。但是,并非每个值都可以设置。这方面的一个例子是,100中只设置了4个值,因此它只会在其中循环4次,并用这4个值更新过滤器。我以前从未使用过for循环,因此对此提供任何指导都将非常有用 到目前为止,我的代码是: Sub Update_Filters() Dim PortfolioCodes As Variant PortfolioCodes = Sheet

我对VBA非常陌生,因此我正在寻找有关设置宏的帮助,该宏将从特定范围向数组中添加值,然后在该数组中循环以更新透视表上的过滤器。但是,并非每个值都可以设置。这方面的一个例子是,100中只设置了4个值,因此它只会在其中循环4次,并用这4个值更新过滤器。我以前从未使用过for循环,因此对此提供任何指导都将非常有用

到目前为止,我的代码是:

Sub Update_Filters()

    Dim PortfolioCodes As Variant
    PortfolioCodes = Sheets("Configuration Sheet").Range("C7:C45").Value

    Sheets("List").PivotTables("List").PivotFields( _
        "[Portfolio].[Portfolio Code].[Portfolio Code]").VisibleItemsList = Array( _
        "[Portfolio].[Portfolio Code].&[ABC1]", "[Portfolio].[Portfolio Code].&[ABC2]", _
        "[Portfolio].[Portfolio Code].&[XYZ1]", "[Portfolio].[Portfolio Code].&[XYZ2]")
End Sub

以下是您问题的两个可能答案:

Option Explicit
Sub Update_Filters()

    'this code will filter one portfolio code at a time
    Dim LastRow As Long
    With ThisWorkbook.Sheets("Configuration Sheet")
        LastRow = .Cells(.Rows.Count, "C").End(xlUp).Row
        Dim PortfolioCodes As Variant
        PortfolioCodes = .Range("C7:C" & LastRow).Value
    End With

    For i = LBound(PortfolioCodes) To UBound(PortfolioCodes)
        ThisWorkbook.Sheets("List").PivotTables("List").PivotFields( _
        "[Portfolio].[Portfolio Code].[Portfolio Code]").VisibleItemsList = _
            Array("[Portfolio].[Portfolio Code].&[" & PortfolioCodes(i) & "]")
        'some code
    Next i

End Sub
Sub Update_FiltersALL()

    'This code will filter all the portfolio codes in your range
    With ThisWorkbook.Sheets("Configuration Sheet")

        Dim LastRow As Long
        LastRow = .Cells(.Rows.Count, "C").End(xlUp).Row

        Dim i As Long
        i = 1

        ReDim PortfolioCodes(1 To LastRow - 6) As String
        Dim C As Range
        For Each C In .Range("C7:C" & LastRow)
            If Not IsEmpty(C) Then
                PortfolioCodes(i) = "[Portfolio].[Portfolio Code].&[" & C.Value & "]"
                i = i + 1
            End If
        Next C
    End With

    ThisWorkbook.Sheets("List").PivotTables("List").PivotFields( _
    "[Portfolio].[Portfolio Code].[Portfolio Code]").VisibleItemsList = PortfolioCodes

End Sub

我不明白,你想让你的过程同时显示所有4个值的数据,或者一次过滤1个值,然后做些什么?我试图使用你提供的代码的第二个版本来更新所有值,但是它抛出了一个下标超出范围的错误。“有什么东西我看过头了吗?”吉尔在尝试过滤时问道?范围中可能有一些空值?或者一些不在olap上的代码?是的,范围中有空值,这就是为什么我希望范围在下一个单元格所在的点停止读取empty@Gil试试我的编辑。。它将忽略空单元格并仅循环到最后一行(将忽略可能在您的范围内的空单元格)。我收到一个新错误“Compile error:Constant expression required”,它将Dim PortfolioCodes中的最后一行(1到最后一行-6)突出显示为字符串