【问题标题】:Filtering 7 dates from current date (with missing dates in-between)从当前日期过滤 7 个日期(中间缺少日期)
【发布时间】:2018-01-25 07:27:04
【问题描述】:

我是 VBA 的初学者,我需要编写一个列,其中我必须从当前日期起 7 天取消勾选。我一直在使用用户 LR42 的这段代码

    selMonth = Format(DateSerial(Year(Date), Month(Date), Day(Date) - 7),   _
                  "m/d/yyyy")

    With Sheet1 '/* change to your actual sheet */
    '/* reference last row to column A */
    lr = .Range("A" & .Rows.Count).End(xlUp).Row
    Set myRange = .Range("A1:AY" & lr)
    myRange.AutoFilter 1, "<=" & selMonth

它确实从我的数据中取消了 7 天。但是,有时问题是,数据看起来像这样:

Jan 16
Jan 17
Jan 18
Jan 19
Jan 20
**no Jan 21**
Jan 22
**no Jan 23**
Jan 24

今天的日期是 1 月 24 日。当前日期 - 7 天是 1 月 18 日。我希望代码取消勾选 7 天(包括当前日期),同时考虑到这些日期中可能缺少日期这一事实。如果我要手动取消勾选它,我会在 1 月 16 日之前取消勾选。但是,根据上面的数据,代码只会在 1 月 18 日之前取消勾选(同时跳过没有 1 月 23 日和 21 日的事实) .

我应该如何对其进行编码,以使代码还考虑到这 7 天内可能缺少日期这一事实?

【问题讨论】:

  • 您的意思是取消最后 7 个数据点的勾选(您的示例中的所有内容)?因此,如果还有 1 月 15 日,那么除了 1 月 15 日之外的所有内容都会取消勾选?
  • 可以重复日期吗?如果没有,您可以按日期排序并偏移 -7 以获得用于您的条件的日期。
  • 是的!取消勾选最后 7 个数据点。更正了当前日期(应为 1 月 24 日)。是的,除了 1 月 15 日(考虑到有空白日期)之外,所有内容都不会勾选。不,不会有任何重复的日期。你怎么编码?我是 VBA 的初学者,很遗憾
  • 今天的日期会出现吗?如果是这样,你会取消今天的日期吗?
  • 是的,如果我使用从 1 月 25 日提取的数据,我也会取消勾选今天的日期(1 月 25 日)直到 1 月 19 日。上面的示例是昨天提取的数据。

标签: vba excel


【解决方案1】:

我正在努力针对美国格式的日期进行测试,但请尝试以下设置。假设您的数据设置为一个名为 Table1 的 Excel 表,并且它有一个名为 Date 的列(在 A 列中),正在对其进行排序,并且日期没有重复。

注意:Ctrl + T 在数据范围的填充单元格中,将数据范围转换为 Excel 中的表格

Option Explicit

Sub FilterData()

    Dim wb As Workbook
    Dim ws As Worksheet

    Set wb = ThisWorkbook
    Set ws = wb.Worksheets("Sheet1")

    Dim sourceTable As ListObject

    Set sourceTable = ws.ListObjects("Table1")

    Dim cutOffDate As Date
    cutOffDate = CDate(ws.Range("A" & Split(Split(sourceTable.DataBodyRange.Address, ":")(1), "$")(2)).Offset(-7, 0).Value2)

    With sourceTable.Sort
        .SortFields.Clear
        .SortFields.Add _
        Key:=Range("Table1[[#All],[Date]]"), SortOn:=xlSortOnValues, Order:= _
        xlAscending, DataOption:=xlSortNormal
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

    sourceTable.Range.AutoFilter Field:=1, Criteria1:="<" & cutOffDate, Operator:=xlAnd

End Sub

以表格为例:

对于非美国日期格式语言环境:如果您遇到不同日期格式(即非美国格式)导致过滤器功能不正确的问题,您可以尝试@Ron Rosenfeld 的建议,基本上将变量作为 Long 或 Double 传递避免内部转换:

例如

Dim cutOffDate As Long
cutOffDate = ws.Range("A" & Split(Split(sourceTable.DataBodyRange.Address, ":")(1), "$")(2)).Offset(-7, 0).Value2

【讨论】:

  • 我在这一行得到 运行时错误 9: 下标超出范围: Set sourceTable = ws.ListObjects("Table1") 我用过 Ctrl + T在我的日期栏
  • 啊。我只在日期列上使用了 Ctrl + T。现在它通过了 Set sourceTable 行,但我有另一个错误。 运行时错误 1004:.SortFields.Add _ Key:=Range("Table1[[#All],[Date]]") 中的对象 '_Global' 的方法 'Range' 失败, SortOn:=xlSortOnValues, Order:= _ xlAscending, DataOption:=xlSortNormal
  • 错误 1004 位于:` .SortFields.Add _ Key:=Range("Table1[[#All],[Date]]"), SortOn:=xlSortOnValues, Order:= _ xlAscending , DataOption:=xlSortNormal` 如果有帮助,日期列在 A 列中
  • 现在可以了。更改了 myDateColumnName。但它只排列日期从最旧到最新。 1 月 24 日及之后的日期仍然可见
  • 非常感谢您抽出宝贵时间。我非常感谢它
猜你喜欢
  • 2018-08-18
  • 2016-05-17
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多