2014-09-05 545 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中,社区可以进行必要的更正。