单元格不为空时的IF语句

时间:2018-07-26 10:43:20

标签: excel vba if-statement count visible

您能帮我清除这段代码吗?

我正在尝试过滤掉某些日期,如果看不到任何单元格,则不要执行代码。

由于某种原因,我无法使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"

1 个答案:

答案 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
    

    重要的相关读物:using code from a recorded a macro

  • 通过指定范围A1:AP1000How to avoid using Select in Excel VBA将对 all 的所有行进行计数,最多不超过1000,仅扣除过滤器隐藏的行数。

    我指的是整个列,而不是指定任意的行集。自动筛选器“创建”它正在使用的一系列单元格,我们可以像这样的表达式进行引用:(从Count Property借来)

    ws.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count
    

当试图找出像这样的长表达式时,从右到左阅读(或出于说明目的,颠倒!)很有帮助

upside down example


  • 接下来,您的here或我的{strong>不正确在自动过滤条件中,具体取决于您日期列中的值是否附加

    • 您的代码示例使用>=StartDate and <EndDate

        

      您的排除了{strong>午夜EndDate 上的值。但是,如果没有没有时间,那么您的时间将排除EndDate的“全天”。如果有时间限制,那么您在11:59:59pm前一天最多包含EndDate

    • 我的代码示例使用>=StartDate and <=EndDate

        

      我的EndDate包括了午夜的值,如果数据没有附加时间,则整个EndDate为包括在内。查询时间多个日期范围以防止重叠时,Yours是正确的使用方式。 (operators。)

  • 最后(主要是装饰性的),请注意,无论MsgBox "Yay"是否出现,您的MsgBox "Nope"都会出现。

    使用Exit SubElse语句一起使用If,可以避免使用{{1}}(立即结束该过程),。 (More about date/times。)

希望这很有道理...祝您好运!