Excel VBA - 如何查找今天和昨天的过去24小时日期

时间:2014-11-08 09:40:08

标签: excel vba

感谢所有为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年9月9日上午9:08 谢谢Jeeped

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

请注意,我的CSV转储包含数据,直至2014年10月15日。

以下是手动方式,从F栏收集24小时:

(1)我申请Autofilter。

(2)将过滤器放在F列上

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

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

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

(6)剩余的13个小时,我选择,2014年10月14日,离开前11个小时(因为我已经从2014年10月15日开始),      并开始选择值[11,12,13,14,15,16,17,18,19,20,21,22,23]

所以,从我上面的手册程序来看,Now()可能没有帮助(在我当前的CSV转储中,因为Max的日期是10月15日和10月14日)

但是,您提供的代码对我得到的最新转储非常有用

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

此外,在您的代码中,我不确定是否遵循时间因素[(昨天下午9点至今天下午9点)]

由于 琳

1 个答案:

答案 0 :(得分:0)

这个简短的代码段可能足以让您开始使用.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列的日期时间之后,我已经展示了一些快速计算可见日期时间并将范围对象设置为仅可见(即过滤)单元格的方法。 / p>

目前还不完全清楚您是否有 Now 之后的日期,但我已经使用了严格的24小时窗口&#39;。