2009-04-18 37 views
5

Tôi có bảng tổng hợp với trường trục và chứa nhiều mục. Tôi đã mã hóa VBA để quyết định xem giá trị trục có được hiển thị hay không. Vấn đề là excel tính toán lại bảng tổng hợp cho từng trường được hiển thị hoặc ẩn mà làm cho nó rất chậm. Tôi muốn một cái gì đó mà nó tính toán lại chỉ một lần, sau khi tất cả các giá trị được thiết lập. Tôi đã thử sử dụng Application.Calculation = xlCalculationManual nhưng nó không giúp được gì.Tăng tốc bảng pivot lọc mã VBA

VBA mã mà tôi đang sử dụng là một cái gì đó như thế này

For i = 1 To oPivotField.PivotItems.Count 
    If (oPivotField.PivotItems(i).Name = "TestCondition") Then 
     oPivotField.PivotItems(i).Visible = True 'Recalulates pivot table 
    Else 
     oPivotField.PivotItems(i).Visible = False 'Recalulates pivot table 
    End If 
Next 

tôi để làm điều này bằng tay bằng cách bỏ chọn "hiển thị tất cả" hộp và tái kiểm tra các lĩnh vực Tôi muốn nhìn thấy được. Điều này làm cho Excel tính toán lại một lần và chỉ hiển thị các mục xoay mà tôi muốn hiển thị. Tôi muốn làm điều tương tự thông qua mã VBA.

Tôi thậm chí đã cố gắng sử dụng

Application.ScreenUpdating = False 
Application.DisplayAlerts = False 

nhưng đã không làm việc.

Trả lời

7

Oh! Tôi chỉ giải quyết mà một:

Vào đầu mã của bạn, tắt tính năng tự động cập nhật như thế này:

PivotTable.ManualUpdate = True 

Và sau đó ở phần cuối của mã này, bật nó trở lại:

ActiveSheet.PivotTables("PivotTable1").PivotCache.Refresh 

Tôi tìm thấy chuỗi này tìm kiếm trợ giúp viết mã xác định xem giá trị PivotTable có hiển thị hay không. Điều gì đằng sau oPivotField của bạn? Đó là phần tôi đang mất tích!

-1

Lưu bản sao sổ làm việc của bạn và lưu nó dưới dạng tệp "excel 93-2007". Sau đó thử mã của bạn. Hy vọng điều này sẽ giúp bạn.

0

Hãy thử thêm các mục sau đây. Giúp cho tốc độ thêm trong trường hợp của tôi là tốt.

Vào đầu:

Application.Calculation = xlCalculationManual 

Cuối cùng:

Application.Calculation = xlCalculationAutomatic 
0

pivottable.ManualUpdate [= thiết lập]
Đúng gây RefreshTable để xóa dữ liệu từ bảng pivot, chứ không phải là làm mới nó
Sai cho phép RefreshTable hoạt động bình thường.
Mặc định là Sai.
Khách sạn này được thiết lập lại False tự động sau khi các thủ tục kêu gọi đầu (quan trọng)

tài sản này nên được thiết lập là true ngay trước khi bạn thực hiện một bản cập nhật (ví dụthay đổi trục mục tài sản Visible)
Vì vậy, mã của bạn sẽ trông như thế:

For i = 1 To oPivotField.PivotItems.Count 
    If (oPivotField.PivotItems(i).Name = "TestCondition") Then 
     oPivotField.Parent.ManualUpdate = True 
     oPivotField.PivotItems(i).Visible = True 'doesn't recalculate pivot table because ManualUpdate is set to True 
    Else 
     oPivotField.Parent.ManualUpdate = True 
     oPivotField.PivotItems(i).Visible = False 'doesn't recalculate pivot table because ManualUpdate is set to True 
    End If 
Next 

'setting pivot table ManualUpdate property to False might be redundant at this point because it gets reset to false immediately after you set Visible property of oPivotField 
oPivotField.Parent.ManualUpdate = False 
oPivotField.Parent.Update() 

Như một kết luận, ManualUpdate thay đổi sở hữu không ở lại lâu (trong các thử nghiệm của tôi, tôi có thể thấy rằng nó được thiết lập lại sai lầm như sớm nhất có thể, do đó, đó là lý do tại sao tôi đề nghị bạn đặt nó thành true bất cứ khi nào bạn muốn thực hiện thay đổi cho mục xoay)

Để biết thêm thông tin về bản cập nhật trong Excel, bạn có thể kiểm tra như sau:
Pivot Refresh vs. Update – is there a real difference?

Tài liệu tham khảo:
Title: Lập trình Excel với VBA và .NET
bởi: Jeff Webb, Steve Saunders
In ISBN: 978-0-596-00766-9 | ISBN 10: 0-596-00766-3
ISBN Ebook: 978-0-596-15951-1 | ISBN 10: 0-596-15951-X