使用搜索/过滤器用户窗体,我在尝试过滤日期时遇到问题。
当我比较日期以确定它是否包含字符串时,它似乎工作正常(我相信我在比较期间将其转换为字符串,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 :(得分:0)
非常感谢@guitarthrower,这就是我发现的:
以DATE格式格式化的单元格无法与字符串进行比较。在它旁边创建一个辅助列并将其作为字符串/文本对象进行转换,可以将搜索字符串与之比较。
以下是有效的公式:
=IF(D2<>"",TEXT(D2, "mm/dd/yyyy"), "")
这使得一列值可以通过字符串搜索,即“/ 06 /”以查找该月六日的任何日期。我使用IF构造,因此它只填充单元格,如果它不是空白的。
我将其添加到维基,社区可以进行必要的更正。