Lỗi kết quả VBA khi người dùng sử dụng bộ lọc?

Liên hệ QC

phamvandunghp84

Thành viên thường trực
Tham gia
5/3/20
Bài viết
241
Được thích
12
Nhờ các anh chị em chỉ giúp tôi vấn đề code VBA khi sheet đang có lọc dữ liệu thì làm sao để code VBA này không bị ảnh hưởng bởi việc người dùng có lọc dữ liệu? Xin cảm ơn !
( xin chú thích rõ hơn vấn đề tôi đang gặp: code này chạy rất đúng khi người dùng không dùng bộ lọc Data->filter, nhưng khi người dùng sử dụng tới thì nó không còn chép kết quả ra đúng các ô nữa)
Sheets("Thucpham").Range("E2:H400").Value = Sheets("Thucpham").Range("I2:L400").Value
 
Nhờ các anh chị em chỉ giúp tôi vấn đề code VBA khi sheet đang có lọc dữ liệu thì làm sao để code VBA này không bị ảnh hưởng bởi việc người dùng có lọc dữ liệu? Xin cảm ơn !
( xin chú thích rõ hơn vấn đề tôi đang gặp: code này chạy rất đúng khi người dùng không dùng bộ lọc Data->filter, nhưng khi người dùng sử dụng tới thì nó không còn chép kết quả ra đúng các ô nữa)
Sheets("Thucpham").Range("E2:H400").Value = Sheets("Thucpham").Range("I2:L400").Value
Bạn thêm một câu lệnh bỏ lọc ở trước.
 
Upvote 0
Nhờ các anh chị em chỉ giúp tôi vấn đề code VBA khi sheet đang có lọc dữ liệu thì làm sao để code VBA này không bị ảnh hưởng bởi việc người dùng có lọc dữ liệu? Xin cảm ơn !
( xin chú thích rõ hơn vấn đề tôi đang gặp: code này chạy rất đúng khi người dùng không dùng bộ lọc Data->filter, nhưng khi người dùng sử dụng tới thì nó không còn chép kết quả ra đúng các ô nữa)
Sheets("Thucpham").Range("E2:H400").Value = Sheets("Thucpham").Range("I2:L400").Value
Bạn thử cho dòng code sau phía trên dòng copy dữ liệu nhé.

Mã:
Sheets("Thucpham").ShowAllData

Ví dụ:

Mã:
    With Sheets("Thucpham")
        .ShowAllData
        .Range("E2:H400").Value = .Range("I2:L400").Value
    End With
 
Upvote 0
Bạn ơi nếu dùng .ShowAllData thì hình như phải kèm theo On Error Resume Next hoặc bẫy lỗi cho trường hợp sheet chưa chọn giá trị lọc. Chứ không sẽ hiện báo lỗi đúng không?.
 
Upvote 0
Bạn ơi nếu dùng .ShowAllData thì hình như phải kèm theo On Error Resume Next hoặc bẫy lỗi cho trường hợp sheet chưa chọn giá trị lọc. Chứ không sẽ hiện báo lỗi đúng không?.
Nên hạn chế dùng cái bạn nói, bởi vì nó sẽ bỏ qua tất cả những lỗi mà ta không biết nó lỗi gì. Trường hợp này bạn nên kiểm tra xem coi nó có filter hay chưa. Nếu có thì thực hiện ShowAllData.
 
Upvote 0
Bạn ơi nếu dùng .ShowAllData thì hình như phải kèm theo On Error Resume Next hoặc bẫy lỗi cho trường hợp sheet chưa chọn giá trị lọc. Chứ không sẽ hiện báo lỗi đúng không?.
Kiểm tra tình trạng filter:
PHP:
With Sheets("Thucpham")
        If .AutoFilterMode = True Then .ShowAllData
        .Range("E2:H400").Value = .Range("I2:L400").Value
  End With
 
Upvote 0
Làm thế 'phá' mất tiêu cái Filter đã tạo rồi anh.
Kệ chứ! filter chỉ có 1 nhấn, mà là người dùng cuối, còn mình là người viết. Nhiều trường hợp người viết buộc người dùng chịu lỗi thay cho phần mềm, chứ ai mà code hết các lỗi. Chỉ lường trước lỗi và trong hướng dẫn sử dụng buộc người dùng làm đúng quy trình.
 
Upvote 0
Kệ chứ! filter chỉ có 1 nhấn, mà là người dùng cuối, còn mình là người viết. Nhiều trường hợp người viết buộc người dùng chịu lỗi thay cho phần mềm, chứ ai mà code hết các lỗi. Chỉ lường trước lỗi và trong hướng dẫn sử dụng buộc người dùng làm đúng quy trình.
Theo tui thì cho 1 cái Msgbox "Nếu dữ liệu ở chế độ Filter, kết quả ra sai "gáng chịu!".
Đúng sai tùy người dùng.
(Tôi có nghe câu "Xấu đẹp tùy người đối diện")
 
Upvote 0
Có kiểm tra được trạng thái Filter mà anh.

PHP:
If ws.FilterMode = True Then ws.ShowAllData
Được chứ. Nếu True thì chuyển thành False, cuối code thì trả lại True. Nhưng mà mình chẳng quan tâm việc trả lại, vì muốn filter chỉ cần nhấn 1 cái, chỉ tốn 5 giây cuộc đời.
 
Upvote 0
Nhờ các anh chị em chỉ giúp tôi vấn đề code VBA khi sheet đang có lọc dữ liệu thì làm sao để code VBA này không bị ảnh hưởng bởi việc người dùng có lọc dữ liệu? Xin cảm ơn !
( xin chú thích rõ hơn vấn đề tôi đang gặp: code này chạy rất đúng khi người dùng không dùng bộ lọc Data->filter, nhưng khi người dùng sử dụng tới thì nó không còn chép kết quả ra đúng các ô nữa)
Sheets("Thucpham").Range("E2:H400").Value = Sheets("Thucpham").Range("I2:L400").Value
Bạn dùng thử sub này. Gọi nó trước khi chạy các thao tác khác
Rich (BB code):
Sub Filter_UnFilter()

    If ActiveSheet.AutoFilterMode Then
        ActiveSheet.AutoFilterMode = False
    Else
        Range("E2:H400").AutoFilter
    End If

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Được chứ. Nếu True thì chuyển thành False, cuối code thì trả lại True. Nhưng mà mình chẳng quan tâm việc trả lại, vì muốn filter chỉ cần nhấn 1 cái, chỉ tốn 5 giây cuộc đời.
Không đúng rồi anh.

Filter có thể tạo ở 1 hoặc vài cột, toàn bộ cột của vùng dữ liệu; có thể toàn bộ dòng của vùng dữ liệu, hoặc một số dòng thôi.
Nên mình chỉ cần 'nhả' lọc, vẫn giữ nguyên cái người ta đã thiết lập. Vậy mới hay.
 
Upvote 0
Không đúng rồi anh.

Filter có thể tạo ở 1 hoặc vài cột, toàn bộ cột của vùng dữ liệu; có thể toàn bộ dòng của vùng dữ liệu, hoặc một số dòng thôi.
Nên mình chỉ cần 'nhả' lọc, vẫn giữ nguyên cái người ta đã thiết lập. Vậy mới hay.
Không cần "hay" để chiều ý người dùng, mình chết tiệt lắm
 
Upvote 0
PHP:
With Sheets("Thucpham")
    On Error Resume Next
        .ShowAllData
    On Error Goto 0
 End With
Em hay dùng như thế này vì thấy một anh nào đó trên diễn đàn từng dùng nhưng về bản chất thì chưa hiểu rõ lắm. Tiện đây cách anh giải thích cho em rõ hơn được không ạ? Em đang hiểu On Error Goto 0 là khôi phục lại như trước khi dùng On Error Resume Next. Hiểu như vậy có đúng không ạ?
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom