在excel

时间:2018-05-24 07:39:01

标签: excel excel-vba excel-formula vba

我的数据表看起来像:

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天仍然存在问题。有什么解决方案吗?

2 个答案:

答案 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

`

enter image description here