VBA表过滤和刷新

时间:2016-12-06 11:34:59

标签: vba excel-vba filter refresh excel

Manual choice使用我从互联网上修改的代码我已经让我的表格正确过滤了日期,但是当点击按钮时,它显示没有结果,直到我手动点击过滤器VBA上的确定,一旦我这样做如果我在这里错过了一个技巧,它会显示正确的结果吗?

Sub FilterListOrTableData()

    Dim ACell As Range
    Dim ActiveCellInTable As Boolean
    Dim FilterCriteria As String
    Dim Created As String
    Dim sToday As String
    Dim sStartDate As String
    Dim dStartDate As Date
    Dim sUpperBound, sLowerBound As String


    'Check to see if the worksheet is protected.
    If ActiveSheet.ProtectContents = True Then
        MsgBox "This macro will not work when the worksheet is write-protected.", _
               vbOKOnly, "Filter example"
        Exit Sub
    End If

    'Set a reference to the ActiveCell named ACell. You can always use
    'ACell now to point to this cell, no matter where you are in the workbook.
    Set ACell = ActiveCell

    'Test to see if ACell is in a table or list. Note that by using ACell.ListObject, you
    'don't need to know the name of the table to work with it.
    On Error Resume Next
    ActiveCellInTable = (ACell.ListObject.Name <> "")
    On Error GoTo 0

    'If the cell is in a list or table, run the code.
    If ActiveCellInTable = True Then
        'Show all data in the table or list.
        On Error Resume Next
        ActiveSheet.ShowAllData
        On Error GoTo 0

        'This example filters on the first column in the List/Table
        '(change the field if needed). In this case the Table starts
        'in A so Field:=1 is column A, field 2 = column B, ......
        'Use "<>" & filtercriteria if you want to exclude the criteria from the filter.
        'FilterCriteria = InputBox("What text do you want to filter on?", _
                           '       "Type in the filter item.")
      '  ACell.ListObject.Range.AutoFilter _
              '  Field:=1, _

             '  Criteria1:="=" & FilterCriteria
             'This example filters on the ActiveCell value.
'ACell.ListObject.Range.AutoFilter _
 '   Field:=ACell.Column - ACell.ListObject.Range.Cells(1).Column + 1, _
  '  Criteria1:="=" & ACell.Text

    sToday = Date
    dStartDate = DateValue(Date) - 7
    sStartDate = Str(dStartDate)

    sLowerBound = ">=" + sStartDate
    sUpperBound = "<=" + sToday

    ACell.ListObject.Range.AutoFilter Field:=89, Criteria1:=sLowerBound, _
    Operator:=xlOr, Criteria2:=sLowerBound

    ActiveWorkbook.RefreshAll

    'Else
       ' MsgBox "Select a cell in your list or table before you run the macro.", _
               'vbOKOnly, "Filter example"
    End If

End Sub

当我执行手动选项时,这是宏记录的内容:

Sub Macro1()
'
' Macro1 Macro
'

'
    ActiveSheet.ListObjects("FTLOG").Range.AutoFilter Field:=84, Criteria1:= _
        ">=29/11/2016", Operator:=xlOr, Criteria2:=">=29/11/2016"
End Sub

2 个答案:

答案 0 :(得分:0)

问题在于逻辑而不是AutoFilter

enter image description here

xlOR将显示满足其中一个条件的所有记录

案例1:显示此记录,因为条件2为True

  • 条件1: 1/1/2016 &gt; = 2/1/2016 :False
  • 条件2: 1/1/2016 &lt; = 2016年12月6日:是

案例2:显示此记录,因为条件1和条件2为真

  • 条件1: 2016年7月31日 &gt; = 2/1/2016 :True
  • 条件2: 2016年7月31日 &lt; = 12/6/2016 :是的

案例3:显示此记录,因为条件1和条件2为真

  • 条件1: 2016年7月31日 &gt; = 2/1/2016 :True
  • 条件2: 2016年7月31日 &lt; = 12/6/2016 :是的

案例3:显示此记录,因为条件2为True

  • 条件1: 2016年12月31日 &gt; = 2/1/2016 :True
  • 条件2: 12/1/2016 &lt; = 12/6/2016 :True

xlAND将显示满足所有条件的所有记录

案例1:隐藏此记录,因为条件1为假

  • 条件1: 1/1/2016 &gt; = 2/1/2016 :False
  • 条件2: 1/1/2016 &lt; = 2016年12月6日:是

案例2:显示此记录,因为条件1和条件2为真

  • 条件1: 2016年7月31日 &gt; = 2/1/2016 :True
  • 条件2: 2016年7月31日 &lt; = 12/6/2016 :是的

案例3:隐藏此记录,因为条件2为假

  • 条件1: 2016年7月31日 &gt; = 2/1/2016 :True
  • 条件2: 2016年7月31日 &lt; = 12/6/2016 :是的

案例3:显示此记录,因为条件2为True

  • 条件1: 2016年12月31日 &gt; = 2/1/2016 :True
  • 条件2: 12/1/2016 &lt; = 12/6/2016 :True
Sub FilterOr()
    Range("$A$5:$F$8").AutoFilter Field:=2, Criteria1:= _
        ">=" & Range("StartDate"), Operator:=xlOr, Criteria2:="<=" & Range("Today1")
End Sub

Sub FilterAnd()
    Range("$A$5:$F$8").AutoFilter Field:=2, Criteria1:= _
        ">=" & Range("StartDate"), Operator:=xlAnd, Criteria2:="<=" & Range("Today1")
End Sub

答案 1 :(得分:0)

enter image description here

这有效:

Option Explicit

Public Sub TestMe()

    Dim dToday          As Date: dToday = Date
    Dim dStartDate      As Date: dStartDate = Date - 7
    Dim dEndDate        As Date: dEndDate = Date

    Dim sLowerBound     As String
    Dim sUpperBound     As String

    dToday = Format(dToday, "dd/mm/yyyy")
    dStartDate = Format(dStartDate, "dd/mm/yyyy")
    dEndDate = Format(dEndDate, "dd/mm/yyyy")

    sLowerBound = ">=" & CLng(dStartDate)
    sUpperBound = "<=" & CLng(dToday)

    ActiveSheet.Range("$A$1:$B$6").AutoFilter Field:=2, Criteria1:=sLowerBound, Operator:=xlOr, Criteria2:=sUpperBound

End Sub