您能帮我清除这段代码吗?
我正在尝试过滤掉某些日期,如果看不到任何单元格,则不要执行代码。
由于某种原因,我无法使IF
正常工作。
Dim EndDate1, StartDate1 As Long
Dim todayDate1 As Long
Sheets("Macro").Select
todayDate1 = Sheets("Macro").Cells(2, 2)
Sheets("FTC").Select
StartDate1 = DateSerial(Year(todayDate1),Month(todayDate1),Day(todayDate1) + 14)
EndDate1 = DateSerial(Year(todayDate1), Month(todayDate1), Day(todayDate1) + 21)
ActiveSheet.Range("$A$1:$AP$1000").AutoFilter Field:=24, _
Criteria1:=">=" & StartDate1, Operator:=xlAnd, Criteria2:="<" & EndDate1
Range("A2:A1000").Select
Selection.SpecialCells(xlCellTypeVisible).Select
If Selection.SpecialCells(xlCellTypeVisible).Count > 1 Then
MsgBox "Nope"
End If
MsgBox "Yay"
答案 0 :(得分:0)
您的代码有许多小问题,但是您的问题写得很好,并且您所做的努力是在正确的轨道上进行的(我们都必须从某个地方开始),因此对此表示敬意!
我认为这是您要尝试执行的操作:
Sub FilterDemo()
Const filterField = 24
Dim ws As Worksheet: Set ws = Sheets("Macro")
Dim filterRange As Range: Set filterRange = ws.Range("A:AP")
Dim dtStart As Date, dtEnd As Date, visibleRows As Long
'assuming you want to use "today's date"? (returned by function [Date])
dtStart = Date + 14
dtEnd = Date + 21
filterRange.AutoFilter Field:=1 'clear existing filter
filterRange.AutoFilter Field:=filterField, _
Criteria1:=">=" & Format(dtStart, "yyyy-MM-dd"), _
Criteria2:="<=" & Format(dtEnd, "yyyy-MM-dd")
visibleRows=ws.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible) _
.Cells.Count - 1
If visibleRows = 0 Then
filterRange.AutoFilter Field:=1 'remove filter
MsgBox "No data found between " & dtStart & " and " & dtEnd & ".", _
vbExclamation, "No Data Found"
Else
MsgBox visibleRows &" items between" & dtStart &" and "& dtEnd & ".", _
vbInformation, "Data found!"
End If
End Sub
很高兴您declared使用变量-但最好将日期声明为data type Date
。 Excel确实在内部将日期存储为数字(尽管不是整数),但是仍然最好将变量声明为Date
,然后让Excel找出其余的变量。
由于我们使用的是正确的Date
日期类型,因此我们可以简单地相互增加天数(而不是使用DateSerial
)。 (More about dates。)
您声明了StartDate1 As Long
,但没有声明EndDate1
:您可以可以在一行上声明多个变量,但是如果没有指定类型,则默认到Variant
。
我假设单元格B2
仅保留了 current 日期? —如果是这样,请改用VBA the Date
function。
在将日期作为参数传递时,最好以Format
可以理解的方式AutoFilter来日期,它们也可以转换为String。
可能也可以像Criteria1:=">=" & dtStart, Criteria2:="<=" & dtEnd
一样工作,但是正确的方法要做的是将其转换为字符串,因为这就是{{3} }正在期待。
AutoFilters' criteria(在Select
statements时应“整理”)。例如, this :
Range("A2:A1000").Select
Selection.SpecialCells(xlCellTypeVisible).Select
If Selection.SpecialCells(xlCellTypeVisible).Count > 1 Then
...成为 this :
If Range("A2:A1000").SpecialCells(xlCellTypeVisible).Count > 1 Then
通过指定范围A1:AP1000
,How to avoid using Select in Excel VBA将对 all 的所有行进行计数,最多不超过1000,仅扣除过滤器隐藏的行数。
我指的是整个列,而不是指定任意的行集。自动筛选器“创建”它正在使用的一系列单元格,我们可以像这样的表达式进行引用:(从Count
Property借来)
ws.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count
当试图找出像这样的长表达式时,从右到左阅读(或出于说明目的,颠倒!)很有帮助
接下来,您的here或我的{strong>不正确在自动过滤条件中,具体取决于您日期列中的值是否次附加。
您的代码示例使用>=StartDate and <EndDate
您的排除了{strong>午夜
EndDate
上的值。但是,如果没有没有时间,那么您的时间将排除EndDate
的“全天”。如果有时间限制,那么您在11:59:59pm
前一天最多包含EndDate
。
我的代码示例使用>=StartDate and <=EndDate
。
我的在
EndDate
上包括了午夜的值,如果数据没有附加时间,则整个EndDate
为包括在内。查询时间多个日期范围以防止重叠时,Yours是正确的使用方式。 (operators。)
最后(主要是装饰性的),请注意,无论MsgBox "Yay"
是否出现,您的MsgBox "Nope"
都会出现。
使用Exit Sub
与Else
语句一起使用If
,可以避免使用{{1}}(立即结束该过程),或。 (More about date/times。)
希望这很有道理...祝您好运!