2013-11-04 105 views
7

我在Excel中使用AutoFilter和VBA時遇到了問題。Excel VBA自動篩選器不能與日期列一起工作

它適用於常規過濾器,但過濾日期列不能按預期工作。 該列被格式化爲日期,我可以手動和荒謬地過濾它,如果我運行我的代碼,它不會過濾除了當我檢查過濾器,然後只點擊確定(沒有更改應用於過濾條件),它開始過濾正確。

這裏是我的代碼:

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

任何人有一個想法?這似乎是一個常見問題,但我還沒有找到解決方案。

在此先感謝。

編輯:只需添加,當我記錄宏並運行錄製的宏時,它也不起作用。

+0

如果將日期單元格格式更改爲一般,它是否顯示一個數字? – Sam

+0

是的,正如我所說的,一切正常。應用過濾器時出現問題。因爲錄製的宏也不起作用。 – Spurious

+0

嘗試轉換爲文本。如'CDate([datecell])'更改爲'Format([datecell],「dd-MMM-yy」)' – Sam

回答

9

使用Excel VBA AutoFilter,日期可能會非常棘手。有些人發現只需循環訪問數組即可進行過濾。

有時我發現一個可以使用日期的數值,特別是與「日期之間的」

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

注意上面的需要「真正的日期」,而不是看起來字符串處理時像日期。即使是一個單一的「字符串日期」也會搞砸了。

+0

是的,儘可能早地嘗試過,它也沒有工作。這對我來說是個謎。特別是考慮到記錄的宏也不起作用。 – Spurious

+1

處理「日期之間」的另一個選項是使用Excel存儲的編號。在回答中查看我的編輯 –

+0

還有一件事要檢查,就是所有的日期都是真正的日期,而不是看起來像日期的字符串。即使列表中的單個「字符串日期」也會混淆。 –

2

你需要的格式轉換爲美國的格式,這樣的: 「>」 &格式([datecell], 「MM/DD/YYYY」) VBA不理解另一種格式。

0

Karlos Henrique, 感謝您使用Format([datecell],「mm/dd/yyyy」)。 它在我的文件中工作。 我以前的代碼是:

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

我修改後的代碼是:

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

感謝。

7

Autofilter()作品有 '通用' 格式yyyy-mm-dd,即:

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

這是更好,因爲Excel不能 '理解' 是錯誤的。如果您使用mm/dd/yyyydd/mm/yyyy Excel可以將02/jan設置爲01/feb。

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

與Excel工作規則(International Issue

  • 當你不得不數字和日期轉換爲字符串傳遞到Excel (例如在AutoFilter或.Formula字符串的條件中),對於所有數字和日期類型,始終使用Trim(Str(MyNumber))或sNumToUS()函數將數據顯式轉換爲US格式的字符串。然後,Excel將正確使用它並將其轉換爲本地號碼/日期格式。

  • 編輯:

    我們可以創建使用Application.International像通用功能:

    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

    這句法工作對我來說:

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

    通過宏註冊獲得的提示

    0

    將您的「dd-mm-yyy」與列的格式相匹配,因此如果您有「16-Aug-16」作爲源數據格式,請將過濾器設置爲「 dd-mmm-yy「

    +0

    這對我有效...我的專欄被格式化爲dd-mmmm-yyyy,並且把所有東西都扔掉了。更改標準解決了問題。 – SlowLearner