查找数据透视表中日期之间的平均间隔

时间:2014-11-11 22:26:13

标签: excel vba date excel-vba pivot-table

我有一个包含订单日期数据的电子表格:

enter image description here

我需要找到每个订单日期之间的平均天数。我必须找到一种方法来超越行中的空白单元格,并且还考虑到一些客户端有5-10个订单,而一些客户端在计算订单之间的平均频率(间隔)时有2个订单。

到目前为止我所拥有的:

Sub DateInt()
Dim CurrentSheet As Worksheet
Dim LastRow As Integer
Dim LastCol As Integer
Dim CurrentRow As Integer
Dim CurrentCol As Integer
Dim GrandT As String

GrandT = InputBox("Which column is the Grand Total in?", "Grand Total Column Letters")

Set CurrentSheet = ActiveWorkbook.ActiveSheet
LastRow = CurrentSheet.Range(GrandT & Rows.Count).End(xlUp).Row
LastCol = CurrentSheet.Cells(4, Columns.Count).End(xlToLeft).Column - 1

For CurrentRow = 5 To LastRow
    For CurrentCol = 2 To LastCol
        If Not CurrentSheet.Cells(CurrentRow, CurrentCol).Value = "" Then
            'Save date
            'Find next date in row
            'Subtract Dates to get interval and save interval in days
            'Save a running average of intervals
                'Maybe a running sum (SumDates) and a running divisor (NumOfDates)
        Else
        Next
    'Output average interval (SubDates / NumOfDates) in CurrentSheet.Cells(CurrentRow, LastCol + 1).Value
    Next

End Sub

我无法弄清楚如何在CurrentCol到LastCol循环中进行循环: 也许是这样的:

NumOfDates = 0
'Loop
'Loop
NumOfDates = NumOfDates + 1   
Date & NumOfDates = CurrentCell.Value
If NumOfDates = 1 Then Next
Else
Interval = Date2 - Date1
TtlInterval = TtlInterval + Interval
Date2 = Date1
Next

1 个答案:

答案 0 :(得分:3)

我们在这里获胜:(更新时更好) enter image description here

Sub DateInt()
    Dim CurrentSheet As Worksheet
    Dim LastRow As Integer
    Dim LastCol As Integer
    Dim CurrentRow As Integer
    Dim CurrentCol As Integer
    Dim GrandT As String
    Dim DateA As Date
    Dim DateB As Date
    Dim DateTtl As Integer
    Dim DateCount As Integer

    Set CurrentSheet = ActiveWorkbook.ActiveSheet
    LastRow = CurrentSheet.Range("A" & Rows.Count).End(xlUp).Row - 1
    LastCol = CurrentSheet.Cells(4, Columns.Count).End(xlToLeft).Column

    Cells(4, LastCol + 1).Value = "Avg Interval"
    Cells(4, LastCol + 2).Value = "Days Since Last Order"
    Cells(4, LastCol + 3).Value = "Last Order Date"
    Cells(4, LastCol + 4).Value = "Last Order v Avg Order"

    For CurrentRow = 5 To LastRow
        Cells(CurrentRow, LastCol).Value = Date
        Cells(CurrentRow, LastCol).NumberFormat = "mm/dd/yy"
        DateCount = 0
        DateTtl = 0
        DateC = DateAdd("d", 20, Date)

        For CurrentCol = 2 To LastCol
            If Cells(CurrentRow, CurrentCol).Value = "" Then
            Else
                If DateCount < 1 Then
                    DateA = Cells(CurrentRow, CurrentCol).Value
                Else
                    DateB = Cells(CurrentRow, CurrentCol).Value
                    DateTtl = DateDiff("d", DateA, DateB) + DateTtl

                    If DateValue(DateB) = DateValue(Date) Then
                    Else
                        DateA = DateB
                    End If
                End If

                DateCount = DateCount + 1
            End If
        Next CurrentCol

        Cells(CurrentRow, LastCol + 1).Value = DateTtl / DateCount
        Cells(CurrentRow, LastCol + 1).NumberFormat = "General"
        Cells(CurrentRow, LastCol + 2).Value = DateDiff("d", DateA, Date)
        Cells(CurrentRow, LastCol + 2).NumberFormat = "General"
        Cells(CurrentRow, LastCol + 3).Value = DateA
        Cells(CurrentRow, LastCol + 3).NumberFormat = "mm/dd/yy"
        Cells(CurrentRow, LastCol + 4).Value = Cells(CurrentRow, LastCol + 1).Value - Cells(CurrentRow, LastCol + 2).Value
        Cells(CurrentRow, LastCol + 4).NumberFormat = "#,##0_);[Red](#,##0)"
        Next CurrentRow

End Sub