我的数据表看起来像:
year month
2017 2017-01
2017 2017-02
2017 2017-03
......
2018 2018-04
2018 2018-05
请注意列月包含文本字符串。我需要在excel中创建一个新的列标志,用于过滤哪个月用于计算当前月份的滚动12M平均值,以及哪些月份用于计算上一年的滚动12M平均值。 例如,今天的日期是5/24/2018,因此2018-05月将被标记为"当前"。 2018-04至2017年之间的月份将被标记为"两者都是"。月2017-04将标记为"之前"。休息所有月份将被标记为NA。我的最终数据应如下所示:
year month flag
2017 2017-01 NA
2017 2017-02 NA
2017 2017-03 NA
2017 2017-04 Previous
......
2018 2018-04 Both
2018 2018-05 Current
我在excel中实现这个逻辑时遇到了麻烦,因为列月是一个文本字符串,只是使用IF条件并不适合我。任何领导对此表示赞赏。
修改
我尝试使用=DATEVALUE(B2 & "-01")
将月份转换为数字
我将当月的数字存储在变量curr
中
现在我使用以下公式=IF(B22=curr,"Current", IF(B2=curr-395,"Previous","Both"))
这会创建我需要的标志列,尽管根据月份是30天还是31天仍然存在问题。有什么解决方案吗?
答案 0 :(得分:0)
一种方法是使用DATDIF
。
=DATEVALUE(B2 & "-01")
会在B栏中为您提供每个月的第一天。
要返回月份数,请使用=DATEDIF(C2,TODAY(),"m")
,其中C列包含DATEVALUE
公式。这个月将返回0,上个月返回1个...... 2017年4月返回13个。
现在检查月份的数量是否为0,然后是当前的,如果它的大于11,那么 NA ,否则它都。 =IF(D2=0,"Current",IF(D2>11,"NA","Both"))
...编辑....
那是错的 - 忘了"以前"和"两者"不是12个月......
=IF(D2=0,"Current",IF(D2>13,"NA",IF(D2=13,"Previous","Both")))
答案 1 :(得分:0)
考虑您的列月份格式=" YYYY-MM"此代码可能会有所帮助 这是Excel功能,使用它需要在模块中保存此功能并使用它。 `
Function MyDateCal(cell As Range) As String
Dim YearCurrent, YearCell, monthCurrent, MonthCell As Integer
Dim cellVal As String, DiffMonth As Integer[![enter image description here][1]][1]
cellVal = cell.Value
MyDateCal = "NA"
'cellVal = Cells(1, 1).Value
YearCurrent = Year(Now())
monthCurrent = Month(Now())
YearCell = CInt(Left(cellVal, 4))
MonthCell = CInt(Right(cellVal, 2))
DiffMonth = 12 * (YearCurrent - YearCell) + (monthCurrent - MonthCell)
If DiffMonth = 0 Then
MyDateCal = "Current"
ElseIf DiffMonth > 0 And DiffMonth <= 12 Then
MyDateCal = "Both"
ElseIf DiffMonth = 13 Then
MyDateCal = "Previous"
End If
End Function
`