Macro ghi AutoFilter không hoạt động đúng (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,662
Được thích
16,720
Giới tính
Nam
Khi thực hiện AutoFilter, tôi đã ghi lại macro, cái tôi cần lọc là ngày, khi thao tác trên sheet thì hoàn toàn cho kết quả như ý. Sau khi clear filter, tôi dùng macro đã ghi lại thao tác đó thì lại không cho kết quả đúng.

Cột tôi cần lọc có giá trị ngày và giá trị chuỗi, tôi chỉ lọc lấy ngày, lọc trên sheet thì đúng, còn lọc qua macro thì lại sai, xin vui lòng cho hỏi tại sao?

PHP:
Sub Macro1()
'
' Macro1 Macro
'

'
    ActiveSheet.Range("$A:$F").AutoFilter Field:=6, Criteria1:=">=24/11/2011", _
        Operator:=xlAnd
End Sub

Hiện tại trên sheet là đang lọc đúng, nhưng nếu chạy macro ghi lại thì hoàn toàn sai!
 

File đính kèm

Khi thực hiện AutoFilter, tôi đã ghi lại macro, cái tôi cần lọc là ngày, khi thao tác trên sheet thì hoàn toàn cho kết quả như ý. Sau khi clear filter, tôi dùng macro đã ghi lại thao tác đó thì lại không cho kết quả đúng.

Cột tôi cần lọc có giá trị ngày và giá trị chuỗi, tôi chỉ lọc lấy ngày, lọc trên sheet thì đúng, còn lọc qua macro thì lại sai, xin vui lòng cho hỏi tại sao?

PHP:
Sub Macro1()
'
' Macro1 Macro
'

'
    ActiveSheet.Range("$A:$F").AutoFilter Field:=6, Criteria1:=">=24/11/2011", _
        Operator:=xlAnd
End Sub

Hiện tại trên sheet là đang lọc đúng, nhưng nếu chạy macro ghi lại thì hoàn toàn sai!

Hãy chuyển Date thành Long nhé:
Mã:
Sub Macro1()
  Dim lDate As Long
  lDate = CLng(DateSerial(2011, 11, 24))
  ActiveSheet.Range("$A:$F").AutoFilter 6, ">=" & lDate
End Sub
 
Upvote 0
Vì cột F của bác Nghĩa định dạng đủ kiểu hết. Nghĩa định dạng lại Date và thử code này xem
PHP:
Dim ngay As Date
ngay = CDbl(24 / 11 / 2011)
ActiveSheet.Range("$A:$F").AutoFilter Field:=6, Criteria1:=">=" & ngay, _        Operator:=xlAnd
 
Upvote 0
Hãy chuyển Date thành Long nhé:
Mã:
Sub Macro1()
  Dim lDate As Long
  lDate = CLng(DateSerial(2011, 11, 24))
  ActiveSheet.Range("$A:$F").AutoFilter 6, ">=" & lDate
End Sub

Nghĩ cũng kỳ lạ, biến Long hay biến Double đều dùng được! Mà tại sao ghi macro lại như vậy (giống cái Thầy đố quá! ghi thì được mà làm thì sai!)

PHP:
Sub Macro12()
'  Dim lDate As Long
''  lDate = CLng(DateSerial(2011, 11, 24))
  ActiveSheet.Range("$A:$F").AutoFilter 6, ">=" & CDbl(DateSerial(2011, 11, 24))
End Sub
 
Upvote 0
Vì cột F của bác Nghĩa định dạng đủ kiểu hết. Nghĩa định dạng lại Date và thử code này xem
PHP:
Dim ngay As Date
ngay = CDbl(24 / 11 / 2011)
ActiveSheet.Range("$A:$F").AutoFilter Field:=6, Criteria1:=">=" & ngay, _        Operator:=xlAnd

Em định dạng date và xóa hết text chỉ để lại ngày thì nó filter chẳng còn cái gì luôn, chỉ còn hàng tiêu đề mới ghê!
 
Upvote 0
Nghĩ cũng kỳ lạ, biến Long hay biến Double đều dùng được! Mà tại sao ghi macro lại như vậy (giống cái Thầy đố quá! ghi thì được mà làm thì sai!)

PHP:
Sub Macro12()
'  Dim lDate As Long
''  lDate = CLng(DateSerial(2011, 11, 24))
  ActiveSheet.Range("$A:$F").AutoFilter 6, ">=" & CDbl(DateSerial(2011, 11, 24))
End Sub
Vụ này nói nhiều lần rồi, tại Nghĩa không để ý thôi
Nói chung mấy vụ Filter với điều kiện là Date thì phải ghi nhớ quy định: Chuyển Date thành Long. (nếu có cả giờ thì chuyển thành Double)
Vậy thôi
 
Upvote 0
Vì cột F của bác Nghĩa định dạng đủ kiểu hết. Nghĩa định dạng lại Date và thử code này xem
PHP:
Dim ngay As Date
ngay = CDbl(24 / 11 / 2011)
ActiveSheet.Range("$A:$F").AutoFilter Field:=6, Criteria1:=">=" & ngay, _        Operator:=xlAnd

Hình như vầy mới đúng chứ Phước:
Mã:
Sub Macro1()
Dim ngay As [COLOR=#ff0000]Double[/COLOR]
ngay = CDbl([COLOR=#ff0000]#11/24/2011#[/COLOR])
ActiveSheet.Range("$A:$F").AutoFilter Field:=6, Criteria1:=">=" & ngay
End Sub
Nếu ghi là CDbl(24 / 11 / 2011) thì coi chừng VBA nó hiểu là lấy số 24 chia cho 11 rồi chia cho 2011 đấy nhé
 
Upvote 0
Vụ này nói nhiều lần rồi, tại Nghĩa không để ý thôi
Nói chung mấy vụ Filter với điều kiện là Date thì phải ghi nhớ quy định: Chuyển Date thành Long. (nếu có cả giờ thì chuyển thành Double)
Vậy thôi

Em đang phát triển một hàm Filter và dựa vào phương thức của nó hoạt động để viết đó, dĩ nhiên em đã tham khảo hàm của Thầy rất nhiều và phần lớn dựa theo cái sườn của hàm đó, nhưng không làm bằng Dictionary. Hiện tại, tốc độ so sánh đã hơn hàm của Thầy về lọc giá trị số khoảng 250%.
 
Upvote 0
Nếu như 1 hàm (Function) phải dùng rất nhiều vòng lặp (For) và dùng nhiều thủ tục (Sub) để hỗ trợ, và tổng số hàng trong module riêng biệt chỉ phục vụ cho hàm đó lên đến 1500 dòng, nhưng kết quả đạt được chính xác, nhanh hơn những hàm khác (so với 65536 dòng dữ liệu), thì có thể dùng để thay thế các hàm khác được không?
 
Upvote 0
Nếu như 1 hàm (Function) phải dùng rất nhiều vòng lặp (For) và dùng nhiều thủ tục (Sub) để hỗ trợ, và tổng số hàng trong module riêng biệt chỉ phục vụ cho hàm đó lên đến 1500 dòng, nhưng kết quả đạt được chính xác, nhanh hơn những hàm khác (so với 65536 dòng dữ liệu), thì có thể dùng để thay thế các hàm khác được không?

Nói cái gì mà chung chung vậy? Ai mà hiểu!
 
Upvote 0
Nói cái gì mà chung chung vậy? Ai mà hiểu!

Thì trong topic này là nói về vấn đề này rồi mà Thầy, cái hàm em xây dựng gần như là dùng trong mọi trường hợp, nhưng dài dòng quá, cố gắng thử rút gọn lại nhưng kết quả lại sai trong 1 vài trường hợp, nên không thể rút gọn được nữa, vì thấy lần đầu tiên phát triển 1 hàm mà lại như bài trước mô tả, thấy ngại ghê!

Về tính hiệu quả, tốc độ thì vượt trội, nhưng về cách thể hiện lại quá nhiều thủ tục đã khiến em thấy ngại.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom