【问题标题】:Excel VBA: Create Array from Filter Field Items?Excel VBA:从筛选字段项创建数组?
【发布时间】:2019-05-25 06:28:38
【问题描述】:

我在 Excel 中创建的报告涉及几个非常相似的数据透视表,需要多次专门筛选(即年初至今表、季度至今表等,都需要准确筛选导出前的方式相同,然后再次过滤,然后导出等)

因此,我将 VBA 视为一种接受一些过滤条件的方式,然后在循环之前以这种方式过滤多个表。

但是,我很难正确定位数据透视表和特定字段,因为看起来集成的值字段是通过代码进行定位和过滤的,这与我附加到顶部的“过滤器”字段不同数据透视表,它们不能接受“开头”、“包含”等字符串。它们只是复选框,可以选择一个或多个。

所以我通过 VBA 告诉它选择 一个 项,并让它选择 除了一个 项之外的所有项是一回事。后者要求代码针对每一个可能的值,但不是我想要排除的值。

因此,我的想法是从这个过滤器字段中的每个可能的现有值创建一个数组,然后通过一个循环,将每个值作为要检查的值添加到我的代码中。

到目前为止我有一些代码:


ActiveSheet.PivotTables("QTD_Pivot_By_Category").PivotFields( _
        "[Range].[Address_1].[Address_1]").VisibleItemsList = Array( _
        "[Range].[Address_1].&", "[Range].[Address_1].&[0]", "[Range].[Address_1].&[101]" _
        , "[Range].[Address_1].&[INC]", "[Range].[Address_1].&[KRT]", _
        "[Range].[Address_1].&[LTD]", "[Range].[Address_1].&[RPO]", _
        "[Range].[Address_1].&[ INC]", "[Range].[Address_1].&[CORP]", _
        "[Range].[Address_1].&[INC.]", "[Range].[Address_1].&[LTD.]", _
        "[Range].[Address_1].&[LTEE]", "[Range].[Address_1].&[PAWS]", _


现在,如果我只是从 Excel 中的操作中记录此宏,然后执行“全选”,然后取消选择我不想要的那个,它会出错。它会出错,因为它选择了大约 300 个值,并且在“编写”此代码时,当它在 VBA 代码的一条直线中达到“_”分隔符的限制时会出错。

如果我的字段如上所述被称为“Address_1”,范围的一部分...“Range”(不确定在哪里定义或为什么,但它有效),我可以就最有效的方法获得一些帮助将所说的“.VisibleItemList”定义为来自动态数组的列表中的所有可能项目,而不是需要手动选择?此列表每天都会有所不同,因此不能只是硬编码的平面列表。

理想情况下,也可以绕过 VBA for Excel 中一行代码中“_”换行符的最大限制。

如果它对上下文有用,我的表格看起来像这样。看到那个复选框下拉菜单了吗?我希望将其中的每个更新值的快照放入一个数组中,然后以类似于我的示例代码的方式在添加时进行迭代:

编辑: 由于该过滤器字段的值是从本地数据源中提取的,因此我决定只获取这些值并以这种方式创建一个数组!所以我以这种方式开始我的代码:


Dim OGDataRange As Range, OGDataLastRow As Long
Dim ValueArray As Variant


OGDataLastRow = Worksheets("DATA QTD").Range("U2").End(xlDown).Row
Set OGDataRange = Worksheets("DATA QTD").Range("U2:U" & OGDataLastRow)
ValueArray = OGDataRange.Value

“ValueArray”现在是我的数组。因此,我需要一个接一个地提取该数组的值,并将它们添加到我的 VisibleItemList 中,如上所示。

非常感谢您的帮助。

【问题讨论】:

    标签: arrays excel vba


    【解决方案1】:

    这可能对你有帮助

    Private Sub this()
        Dim pf As PivotField
        Dim pi As PivotItem
        Dim strPVField As String
    
        strPVField = "this"
        Set pt = ActiveSheet.PivotTables("PivotTable1")
        Set pf = pt.PivotFields(strPVField)
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
    
        On Error Resume Next
            pf.AutoSort xlManual, pf.SourceName
             For Each pi In pf.PivotItems
                 pi.Visible = False
             Next pi
            pf.AutoSort xlAscending, pf.SourceName
    
        Application.DisplayAlerts = True
        Application.ScreenUpdating = True
    End Sub
    

    借来的

    Deselect all items in a pivot table using vba

    【讨论】:

    • 感谢您的帮助 - 我将它改编到我的表中并运行它,但在我之前尝试其他人的 VBA 数据透视排序代码时看到了很多错误:“无法获取 PivotFields 属性数据透视表类”。我点击了调试,有问题的行是“Set pf = pt.PivotFields(strPVField)”。
    猜你喜欢
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多