VBA过滤年

时间:2012-10-18 02:11:44

标签: excel-vba vba excel

我有如下所示的代码。我第一次过滤,它工作正常。然而第二次,它没有。已过滤的列包含多年。

For i = 1 To LastRow
    If wSheet.Range("A1").Offset(i, 0) <> wSheet.Range("A1").Offset(i + 1, 0) Then
        WellName = wSheet.Range("A1").Offset(i, 0)
        Set rng = wSheet.Range("A1", Cells(LastRow, LastColumn))
        rng.AutoFilter Field:=1, Criteria1:=Name
        L_top = wSheet.Range("A2:A" & LastRow).SpecialCells(xlCellTypeVisible).Row
        L_bot = wSheet.Range("A2:A" & LastRow).SpecialCells(xlCellTypeVisible).Count
        LastRowFilter = wSheet.Range("A1").End(xlDown).Row
        LastColumnFilter = wSheet.UsedRange.Columns.Count

        For j = 1 To LastRowFilter
            If Year(wSheet.Range("B1").Offset(j, 0)) <> Year(wSheet.Range("B1").Offset(j + 1, 0)) Then
                ReportYear = Year(wSheet.Range("B1").Offset(j, 0))
                Set rng2 = wSheet.Range("B1", Cells(LastRowFilter, LastColumnFilter))
                rng2.AutoFilter Field:=2, Criteria2:=ReportYear
                L_top = wSheet.Range("B2:B" & LastRowFilter).SpecialCells(xlCellTypeVisible).Row
                L_bot = wSheet.Range("B2:B" & LastRowFilter).SpecialCells(xlCellTypeVisible).Count

            End If
        Next

    End If
 Next

1 个答案:

答案 0 :(得分:1)

看来您的问题是您的第二个过滤器(似乎初始过滤器应该导致和错误,但如果它没有破坏,请不要修复它:))。问题在于以下几行:

ReportYear = Year(wSheet.Range("B1").Offset(j, 0))
Set rng2 = wSheet.Range("B1", Cells(LastRowFilter, LastColumnFilter))
rng2.AutoFilter Field:=2, Criteria2:=ReportYear

您将ReportYear设置为等于您要过滤的年份(有意义),但是您尝试过滤等于该年份的值。这似乎在逻辑上有意义,但请记住,该列包含日期,而不是年份。不知道你的代码还有什么(对任何其他错误道歉),这似乎适用于我的简单测试:

ReportYear = Year(wSheet.Range("B1").Offset(j, 0))
Set rng2 = wSheet.Range("B1", Cells(LastRowFilter, LastColumnFilter))
rng2.AutoFilter Field:=2, Criteria1:= ">=" & DateSerial(ReportYear, 1, 1), _
               Operator:=xlAnd, Criteria2:="<=" & DateSerial(ReportYear, 12, 31)

这会使用您的ReportYear值,但会将过滤器变为“显示ReportYear的1月1日到12月31日之间的所有日期”。我同意这看起来有点不优雅(我相信这里的一位大师有一个更短的解决方案),但它可能适用于你的情况。