【发布时间】: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 天,即今天和昨天。谢谢查克里