【问题标题】:Excel VBA - How to Find Last 24 Hours date from Today and YesterdayExcel VBA - 如何从今天和昨天查找最近 24 小时的日期
【发布时间】:2014-11-09 11:45:05
【问题描述】:

感谢所有为 SO 做出贡献的专家,他们帮助像我这样的新手

我收到了一个 CSV 转储文件,并要求我自动生成报告

我正在使用 Excel VBA

需要完成 16 个要求/步骤来自动生成报告 我能够完成其中的 14 个(当然在 SO 中搜索并将代码更改为我的要求!!!)

宏的最后一步涉及过滤器,我从来没有通过代码编写过过滤器,这对我来说是新的

以下是一项要求,其中涉及过滤器 经过大量搜索和调试,我能够编写以下程序 这很好用

------------------------------------------------------------------------------------------
Requirement:
    Exclude rows contains the FDN  From the column CI Group Name
------------------------------------------------------------------------------------------


        Dim DataRange               As Range
        Dim Column_Number           As Integer



                ' Find the Data Range From where in Sheet [ Working WB ], I have to Select Data
                Call UnknownRange(WorkBook_02_Name, WorkBook_02_Sheet1_Name)

                    Set DataRange = Range(Cells(FirstRow, FirstCol), Cells(LastRow, LastCol))



                        ' Set Reference to WorkBook_02
                        Set WorkBook_02 = GetWorkbookReference(WorkBook_02_Path_Office & "\" & WorkBook_02_Name)


                            ' Get the WorkSheet Name into Var
                            WorkBook_02_Sheet1_Name = WorkBook_02.Sheets(1).Name

                                With Workbooks(WorkBook_02_Name).Worksheets(WorkBook_02_Sheet1_Name)

                                    Workbooks(WorkBook_02_Name).Worksheets(WorkBook_02_Sheet1_Name).Activate

                                        ' Get the Required Column # from the Column Name
                                        Column_Number = ColumnName_To_ColumnNumber("CI")

                                            ' Remove Datum on Column [ CI ] having FDN
                                            'DataRange.RemoveDuplicates Columns:=Column_Number, Header:=xlYes


                                            'Worksheets(WorkBook_02_Sheet1_Name).AutoFilterMode = True
                                            With DataRange
                                                DataRange.AutoFilter Field:=Column_Number, Criteria1:="=*FDN*"

                                                Set ExcludeRange = DataRange.Offset(1, 0).SpecialCells(xlCellTypeVisible)

                                                    With ExcludeRange
                                                         'Remove Datum on Column [ CI ] having VDI
                                                        .EntireRow.Delete
                                                        '.Delete
                                                    End With

                                                Worksheets(WorkBook_02_Sheet1_Name).AutoFilterMode = False
                                            End With


                                End With


------------------------------------------------------------------------------------------


------------------------------------------------------------------------------------------

        ' --------------------------------------------------------
        Function ColumnName_To_ColumnNumber(ColumnName As String)
        ' --------------------------------------------------------

        '   Column Name to Column Number

            ColName = ColumnName
            Debug.Print Range(ColName & 1).Column

            ColumnName_To_ColumnNumber = Range(ColName & 1).Column

        ' --------------------------------------------------------
        End Function
        ' --------------------------------------------------------
        '
        '

------------------------------------------------------------------------------------------

请求 #1

在上面的代码中,我使用 .Activate 来激活工作表 在 SO 我读到我必须避免(.select / .activate ....) 由于我使用的工作簿只有单张,我可以避免 .Activate 在上面的代码中

但是,当我在多张工作表上工作时,如果我不使用 .Activate,我需要工作的工作表将不会获得焦点 所以我不确定如何避免 .Activate


------------------------------------------------------------------------------------------
Requirement:

Having last 24 hours date ( Yesterday 9 PM To today 9 PM) from the column F "Time Stamp"
------------------------------------------------------------------------------------------

F 列有时间戳 我应该从该列中过滤掉过去 24 小时

这是F列的示例

9/15/2014 7:33
9/15/2014 7:24
9/15/2014 7:21
9/15/2014 7:20
9/15/2014 6:43
9/15/2014 6:32
9/15/2014 6:25
9/15/2014 5:43
9/15/2014 5:30
9/15/2014 5:27
9/15/2014 4:56
9/15/2014 4:41
9/15/2014 4:28
9/15/2014 3:29
9/15/2014 3:29
9/15/2014 2:26
9/29/2014 19:22
9/29/2014 18:47
9/29/2014 18:42
9/29/2014 18:20
9/29/2014 18:05
9/29/2014 17:40
9/29/2014 17:36
9/29/2014 16:54
10/15/2014 10:07
10/15/2014 10:07
10/15/2014 10:07
10/15/2014 10:07
10/15/2014 10:07
10/15/2014 10:07

我不知道如何编码,但我正在考虑以下步骤:

步骤 #1 找出今年是什么

步骤 #2 我必须找出今天的日期和昨天的日期,将它们分配给#2 变量

步骤 #3 根据今天的日期,我必须找出该过滤器中有多少小时 如果有 24 个条目,那么我就完成了,我已经完成了所有 24 小时 条件是[昨天晚上 9 点到今天晚上 9 点]

步骤 #4 根据今天的日期,如果少于 24 个条目,那么我必须查看昨天的日期并从它开始计算直到它完成 24 小时

(或)

避免使用过滤器并使用纯 VBA 来完成上述 F 列上的 #4 步骤

请求 #2

请帮助我找到 24 小时日期,使用过滤器或任何其他方式

------------------------------------------------------------------------------------------
Below the Recorded Macro
------------------------------------------------------------------------------------------

Sub Last_24_Hours_()
'
' Last_24_Hours_ Macro
' Last_24_Hours_
'

'
    Range("A1").Select
    Selection.AutoFilter
    Application.Goto Reference:="R1C6"
    ActiveSheet.Range("$A$1:$CM$38854").AutoFilter Field:=6, Operator:= _
        xlFilterValues, Criteria2:=Array(3, "10/14/2014 10:59:48", 3, _
        "10/14/2014 11:57:37", 3, "10/14/2014 12:58:39", 3, "10/14/2014 13:59:39", 3, _
        "10/14/2014 14:59:39", 3, "10/14/2014 15:59:42", 3, "10/14/2014 16:59:44", 3, _
        "10/14/2014 17:59:43", 3, "10/14/2014 18:59:44", 3, "10/14/2014 19:59:46", 3, _
        "10/14/2014 20:59:47", 3, "10/14/2014 21:59:49", 3, "10/14/2014 22:59:51", 3, _
        "10/14/2014 23:59:52", 2, "10/15/2014")
End Sub

------------------------------------------------------------------------------------------

提前致谢,

查克里

2014 年 11 月 9 日上午 9:08 谢谢吉普德

抱歉,也不清楚。是的,有些日期在 Now() 之前。

请注意,我拥有的 CSV 转储仅包含 2014 年 10 月 15 日之前的数据。

这是我做的手动方式,从 F 列收集 24 小时:

(1) 我应用了自动过滤器。

(2) 将过滤器放在 F 列

(3) 从过滤器中,我选择 2014 年,我有 #2 个月可用 [9 月和 10 月]

(4) 在我拥有的当前转储中,2014 年 10 月 15 日有 11 个条目 [即 11 小时], 所以我选择 [ 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10 ]

(5) 所以,我得到了 10 小时,而我必须得到剩下的 24 - 11 = 13 小时,

(6) 对于剩下的 13 小时,我选择 Oct-14-2014,离开前 11 小时(因为我已经从 Oct-15-2014 开始), 并开始选择值 [ 11, 12 ,13, 14 ,15, 16, 17, 18, 19, 20, 21, 22, 23 ]

因此,根据我执行的上述手动过程,Now() 可能没有帮助(在我拥有的当前 CSV 转储中,因为最大日期是 Oct-15 和 Oct-14)

但是,您提供的代码对我获得的最新转储非常有帮助

那么,如何对上述手动程序进行编码以获取从 10 月 15 日到 10 月 14 日的 24 小时

另外,在您的代码中,我不确定是否遵循时间因素 [(昨天晚上 9 点到今天晚上 9 点)]

谢谢 查克里

【问题讨论】:

  • @Jeeped,我编辑了我的帖子,解释了我为获得 24 小时所做的手动程序。如果我清楚地解释我想要完成的事情,请告诉我
  • 嗨,一旦我将自动过滤器应用到 F 列,其中包含 DateTime 格式的数据 [10/14/2014 23:59:52],是否有任何选项或代码可以找到最后一个过滤器列表中的条目,或者是否有一个选项可以从过滤的数据中找出最后 #2 天,即今天和昨天。谢谢查克里

标签: excel vba


【解决方案1】:

这个简短的 sn-p 可能足以让您开始使用 .AutoFilter 属性。

Dim rFilteredCells As Range, lCountFilteredCells As Long
If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilterMode = False
With ActiveSheet.Cells(1, 1).CurrentRegion
    .AutoFilter
    .AutoFilter Field:=6, Criteria1:= _
        ">=" & (Now - 1), Operator:=xlAnd, Criteria2:="<=" & Now
    'get a count of the visible cells
    lCountFilteredCells = Application.Subtotal(102, .Columns("F"))
    Debug.Print lCountFilteredCells
    'set a range object to the filtered cells
    Set rFilteredCells = .Offset(1, 6).Resize(.Rows.Count - 1, 1).SpecialCells(xlCellTypeVisible)
    Debug.Print rFilteredCells.Address(0, 0)
    Set rFilteredCells = Nothing
    'turn .AutoFilter off
    .AutoFilter
End With

在为 24 小时内的日期时间过滤列 F 之后,我展示了一些快速计算可见日期时间并将范围对象设置为仅可见(即 过滤)单元格的方法。

尚不清楚您是否有可能在现在之后的日期,但我使用了严格的 24 小时“窗口”。

【讨论】: