2014-04-02 84 views
0

我一直在尝试创建子,它通过选择几个条形码来帮助过滤商品清单。我知道我可以手动完成,但它非常漫长而令人沮丧,因为大约有2000个独特的条形码。我记录了一个宏,并在这里发现了一些类似的答案,但是我收到一个错误“运行时错误'1004':应用程序定义的或对象定义的错误'当PI.value被赋值为true或false时, .Visible = True; Pi.Visible =假”Excel VBA数据透视表通过条形码过滤

代码:

私人小组CommandButton1_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]") 
+0

你能发布更多关于数据透视表的设置吗?我尝试了一个与你的逻辑类似的小例子,它工作,但我用ActiveSheet.PivotTables(“PivotTable1”)。PivotFields(“Barkodas”) –

+0

此外,通过条形码循环一次,检查每个PivotItem对MyNames会更快比循环条码三次,每次检查一个条形码 –

回答

0

作为评价上面写,这里是我用于过滤与VBA透视表的方法:

pivot table setup

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:

result

+0

嗨,谢谢你的回答。这似乎是这样做的好办法,但分配可见价值的时候,我得到一个错误,在这条线: '代码如果IsInArray = false,那么 .PivotItems(PivotIdx)。可见=假 结束如果' “运行时错误'1004' 应用程序定义或对象定义的错误“ – user2179129

+0

此外,如果我使用”Barkodas“,而不是”[Prekė]。[Barkodas]。[Barkodas]“我在这条线上得到同样的错误。 – user2179129

+0

嘿@ user2179129,无赖! 1004错误非常有趣。我很想帮助解决更多疑难问题,但您是否认为可以发送数据透视表和数据源的截图以帮助我更好地了解问题的过滤和来源? –

相关问题