首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用vba对excel范围进行数据筛选不起作用。

使用vba对excel范围进行数据筛选不起作用。
EN

Stack Overflow用户
提问于 2022-06-02 07:08:48
回答 1查看 53关注 0票数 1

我正尝试使用vba在excel中的日期范围之间进行筛选。它不起作用。

但是,当我执行手动过滤器时,它可以工作。所以我记录了宏并应用了相同的代码。再说一次,这是行不通的。

文件中的日期格式如下:

比方说,我正试图从2021年7月1日至31日过滤掉。

下面是不起作用的代码:日期在A列中。

代码语言:javascript
复制
startDT = ActiveSheet.txtStartDT.Text   '01-Jul-2021
endDT = ActiveSheet.txtEndDT.Text    '31-Jul-2021

For Each srcWsht In srcWbk.Worksheets
            lastSrcRow = srcWsht.Range("A1").End(xlDown).Row
                        
            srcWsht.Range("A2:A" & lastSrcRow).Replace What:="'", Replacement:="", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
            srcWsht.Range("A2:A" & lastSrcRow).NumberFormat = "dd-MM-yyyy"
            
            srcWsht.Range("A1:O" & lastSrcRow).AutoFilter Field:=1, Criteria1:=">=" & CDate(startDT), Operator:=xlAnd, Criteria2:="<=" & CDate(endDT), visibledropdown:=True
                 
            
            srcWsht.Range("A2:O" & lastSrcRow).SpecialCells(xlCellTypeVisible).Copy
            
            wshtData.Range("A" & lastDataRow).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
            lastDataRow = wshtData.Range("A2").End(xlDown).Row + 1
            
Next srcWsht
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-02 07:23:00

筛选器需要一个数字值来筛选。但是,如果您像在String中一样将一个Date连接在一起,它将隐式地将您的数字日期转换为一个字符串来连接它。取决于您在操作系统中设置的默认日期格式(我的是yyyy-mm-dd),这将导致类似于">=2021-07-01"的结果,它不被认为是日期,而是要计算的公式,它将从2021中减去0701,而过滤器执行的>=2013不是您想要的。

因此,通过将Date转换为像CDbl(CDate(startDT))一样的Double,您可以将date 2021-07-01转换为44378,这是存储在单元格中的日期的实际数值。现在您的过滤器执行>=44378,这将工作

代码语言:javascript
复制
srcWsht.Range("A1:O" & lastSrcRow).AutoFilter Field:=1, Criteria1:=">=" & CDbl(CDate(startDT)), Operator:=xlAnd, Criteria2:="<=" & CDbl(CDate(endDT)), visibledropdown:=True

注意,如果以Strings开头,则值为' (类似日期的文本)。如果现在删除该',Excel将将它们转换为数字日期(以便您可以计算和过滤它们)。但Excel猜测格式。因此,如果它们是dd-MMM-yyyy,Excel非常清楚它是哪种格式,并且会正确地猜测,但是要小心使用像01/05/2022这样的字符串,其中Excel无法知道这是dd/mm/yyyy还是mm/dd/yyyy。如果您让Excel转换,这是一个50/50的机会,使它的错误或正确!

如果是这种情况,则需要将看起来类似日期的字符串拆分为日、月和年,并使用DateSerial(Year, Month, Day)将其转换为真正的数字日期。这样您就可以定义您的字符串是哪种格式的dd/mm/yyyymm/dd/yyyy,并且不要让mm/dd/yyyy猜测(并且可能想错了)。

如果您的月份名称是英语01-May-2021,但是您在另一个本地化系统中工作(就像我在德语中所做的那样),您可能也需要这样做。因为德国Excel不知道如何将May转换为一个月,因为在德语中它是Mai。所以Excel不能自动地转换它,你也需要用你自己的函数进行拆分和转换(否则它只能在英语中发挥出色的作用)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72472031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档