2013-11-04 32 views
7

Tôi gặp sự cố khi sử dụng Tự lọc với VBA trong Excel.Bộ lọc tự động Excel VBA không hoạt động với cột Ngày

Nó hoạt động tốt cho các bộ lọc thông thường, nhưng việc lọc cột ngày không hoạt động như dự định. Cột được định dạng là ngày, tôi có thể lọc theo cách thủ công và vô lý, nếu tôi chạy mã của mình, nó sẽ không lọc gì nhưng khi tôi kiểm tra bộ lọc và sau đó chỉ nhấp ok (không thay đổi được áp dụng cho tiêu chí lọc), nó bắt đầu lọc đúng.

Đây là mã của tôi:

ws.ListObjects(SheetName).Range.AutoFilter Field:=3, Criteria1 _ 
     :=">" & CDate([datecell]), Operator:=xlAnd, Criteria2:= _ 
     "<=" & CDate(WorksheetFunction.EoMonth([datecell], 3)) 

Bất cứ ai có một ý tưởng? Nó có vẻ là một vấn đề phổ biến, nhưng tôi đã không tìm thấy một giải pháp.

Xin cảm ơn trước.

Chỉnh sửa: Chỉ cần thêm, khi tôi macro ghi lại và chạy macro đã ghi, nó cũng không hoạt động.

+0

Nếu bạn thay đổi định dạng ô ngày thành định dạng chung, nó có hiển thị một số không? – Sam

+0

Vâng, như tôi đã nói, mọi thứ đều hoạt động như mong muốn. Đã xảy ra sự cố khi bộ lọc được áp dụng. Vì macro đã ghi cũng không hoạt động. – Spurious

+0

Thử chuyển sang văn bản để thay thế. chẳng hạn như 'CDate ([datecell])' thay đổi thành 'Định dạng ([datecell]," dd-MMM-yy ")' – Sam

Trả lời

9

Ngày có thể phức tạp với Excel VBA AutoFilter. Một số tìm thấy nó dễ dàng hơn để chỉ lặp qua mảng được lọc.

Đôi khi tôi đã phát hiện ra rằng người ta có thể sử dụng các giá trị số của ngày, đặc biệt là khi đối phó với "ngày giữa"

Criteria1:= ">" & CDbl([datecell]) 
Criteria2:= "<=" & CDbl(WorksheetFunction.EoMonth([datecell], 3)) 

Lưu ý rằng cần phải ở trên là "ngày thực" và không dây trông như ngày tháng. Ngay cả một "chuỗi ngày" duy nhất sẽ gây rối mọi thứ.

+0

Vâng, hãy thử điều đó sớm hơn và nó cũng không hoạt động. Đó là một bí ẩn đối với tôi. Đặc biệt với thực tế là macro đã ghi không hoạt động. – Spurious

+1

Một tùy chọn khác, khi xử lý "ngày giữa", là sử dụng số được lưu trữ của Excel. Xem Chỉnh sửa của tôi trong câu trả lời –

+0

Một điều khác cần kiểm tra là tất cả các ngày của bạn thực sự là ngày và không phải là chuỗi xảy ra giống như ngày tháng. Ngay cả một "chuỗi ngày" duy nhất trong danh sách sẽ gây rối mọi thứ. –

2

bạn cần phải chuyển đổi định dạng sang định dạng american, như: ">" & Format ([datecell], "mm/dd/yyyy") VBA không hiểu định dạng khác.

0

Karlos Henrique, Cảm ơn bạn đã đề xuất Định dạng ([datecell], "mm/dd/yyyy"). Nó hoạt động trong tệp của tôi. mã trước đó của tôi là:

Range("A1:D" & Trim(Str(LstRec))).AutoFilter Field:=2, _ 
    Criteria1:=">=" & StrtDt, _ 
    Operator:=xlAnd, _ 
    Criteria2:="<=" & EndDt 

mã sửa đổi của tôi là:

Range("A1:D" & Trim(Str(LstRec))).AutoFilter Field:=2, _ 
    Criteria1:=">=" & Format(StrtDt, "mm/dd/yyyy"), _ 
    Operator:=xlAnd, _ 
    Criteria2:="<=" & Format(EndDt, "mm/dd/yyyy") 

Cảm ơn.

7

Autofilter() làm việc với định dạng 'phổ thông' yyyy-mm-dd, tức là .:

Criteria1:= ">" & Format([MY_DATE],"yyyy-mm-dd") 
Criteria2:= "<=" & Format([MY_DATE],"yyyy-mm-dd") 

Đó là tốt hơn bởi vì Excel không thể 'hiểu' sai. Nếu bạn sử dụng mm/dd/yyyy hoặc dd/mm/yyyy Excel có thể phù hợp với 02/tháng một là 01/feb.

see: http://www.oaltd.co.uk/ExcelProgRef/Ch22/ProgRefCh22.htm

Các quy tắc để làm việc với Excel (International Issue)

  1. Khi bạn phải chuyển đổi số và ngày tháng để dây cho đi sang Excel (chẳng hạn như trong tiêu chí cho chuỗi Tự lọc hoặc .Formula), luôn chuyển đổi rõ ràng dữ liệu sang chuỗi được định dạng của Hoa Kỳ, sử dụng hàm Trim (Str (MyNumber)) hoặc hàm sNumToUS() được hiển thị trước đó cho tất cả các loại ngày và số.Excel sau đó sẽ sử dụng nó một cách chính xác và chuyển nó sang định dạng số/ngày tháng địa phương.

Edit:

Chúng ta có thể tạo ra một chức năng phổ biến sử dụng Application.International như:

Sub MySub() 
    Select Case application.International(xlDateOrder) 
     Case Is = 0 
      dtFormat = "mm/dd/yyyy" 
     Case Is = 1 
      dtFormat = "dd/mm/yyyy" 
     Case Is = 2 
      dtFormat = "yyyy/mm/dd" 
     Case Else 
      dtFormat = "Error" 
    End Select 

    Debug.Print (dtFormat) 

    ... 
    Criteria1:= ">" & Format([MY_DATE],dtFormat) 
    Criteria2:= "<=" & Format([MY_DATE],dtFormat) 
    ... 

End Sub 
1

Cú pháp này làm việc cho tôi:

.AutoFilter Field:=2, Operator:=xlFilterValues, Criteria2:=Array(2, Format(Now, "yyyy-mm-dd")) 

Gợi ý thu được thông qua đăng ký macro

0

So khớp "dd-mm-yyy" của bạn với định dạng cột, vì vậy nếu bạn có định dạng dữ liệu nguồn "16-Aug-16" thì hãy đặt bộ lọc là " dd-mmm-yy "

+0

Điều này làm việc cho tôi ...cột của tôi đã được định dạng là dd-mmmm-yyyy và đã ném mọi thứ ra. Thay đổi tiêu chí đã khắc phục vấn đề. – SlowLearner

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