我需要一个代码,将计算多少个月是在过去的学期活跃。
我有一个数据透视和数据改变所有的时间,当透视刷新,但是,我需要计算过去6个月的平均水平,但只使用在上学期活跃的几个月,例如在这种情况下,我会采取过去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?
你可以使用 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}))),""))
试试吧
这是一个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
平均范围~~>;5月、6月、7月、8月、9月。
平均范围 ~~> 11月、1月
你有没有研究过EDATE功能?
=IF([Date you want to check]<EDATE(now(),-6),TRUE,FALSE)