Excel 如何筛选出所有超过3个月的日期,参照当前日期

Excel 如何筛选出所有超过3个月的日期,参照当前日期,excel,vba,Excel,Vba,我想过滤超过3个月的日期,我想有一个系统变量 Dim Date3M_ago As Date Date3M_ago = Worksheets("Engine").Range("C1") Selection.AutoFilter ActiveSheet.Range("A:C").AutoFilter Field:=46, Operator:= _ xlFilterValues, Criteria1:= Date3M_ago “工作表(“引擎”)。范围(“C1”)是我的公式所在的单元格,其中显示了3

我想过滤超过3个月的日期,我想有一个系统变量

Dim Date3M_ago As Date
Date3M_ago = Worksheets("Engine").Range("C1")
Selection.AutoFilter
ActiveSheet.Range("A:C").AutoFilter Field:=46, Operator:= _
xlFilterValues, Criteria1:= Date3M_ago
工作表(“引擎”)。范围(“C1”)
是我的公式所在的单元格,其中显示了3个月前的日期,引用了当前日期


问题是我无法编写
标准1:=
,因为它会给我错误。正确的语法应该是
criteria1:=“<8/28/2019”
,但这是一个固定的日期,我不需要它。

您可以试试这个:

Dim Date3M_ago As Date

Date3M_ago = Worksheets("Engine").Range("C1")

ActiveSheet.UsedRange.AutoFilter Field:=46, Criteria1:="<" & Date3M_ago, Operator:=xlAnd
Dim Date 3M_之前作为日期
Date3M_ago=工作表(“引擎”)。范围(“C1”)

ActiveSheet.UsedRange.AutoFilter字段:=46,标准1:=“希望这里的内容对您有用:

你说你需要过滤掉比今天早三个月的日期(这是你在
工作表(“引擎”).Range(“C1”)
中的公式所做的。同样可以通过VBA和
应用程序.WorksheetFunction.EDate(日期,-3)完成
,甚至按照@Plutian的回答添加日期。如果这不是您的意图,您可以在其位置再次引用您自己的变量,但请确保将其转换为双精度值,以便在过滤器中使用>
CDbl(Date3M_前)

  • 为什么我们要将其转换为双精度?根据您的Windows区域设置,使用日期作为标准可能会给您带来意外的结果。根据链接,解决方法之一是使用长变量,但是使用双精度变量将使用小数,因此在我的选项中使用
    CDbl
    来计算日期是省钱的-时间值
如果我们使用以下示例数据(日期格式为“d-m-yyyy”)将上述内容付诸实践:

要在C列上筛选的代码如下所示:

Sub Test()

Dim Date3M_ago As Date
Date3M_ago = Worksheets("Engine").Range("F1")
With ThisWorkbook.Sheets("Sheet1") 'Change accordingly
    'All options below will work, remove the lines you don't want to use:
    .Range("A:C").AutoFilter Field:=3, Criteria1:=">" & Application.WorksheetFunction.EDate(Date, -3)
    .Range("A:C").AutoFilter Field:=3, Criteria1:=">" & CDbl(DateAdd("m", -3, Date))
    .Range("A:C").AutoFilter Field:=3, Criteria1:=">" & CDbl(Worksheets("Engine").Range("F1"))
    .Range("A:C").AutoFilter Field:=3, Criteria1:=">" & CDbl(Date3M_ago)
End With

End Sub
请注意要过滤的字段如何在要过滤的范围内,例如:第三列?输出如下:

Sub Test()

Dim Date3M_ago As Date
Date3M_ago = Worksheets("Engine").Range("F1")
With ThisWorkbook.Sheets("Sheet1") 'Change accordingly
    'All options below will work, remove the lines you don't want to use:
    .Range("A:C").AutoFilter Field:=3, Criteria1:=">" & Application.WorksheetFunction.EDate(Date, -3)
    .Range("A:C").AutoFilter Field:=3, Criteria1:=">" & CDbl(DateAdd("m", -3, Date))
    .Range("A:C").AutoFilter Field:=3, Criteria1:=">" & CDbl(Worksheets("Engine").Range("F1"))
    .Range("A:C").AutoFilter Field:=3, Criteria1:=">" & CDbl(Date3M_ago)
End With

End Sub

自动筛选无法应用于您尝试自动筛选范围之外的列。在您的示例中,您尝试在(
字段:=46
)处筛选列,但仅应用从列a到C的范围。请将列AT应用于您的自动筛选,如下所示:

ActiveSheet.Range("A:AT").AutoFilter Field:=46, Operator:= _
或将您的字段更改为包含在范围内的字段:

ActiveSheet.Range("A:C").AutoFilter Field:=3, Operator:= _
还有一项建议,请使用vba计算替换对30天前填写日期的单元格的引用,以防止中断:

Date3M_ago = DateAdd("m", -3, Now)

可以对第46列进行自动筛选,但只能尝试对A:C列进行自动筛选。根据定义,在排除应用自动筛选的列时,无法应用自动筛选。包括(最多)列,或者将要筛选的字段设置为范围内的字段。有趣的是,虽然
DateAdd
返回日期值,但它并不总是作为条件中的变量工作(我想这取决于Windows区域设置)。要使其工作,可以将其包装为
CDbl
Criteria1:=“>”&CDbl(DateAdd(“M”,-3,Date))
.Futhermore+1使用
DateAdd
:)感谢JvdV,知道这一点确实很有意思。我可能会在即将到来的项目中使用它,因为我会经常使用autofilter。在这种情况下,CDate是否可以作为CDbl的替代品?不,它不会。这甚至意味着过度杀戮,因为
DateAdd
会自己返回一个日期。检查我在回答中提供的链接,为了更好地理解为什么筛选不适用于日期变量。这很公平。正如我所说的,只是尝试学习,因为我以后可能会用到它。谢谢!您尝试过这个吗?根据您的设置,这可能会给您带来意想不到的结果(就像在我这方面所做的那样)还有一个问题,先生,在我结束之前。我如何使字段区域变为变量?我想每天搜索一个名称吗time@hunter,您可以应用一个变量,而不是
字段:=3
。例如,它会变成类似
字段:=X
。现在您可以使用
范围(“a:C”)分配任意数量的列
,因此对于X变量而言,这意味着1、2或3。如果需要增加范围,可以这样做并分配其他列。