【问题标题】:Excel VBA pivot table filtering by barcodeExcel VBA数据透视表按条形码过滤
【发布时间】:2014-04-02 20:51:49
【问题描述】:

我一直在尝试创建子,通过选择几个条形码来帮助过滤商品列表。我知道我可以手动完成,但它很长而且令人沮丧,因为大约有 2000 个独特的条形码。我已经录制了一个宏并在这里找到了一些类似的答案,但是我收到一个错误“运行时错误'1004':应用程序定义或对象定义的错误'它在 PI.value 被分配真或假时卡住:“PI .可见=真; Pi.Visible = False"。

代码:

私有子命令按钮1_Click()

Dim MyNames() As Variant
Dim objPivotField As PivotField
Dim i As Long
Dim PI As PivotItem
Set objPivotField = _
ActiveSheet.PivotTables("PivotTable1").PivotFields(Index:="[Prekė].[Barkodas].[Barkodas]")
MyNames = Array("4770349225872", "4770033220077", "7622400004773")
With ActiveSheet.PivotTables("PivotTable1").PivotFields(Index:="[Prekė].[Barkodas].[Barkodas]")

    For i = LBound(MyNames) To UBound(MyNames)

    For Each PI In .PivotItems
        If PI.Name = MyNames(i) Then
        PI.Visible = True
    Else
        PI.Visible = False
    End If
    Next PI
    Next i
End With End Sub

这是我为过滤而录制的宏:

ActiveSheet.PivotTables("PivotTable1").PivotFields( _
    "[Prekė].[Barkodas].[Barkodas]").VisibleItemsList = Array("", _
    "[Prekė].[Barkodas].&[4750398000132]", "", "[Prekė].[Barkodas].&[4046234141238]", _
    "[Prekė].[Barkodas].&[4770248342625]")

【问题讨论】:

  • 您能发布更多关于数据透视表设置的信息吗?我尝试了一个与您的逻辑相似的小示例,它有效,但我使用了 With ActiveSheet.PivotTables("PivotTable1").PivotFields("Barkodas")
  • 此外,遍历条形码一次并根据 MyNames 检查每个 PivotItem 比遍历条形码三次(每次检查单个条形码)要快

标签: vba excel


【解决方案1】:

正如上面在 cmets 中所写,这是我使用 VBA 过滤数据透视表的方法:

Option Explicit
Sub FilterPivotTable()

Dim PT1 As PivotTable
Dim PT1Barkodas As PivotField
Dim MyNames() As Variant
Dim PivotIdx As Long

'assign table, field and array values for easy reference
Set PT1 = ActiveSheet.PivotTables("PivotTable1")
Set PT1Barkodas = PT1.PivotFields("Barkodas")
MyNames = Array("4770349225872", "4770033220077", "7622400004773")

With PT1Barkodas

    'loop through all the barcodes
    For PivotIdx = 1 To PT1Barkodas.PivotItems.Count

        'logic to check if the current barcode is in the MyNames array
        If UBound(Filter(MyNames, .PivotItems(PivotIdx))) > -1 Then
            IsInArray = True
        Else
            IsInArray = False
        End If

        'if the barcode was not in the MyNames array, hide it
        If IsInArray = False Then
            .PivotItems(PivotIdx).Visible = False
        End If

    Next PivotIdx

End With

End Sub

运行此脚本根据 MyNames 过滤 PivotTable1:

【讨论】:

  • 您好,感谢您的回答。这似乎是一个很好的方法,但是在分配可见值时,我在这一行得到一个错误:code If IsInArray = False Then .PivotItems(PivotIdx).Visible = False End If "Run-time error '1004' Application-defined or object-defined error"
  • 另外,如果我使用“Barkodas”而不是“[Prekė].[Barkodas].[Barkodas]”,我会在这一行得到同样的错误。
  • 嘿@user2179129,真讨厌!那个 1004 错误非常有趣。我很乐意帮助解决更多问题,但您认为您可以发送数据透视表和数据源的屏幕截图以帮助我更好地了解问题的过滤和根源吗?
  • dropbox.com/s/oqu6o5l978zurzn/example.jpg 这是一个表格示例。但是我无法访问数据源。
猜你喜欢
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 2015-05-13
相关资源
最近更新 更多