如何使Excel过滤宏正确使用日期区域设置?

时间:2014-03-07 17:45:08

标签: excel vba date excel-vba

我发现宏代码(对我的来源道歉,我无法找到我从哪里得到)进行一些过滤并修改它以包含日期范围。以下是代码段:

Dim wb1 As Workbook, wb2 As Workbook
Dim ws1 As Worksheet, ws2 As Worksheet
Dim copyFrom As Range
Dim lRow As Long '<~~ Not Integer. Might give you error in higher versions of excel
Dim strSearch As String
Dim startDate As Date
Dim endDate As Date

Set wb1 = ThisWorkbook
Set ws1 = wb1.Worksheets("Data")

strSearch = Range("client").Value
startDate = Range("start_date").Value
endDate = Range("end_date").Value

With ws1
    '~~> Remove any filters
    .AutoFilterMode = False
    lRow = .Range("A" & .Rows.Count).End(xlUp).Row
    With .Range("A1:C" & lRow)
        .AutoFilter Field:=1, Criteria1:="=*" & strSearch & "*"
        .AutoFilter Field:=3, Criteria1:=">=" & startDate, Operator:=xlAnd, Criteria2:="<" & endDate
        Set copyFrom = .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow
    End With
    '~~> Remove any filters
    '.AutoFilterMode = False
End With

我想要过滤的日期范围是今年2月1日到2月28日。当我单步执行代码并粘贴'start_date'变量时,它显示的日期为1月2日的,其中在电子表格中, 2月1日(这是电子表格中的内容。当我查看它创建的过滤器时,它会正确地输入结束日期,但开始日期是1月2日。

我该如何使这项工作?我的语言环境(明智地)首先从最小的日期单位开始,即日,月,年。 Excel偏向于月,日,年。

1 个答案:

答案 0 :(得分:2)

代码行之后:

startDate = Range("start_date").Value

我希望你插入:

MsgBox startDate & vbCrLf & Range("start_date").Value & vbCrLf & Range("start_date").Text

你看到了什么??

修改

根据我们的实验,我们可以强制 VBA 正确解释日期。我放置文本字符串:

28/2/2014

在单元格 D9 中运行:

Sub DoWhatsRight()
    Dim s As String, d As Date
    s = Range("D9").Text
    ary = Split(s, "/")
    d = DateSerial(ary(2), ary(1), ary(0))
    MsgBox d
End Sub

基本上,强制宏来解释我想要的字符串!

这只是一种解决方法..............我不明白为什么 VBA 会表现不佳。