2013-08-14 34 views
22

Tôi nhận thấy kịch bản VBA của tôi không hoạt động khi có bộ lọc tự động đã bật. Có ai biết vì sao lại thế này không?ShowAllData phương pháp của lớp bảng tính không thành công

wbk.Activate 
    Set Criteria = Sheets("Sheet1").Cells(i, 1) 

    Set rng = Sheets("Sheet1").Range(Cells(i, 2), Cells(i, 4)) 

    wb.Activate 
    If ActiveSheet.AutoFilterMode Then ActiveSheet.ShowAllData 'remove autofilter, but it crashes on this line 

    Selection.AutoFilter 

    Range("$A$1:$BM$204").AutoFilter Field:=2, Criteria1:=Criteria.Value 

    rng.Copy 

    Range("$BC$2:$BE$204").SpecialCells(xlCellTypeVisible).PasteSpecial 

Rất cám ơn

+1

Lỗi nào bạn gặp phải trên đường dây gặp sự cố? –

+0

Lỗi thời gian chạy: Phương thức ShowAllData của lớp bảng tính không thành công –

Trả lời

6

Các lỗi ShowAllData method of Worksheet class failed thường xảy ra khi bạn cố gắng để loại bỏ một bộ lọc áp dụng khi không có một áp dụng.

Tôi không chắc chắn nếu bạn đang cố gắng xóa toàn bộ AutoFilter hoặc chỉ xóa bất kỳ bộ lọc được áp dụng nào, nhưng có các cách tiếp cận khác nhau cho mỗi bộ lọc.

Để loại bỏ một bộ lọc áp dụng nhưng để lại AutoFilter trên:

If ActiveSheet.AutoFilterMode Or ActiveSheet.FilterMode Then 
    ActiveSheet.ShowAllData 
End If 

Lý do đằng sau mã trên là để kiểm tra rằng có một AutoFilter hay một bộ lọc đã được áp dụng (điều này cũng sẽ loại bỏ bộ lọc nâng cao) .

Để gỡ bỏ hoàn toàn AutoFilter:

ActiveSheet.AutoFilterMode = False 

Trong trường hợp trên, bạn chỉ đơn giản là vô hiệu hóa hoàn toàn AutoFilter.

+0

Tôi đã cập nhật mã của mình thành các mục sau: Nếu ActiveSheet.AutoFilterMode Sau đó ActiveSheet.AutoFilterMode = False Nếu ActiveSheet.FilterMode Sau đó ActiveSheet.FilterMode = False Tôi muốn xóa hoàn toàn bộ lọc . Tuy nhiên, bây giờ tôi nhận thấy phương pháp dán cũng dán vào ba ô đầu tiên (vô hình?). Tôi không thể hiểu được điều này. –

+1

@KrisVandenBergh Tôi rất vui vì vấn đề ban đầu đã được giải quyết :) Nếu có một vấn đề khác với phương pháp 'PasteSpecial' của bạn, bạn có thể đặt câu hỏi mới vì câu hỏi này là để tìm ra lỗi với' AutoFilter'. –

+0

@KrisVandenBergh Vì vấn đề ban đầu của bạn đã được giải quyết, bạn có thể đánh dấu câu hỏi này là đã trả lời không? Cảm ơn –

29

AutoFilterMode sẽ là True nếu được tham gia, bất kể có thực sự là một bộ lọc được áp dụng cho một cột cụ thể hay không. Khi điều này xảy ra, ActiveSheet.ShowAllData sẽ vẫn chạy, phát ra lỗi (vì không có bộ lọc thực tế).

tôi đã cùng một vấn đề và đã nhận nó làm việc với

If (ActiveSheet.AutoFilterMode And ActiveSheet.FilterMode) Or ActiveSheet.FilterMode Then 
    ActiveSheet.ShowAllData 
End If 

này dường như để ngăn chặn ShowAllData chạy khi không có bộ lọc thực tế áp dụng nhưng với AutoFilterMode bật.

Việc nắm bắt thứ hai Or ActiveSheet.FilterMode nên bắt bộ lọc nâng cao

+12

Có một vấn đề logic: ** (A và B) hoặc B == B **, do đó giải pháp của bạn tương đương với. . . . . 'Nếu ActiveSheet.FilterMode Sau đó ...' – MGM

1

Tôi vừa trải qua cùng một vấn đề. Sau một số thử nghiệm và lỗi, tôi phát hiện ra rằng nếu lựa chọn ở bên phải vùng bộ lọc của tôi VÀ số lượng bản ghi được hiển thị bằng 0, ShowAllData sẽ không thành công.

Ngữ cảnh ít hơn một chút có thể có liên quan. Tôi có một số tờ, mỗi tờ có một bộ lọc. Tôi muốn thiết lập một số bộ lọc tiêu chuẩn trên tất cả các tờ, do đó tôi sử dụng một số VBA như thế này

Sheets("Server").Select 
col = Range("1:1").Find("In Selected SLA").Column 
ActiveSheet.ListObjects("Srv").Range.AutoFilter Field:=col, Criteria1:="TRUE" 

Mã này sẽ điều chỉnh bộ lọc trên cột với tiêu đề "Trong SLA được chọn", và để lại tất cả các bộ lọc khác không thay đổi . Điều này có tác dụng phụ không may rằng tôi có thể tạo ra một bộ lọc cho thấy không có hồ sơ. Điều này là không thể sử dụng giao diện người dùng một mình.

Để tránh tình huống đó, tôi muốn đặt lại tất cả các bộ lọc trước khi áp dụng tính năng lọc ở trên. Mã đặt lại của tôi trông giống như thế này

Sheets("Server").Select 
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData 

Lưu ý cách tôi không di chuyển ô đã chọn. Nếu lựa chọn ở bên phải, nó sẽ không loại bỏ các bộ lọc, do đó cho phép mã bộ lọc xây dựng một bộ lọc hàng không. Lần thứ hai mã được chạy (trên một bộ lọc hàng không) ShowAllData sẽ thất bại.

Cách giải quyết rất đơn giản: Di chuyển vùng chọn bên trong các cột lọc trước khi gọi ShowAllData

Application.Goto (Sheets("Server").Range("A1")) 
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData 

Đây là trên Excel phiên bản 14.0.7128.5000 (32-bit) = Office 2010

+0

Lựa chọn chỉ có liên quan, khi bạn làm việc với ListObjects - chúng có thể được lọc riêng biệt, nhiều hơn một khu vực trong một trang tính. Bộ lọc thông thường (đơn) Bộ lọc có thể được truy cập đơn giản thông qua đối tượng Bảng tính. – MGM

10

Cách đơn giản để tránh điều này là không sử dụng phương pháp tính bảng ShowAllData

Bộ lọc tự động có cùng phương pháp ShowAllData không phát sinh lỗi khi bộ lọc được bật nhưng không có bộ lọc nào được đặt

If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilter.ShowAllData

+0

Không phải là phương pháp khác nhau của 'Autofilter' và' ShowAllData'? Trong khi 'Autofilter' ** loại bỏ ** bộ lọc,' ShowAllData' chỉ ** xóa ** nó. – Mertinc

+0

OP đề cập đến Worksheet.ShowAllData đưa ra lỗi khi bộ lọc bật nhưng không có tiêu chí nào được chọn và câu trả lời của tôi là sử dụng Worksheet.Autofilter.ShowAllData không gây ra lỗi khi không có tiêu chí bộ lọc nào được chọn. - Đó là ShowAllData cùng phương thức, –

+0

Tôi không biết sự khác biệt đó và thực sự cũng đã giải quyết được vấn đề hiện tại của tôi sau lời giải thích tốt hơn của bạn Steven, cảm ơn rất nhiều! – Mertinc

Các vấn đề liên quan