【问题标题】:VBA - how to filter a table using a dynamic date range?VBA - 如何使用动态日期范围过滤表格?
【发布时间】:2021-02-16 23:24:02
【问题描述】:

我有一个宏,它从一个工作表中提取报告,然后从另一个工作表中提取适用的数据,并将两个页面都打印到一个 PDF 文件中。它的打印到 pdf 方面正在工作,但过滤数据以匹配报告却没有。

我从定义报告的开始和结束日期开始,然后我想在打印之前根据此日期范围过滤数据工作表的第一列。

我的代码如下:

Dim StartDate as Date, EndDate as Date, DataTable as String
EndDate = ActiveSheet.Range("G6")
StartDate = ActiveSheet.Range("G5")

Worksheets("Data").Activate
DataTable = Worksheets("Data").Range("A2").CurrentRegion.Address
ActiveSheet.Range(DataTable).AutoFilter Field:=1, Criteria1:=">=" & StartDate, Operator:=xlAnd, Criteria2:="<=" & EndDate

在运行宏之前手动更改过滤器确实有效,但我希望宏自行完成。非常感谢任何建议。

【问题讨论】:

  • 你当前的代码抛出了什么错误?
  • “Range类的AutoFilter方法失败”
  • DataTable的值是多少?
  • 手动尝试,但使用宏记录器。如果您无法弄清楚,请尝试将您从宏记录器获得的代码添加到您的帖子中。
  • 首先摆脱所有那些Activate 声明。它通常会导致多个问题。在这里可能是也可能不是问题,但如果不是,它可能在未来成为一个问题。见How to avoid using Select in VBA

标签: excel vba


【解决方案1】:

在构造条件字符串时尝试将日期转换为双精度:

ActiveSheet.Range(DataTable).AutoFilter Field:=1, _
   Criteria1:=">=" & CDbl(StartDate), Operator:=xlAnd, _
   Criteria2:="<=" & CDbl(EndDate)

【讨论】:

    【解决方案2】:

    首先,请养成明确引用工作表的习惯——避免使用ActiveSheet,而是使用实际工作表名称。下面的代码使用“Sheet2”来说明这一点。代码已经过测试并且对我有用。让我知道你是怎么做的。

    Option Explicit
    Sub testFilter()
    Dim StartDate As Date, EndDate As Date
    
    StartDate = Sheets("Sheet2").Range("G5").Value2   <~~ **Change Sheet2 to your actual sheet name
    EndDate = Sheets("Sheet2").Range("G6").Value2
    
    With Sheets("Data").Range("A2").CurrentRegion
        .AutoFilter 1, ">=" & 1 * StartDate, 1, "<=" & 1 * EndDate
    End With
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2014-09-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      相关资源
      最近更新 更多