2014-08-27 2 views
1

피벗 테이블의 각 이름을 필터링하고 다른 서브 루틴을 호출하여 테이블을 조작하고 형식을 지정하는 VBA 코드를 컴파일했습니다. 이 코드는 과거에는 완벽하게 작동했지만 원본 테이블을 업데이트하고 피벗 테이블에 약간의 형식을 변경하면 이제는 실패합니다. 여기 Excel VBA 자동 필터 피벗 테이블

코드이다

Sub AutoFilterEachName() 

Piv_Sht = ActiveSheet.Name 
Sheets(ActiveSheet.Name).Select 
For Each PivotItem In ActiveSheet.PivotTables(1).PageFields(1).PivotItems 
ActiveSheet.PivotTables(1).PageFields(1).CurrentPage = PivotItem.Value 
Call PivotCopyFormatValues 
Call DeleteRows2 
Call DeleteRows2 
Call AddComment 
Call Move_Save_As 

Sheets(Piv_Sht).Select 

Next 
End Sub 

첫째 코드가 시작되면 행 ActiveSheet.PivotTables(1).PageFields(1).CurrentPage = PivotItem.Value는 이름 필터의 제 1 필터 값을 변경하지 않는다.

두 번째 : 루틴이 Next에 도달하면 For Each 행까지 다시 돌아가서 End Sub으로갑니다. 나는 결과를 Next PivotItem 부엉없이 추가하려고했습니다. 따라서 코드를 한 번 실행하고 중지합니다.

막 다른 골목에있어 도움을받을 수 있습니다.

답변

0

지연된 응답 7 개월 동안 죄송합니다. 여전히 도움이 필요하면 ... 나는 이것이 당신이 찾고있는 결과를 얻을 도움이 될 생각 :

Sub AutoFilterEachName() 

    Dim pTbl As PivotTable 
    Dim piv_sht As Worksheet 
    Dim i As Long 

    Set piv_sht = ThisWorkbook.ActiveSheet 
    Set pTbl = piv_sht.PivotTables(1) 

    piv_sht.Select 

    For i = 1 To pTbl.PageFields(1).PivotItems.Count 

     'set the PageField page equal to the name of the PivotItem at index i 
     'if you need to cycle through multiple PageFields, consider a nested For loop or For Each loop 
     pTbl.PageFields(1).CurrentPage = pTbl.PageFields(1).PivotItems(i).Name 

     Call PivotCopyFormatValues 
     Call DeleteRows2 
     Call DeleteRows2 
     Call AddComment 
     Call Move_Save_As 

     piv_sht.Select 

    Next i 

End Sub 

이유 중 하나는 당신의 실행되지 않았으며 귀하의 PageFields이 비어 있었기 때문에 End Sub 즉시되어가는 For Next; 루프에 PageFields이 없으면 루프가 즉시 종료됩니다. 이에 대한 한 가지 해결책은 최소한 하나의 PageField이 항상 있는지 확인하는 것입니다. 당신은 당신의 For Loop 전에이 코드를 입력하여이를 수 :

pTbl.PivotFields(1).Orientation = xlPageField 

이것은 PageField로 테이블의 첫 번째 PivotField를 삽입합니다.