Excel VBA按日期排序

时间:2014-09-05 16:22:18

标签: excel-vba vba excel

使用搜索/过滤器用户窗体,我在尝试过滤日期时遇到问题。

当我比较日期以确定它是否包含字符串时,它似乎工作正常(我相信我在比较期间将其转换为字符串,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

1 个答案:

答案 0 :(得分:0)

非常感谢@guitarthrower,这就是我发现的:

以DATE格式格式化的单元格无法与字符串进行比较。在它旁边创建一个辅助列并将其作为字符串/文本对象进行转换,可以将搜索字符串与之比较。

以下是有效的公式:

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

这使得一列值可以通过字符串搜索,即“/ 06 /”以查找该月六日的任何日期。我使用IF构造,因此它只填充单元格,如果它不是空白的。

我将其添加到维基,社区可以进行必要的更正。