如何自动过滤表格内容并计算结果行?

时间:2014-03-11 19:07:46

标签: excel excel-vba visible autofilter vba

我正在尝试使用VBA计算一周中的几天和一天中的小时(将单独绘制)的事件实例。日期/时间戳采用以下格式:“2014年2月28日20:32”

例:
    AppID = 14329
DateCreated = 2/28/14 20:55
日=星期五
小时= 20:55

我现在正在进行的是将数据复制到新列并将日期格式设置为“dddd”,因此它将显示为“星期日”等。从那里我自动过滤每周的每一天并计数产生的可见细胞。这正在使用此代码:

With Range("C2:C" & LR)
                .AutoFilter

                .AutoFilter Field:=3, Criteria1:="Sunday"
                        cCnt = ActiveSheet.AutoFilter.Range.Columns(3) _
                        .SpecialCells(xlCellTypeVisible).Cells.Count
                            For Each cell In Range("C2:C" & cCnt)
                            Sun = Sun + 1
                            Next

                .AutoFilter Field:=3, Criteria1:="Monday"
                        cCnt = ActiveSheet.AutoFilter.Range.Columns(3) _
                        .SpecialCells(xlCellTypeVisible).Cells.Count
                            For Each cell In Range("C2:C" & cCnt)
                            Mon = Mon + 1
                            Next

...等。

但是,我的问题是按小时计算事件。我试图通过将日期/时间复制到新列并将格式设置为“h:mm; @”并使用此代码按小时自动过滤来尝试类似的操作:

With Range("D2:D" & LR)
            .AutoFilter

            .AutoFilter Field:=4, Criteria1:="10:??"
                        cCnt = ActiveSheet.AutoFilter.Range.Columns(4) _
                        .SpecialCells(xlCellTypeVisible).Cells.Count
                            For Each cell In Range("D2:D" & cCnt)
                            time(10) = time(10) + 1
                            Next

...等

这不起作用,我无法弄清楚原因。我已经尝试将criteria1更改为各种语法,添加第二个条件参数并且难以理解为什么这个方法适用于第一次转换而不是第二次当两个列都是从相同的原始数据派生时。我也尝试将数据更改为不同的时间格式(只是“hh”等)。

1 个答案:

答案 0 :(得分:1)

Excel如何存储日期&次:

Excel使用'序列'用于存储日期的编号系统(第一天是1900年1月1日):

  

01/01/1900 = 1

     

01/02/1900 = 2

时间由小数点后的任何内容表示(中午是.5,因为它是一天的中途):

  

01/01/1900 12:00 = 1.5

     

01/02/1900 15:00 = 2.625

如果您根据值进行过滤,请务必注意这一点。


在您的模块中包含此代码:

    Public Function GetDay(ByVal inputDate As String) As String

        GetDay = WeekdayName(Weekday(inputDate))

    End Function


    Public Function GetHour(ByVal inputDate As Range) As String

        GetHour = Format(inputDate.Value, "Medium Time")

    End Function


现在在工作表和自动填充中使用这些功能:

Raw Data Table Table Step 1 Table Step 2 Final Table

在现有代码中修改以下内容:

    With Range("D2")

        .AutoFilter Field:=4, Criteria1:="10:?? PM"

            'If criteria didn't match anything, cCnt is equal to 1 (because header rows are visible and counted)
            cCnt = ActiveSheet.AutoFilter.Range.Columns(4).SpecialCells(xlCellTypeVisible).Cells.Count

            If cCnt > 1 Then

                For Each cell In Range("D2:D" & cCnt)
                    Hour10PM = Hour10PM + 1
                Next

            End If

            MsgBox (Hour10PM & " matches for 10:00PM to 10:59PM")


        .AutoFilter Field:=4, Criteria1:="11:?? PM"

            cCnt = ActiveSheet.AutoFilter.Range.Columns(4).SpecialCells(xlCellTypeVisible).Cells.Count

            If cCnt > 1 Then

                For Each cell In Range("D2:D" & cCnt)
                    Hour11PM = Hour11PM + 1
                Next

            End If

            MsgBox (Hour11PM & " matches for 11:00PM to 11:59PM")

    End With

附加说明:

显然我只是给了一段代码,但想法是你可以分开并保持每小时的数量。然后绘制它应该很简单。