VBA - 将日期格式分配给列并应用日期过滤器

时间:2018-04-11 10:14:56

标签: excel vba excel-vba

我有两个Macro,它按日期过滤工作表列,然后删除不相关的列。

然而,这是非常错误的,我需要一些帮助来纠正这一点。

这是第一个宏应该发生的事情:

1)将第2行的第B行格式化为日期格式的最后一行dd-mm-yyyy - 目前这种情况不会发生,并且在某些时候它将格式应用于整个B列,包括数据后的空单元格

2)在B栏(日期)上应用过滤器以显示除当天前一天之外的所有记录 - 这是正确的一半,因为它不包括过滤器中的当前日期。当我运行“删除”宏时,显示的单元格是当前日期和前一天,我应该只看到前一天。

Sub DateFilter()

Dim ws1 As Worksheet
Dim c As Range
Dim LastRow As Long
Dim Current_Date As Date

On Error Resume Next

Set ws1 = ActiveWorkbook.Sheets("Sheet")

LastRow = ws1.Cells(Rows.Count, 1).End(xlUp).Row

With ws1

    For Each c In ActiveSheet.Range("B2:B" & LastRow).Cells

        Current_Date = CDate(c)
        c.Value = Current_Date

    Next c

End With

x = CLng(Date)
ws1.UsedRange.AutoFilter Field:=2, Criteria1:="<" & x, Operator:=xlAnd, Criteria2:="<" & x - 1

End Sub

1 个答案:

答案 0 :(得分:2)

正如@SJR建议的那样,你在一篇文章中有太多问题所以我只会看第一个宏。要获得第二个宏的分辨率,请开始一个新的线程

下面的代码应该通过一些注释来实现您对第一个宏的要求,以帮助您理解代码

Sub DateFilter()

    Dim oWS As Worksheet: Set oWS = ThisWorkbook.Worksheets("Sheet")

    ' On Error Resume Next      VERY very bad idea as this will hide all issues in the code!

    With oWS

        ' Set the range format to specified date format. This will automatically update
        ' the values in the cells to a date.. no need to copy and paste them
        .Range("B2:B" & .Cells(.Rows.count, 2).End(xlUp).Row).NumberFormat = "dd-mm-yyyy"

        ' Set the autofilter to display all dates other than yesterdays
        .Range("B:B").AutoFilter Field:=1, Criteria1:="<" & CLng(DateAdd("d", -1, Date)), Operator:=xlOr, Criteria2:=">" & CLng(DateAdd("d", -1, Date))

    End With

End Sub