2014-09-05 543 views
0

處理Search/Filter用戶窗體,並且在嘗試過濾日期時遇到問題。Excel VBA按日期排序

當我比較一個日期以確定它是否包含一個字符串時,它似乎工作得很好(我相信我在比較過程中將它轉換爲字符串,fwiw)。當它需要按日期列進行篩選時,它不會識別包含給定字符串的行並從工作表中刪除所有內容。

實施例:

過濾字符串:6/

Date entries: 6/15/1956 
       4/3/1971 
       10/13/1960 
       2/16/1983 

我想要顯示線1和4中,因爲它們含有(默認情況下,通配符(*)被放置在每一側上)「 6 /「

我意識到date對象實際上是一個排序數組;這就是爲什麼我有問題嗎?我能用普通的自動過濾器不能做到我想要的嗎?按日期列排序時,是否需要製作特殊情況?是否適用於其他數據類型(金錢,時間等)?

感謝

參考

過濾代碼(如果變量沒有聲明,它們是全球或垃圾變量)

Private Sub Filter_CommandButton_Click() 
    'Filters by a text input and a column to filter 
    Dim isInCol As Boolean 
    Dim sortKey As String 
    Dim sortOrder As XlSortOrder 
    Dim currentData As Range 
    Dim sortField As Integer ' This is the offset, determined by list index 

    If filterColumn Is Nothing Then 
     gojira = MsgBox("You need to enter a column to filter", vbOKOnly) 
     Exit Sub 
    End If 

    ' setting active sheet complete data 
    Set currentData = ActiveSheet.UsedRange 

    ' make sort key a wildcard 
    If include = True Then 
     sortKey = "*" & filterText & "*" 
    Else ' for excluding the entered text 
     sortKey = "<>" & "*" & filterText & "*" 
    End If 

    ' find list index for sorting 
    sortField = Me.ColumnFilter_ComboBox.ListIndex + 1 

    ' populate sort order with value of Ascend/Descend options. 
    If descend Then 
     sortOrder = xlDescending 
    Else 
     sortOrder = xlAscending 
    End If 

    ' Search column to see if text exists 
    isInCol = False 
    For Each foo In filterColumn 
     If caseSense Then 
      If InStr(foo.Value, filterText) Then ' > 0 Then 
       isInCol = True 
       Exit For 
      End If 
     ElseIf Not caseSense Then 
      If InStr(LCase(foo.Value), LCase(filterText)) Then 
       isInCol = True 
       Exit For 
      End If 
     End If 
    Next foo 

    If isInCol Then ' filter the table by the selected col; Use Range Sort 
     With ActiveSheet 
      currentData.AutoFilter Field:=sortField, Criteria1:=sortKey, VisibleDropDown:=False 
      currentData.Sort key1:=filterColumn, Order1:=sortOrder, Header:=xlYes 
     End With 
    End If 

    blah = bleh 
End Sub 
+0

我認爲問題是如果你的日期真的格式化爲表中的日期。這意味着它們以數字形式存儲。因此'6/15/1956'被存儲爲'20621'。如果是這樣的話,你永遠不會在日期中找到'6 /'。 – guitarthrower 2014-09-05 21:05:30

+0

是的,它們被格式化爲日期。所以這聽起來像我是SOL。如果沒有其他選項,那麼謝謝你的嘗試。 – JSM 2014-09-05 22:44:18

+0

如果你能夠創建一個幫手列,那麼你仍然可以使它工作。幫助者列可以像'=「_」&B2'(如果B2是日期所在的地方)並且將其複製下來。然後,您可以執行您在助手列中描述的操作。 – guitarthrower 2014-09-05 23:11:44

回答

0

所以感謝@guitarthrower,這是我發現:

格式爲DATE格式的單元格不能與字符串進行比較。在它旁邊創建一個幫助器列並將其轉換爲字符串/文本對象,可以將搜索字符串與該字符串進行比較。

這裏是工作的公式:

=IF(D2<>"",TEXT(D2, "mm/dd/yyyy"), "") 

這使得一列值,人們可以通過一個搜索字符串,即「/ 06 /」找上了本月第六的任何日期。我使用了IF構造,所以它只填充單元格,如果它不是空白的。

我將它添加到wiki中,社區可以進行必要的更正。