使用函数LastQuarter+2查找上学期的情况

问题描述 投票:0回答:1

我需要一个代码,将计算多少个月是在过去的学期活跃。

我有一个数据透视和数据改变所有的时间,当透视刷新,但是,我需要计算过去6个月的平均水平,但只使用在上学期活跃的几个月,例如enter image description here在这种情况下,我会采取过去6个月的平均数将只使用4个月(2020年1月,2月,3月&;2019年12月),因为它是有的人在上学期活跃的几个月)。

规则是学期开始的月份,我们现在(4月),它回去6个月。Apr2020,Mar2020,Feb2020,Jan2020 & Dec2019,Nov2019。 从这几个月中,我们将只取客户活跃的4个月的金额。 如图

能否用

Public Function LastQuarter(theDate As Date) As Date + 2 months to get the last semester? 
DateSerial(Year(theDate), 2)+2

然而,我猜想我需要使用 IF 过去6个月是=连续6个月活跃的月份 然后既定代码

别的

但是 IF 最近6个月是<连续6个月活跃。然后 算上学期活跃月数 (使用函数LastQuarter(theDate As Date)As Date + 2 months) 并与这个活动月的总金额做平均值.cell(活动月数,3).value ="平均"

ps: 我也曾发过类似的问题 https:/www.ozgrid.comforumindex.php?thread1227330-how-to-calculate-how-many-months-is-active-in-a-semester#wcf9?

excel vba
1个回答
0
投票

你可以使用 GETPIVOTDATA 函数。

假设你在表格中没有超过一年的数据,鉴于你在其他网站下载的工作簿,对于前6年的平均数额 现有 月,对于不存在的月份,公式会返回一个错误。

=AVERAGE(IFERROR(GETPIVOTDATA("Amount in USD",A17,"Transaction Date",MONTH(EOMONTH(TODAY(),{-5;-4;-3;-2;-1;0}))),""))

对于不存在的月份,公式返回一个错误。该 IFERROR 函数将其转换为一个空字符串,而这个空字符串将被 AVERAGE 函数。

您可以为Averaging函数做明显的改变。Bene Frequency 列,并将数组常量扩展到包括12个月,而不是6个月。

如果你的数据透视表中可能有超过12个月的数据,那么你也需要检查一下年份。

=AVERAGE(IFERROR(GETPIVOTDATA("Amount in USD",A17,"Transaction Date",MONTH(EOMONTH(TODAY(),{-5;-4;-3;-2;-1;0})),"Years",YEAR(EOMONTH(TODAY(),{-5;-4;-3;-2;-1;0}))),""))

enter image description here


1
投票

试试吧

这是一个UDF的宏。

d5 = AverageSemester()

下面是宏。

Sub Test()
    Dim Ws As Worksheet
    Dim Semester1 As Variant, Semester2 As Variant
    Dim mySemester As Variant
    Dim Target As Range, rngLast As Range
    Dim s As String
    Dim r As Integer, i As Integer

    Semester1 = Array("May", "Jun", "Jul", "Aug", "Sep", "Oct")
    Semester2 = Array("Nov", "Dec", "Jan", "Feb", "Mar", "Apr")

    Set Ws = Sheets(1)

    With Ws
        r = .Range("c" & Rows.Count).End(xlUp).Row - 1

        Set rngLast = .Range("b" & r).Offset(, 1)
        s = .Range("b" & r)

        If isSemes(s, Semester1) Then
            mySemester = Semester1
        Else
            mySemester = Semester2
        End If
        For i = r To r - 12 Step -1
            s = .Range("b" & i)
            If isSemes(s, mySemester) Then
                Set Target = .Range("b" & i).Offset(, 1)
            Else
                Exit For
            End If
        Next i
        .Range("d5") = WorksheetFunction.Average(.Range(Target, rngLast))
    End With
End Sub
Function isSemes(s As String, vSemester As Variant)
    Dim v As Variant
    For Each v In vSemester
        If v = s Then
            isSemes = True
            Exit Function
        End If
    Next
End Function
Function AverageSemester()
    Dim Ws As Worksheet
    Dim Semester1 As Variant, Semester2 As Variant
    Dim mySemester As Variant
    Dim Target As Range, rngLast As Range
    Dim s As String
    Dim r As Integer, i As Integer

    Application.Volatile
    Semester1 = Array("May", "Jun", "Jul", "Aug", "Sep", "Oct")
    Semester2 = Array("Nov", "Dec", "Jan", "Feb", "Mar", "Apr")

    Set Ws = Sheets(1)

    With Ws
        r = .Range("c" & Rows.Count).End(xlUp).Row - 1

        Set rngLast = .Range("b" & r).Offset(, 1)
        s = .Range("b" & r)

        If isSemes(s, Semester1) Then
            mySemester = Semester1
        Else
            mySemester = Semester2
        End If
        For i = r To r - 12 Step -1
            s = .Range("b" & i)
            If isSemes(s, mySemester) Then
                Set Target = .Range("b" & i).Offset(, 1)
            Else
                Exit For
            End If
        Next i
        AverageSemester = WorksheetFunction.Average(.Range(Target, rngLast))
    End With
End Function

当九月是最后一个数据

平均范围~~&gt;5月、6月、7月、8月、9月。

enter image description here

1月是最后一个数据时

平均范围 ~~> 11月、1月

enter image description here


0
投票

你有没有研究过EDATE功能?

=IF([Date you want to check]<EDATE(now(),-6),TRUE,FALSE)
© www.soinside.com 2019 - 2024. All rights reserved.