【发布时间】:2017-07-13 07:07:51
【问题描述】:
目前,在我的 Excel 中,有一串年份和月份写成 yyyymm。 例如:201706
现在我想在另一个工作表中将其转换为月末日期。例如:20170630
现在的问题是,如何告诉 Excel 根据字符串中的月份值自动创建日期?
我打算使用 if 语句根据字符串后面的结束值来声明每个月。 (即:如果 201706 ,日期 = 20170630)
但后来我认为这不适用于二月的闰年。除此之外还有其他方法可以使用吗?
【问题讨论】:
目前,在我的 Excel 中,有一串年份和月份写成 yyyymm。 例如:201706
现在我想在另一个工作表中将其转换为月末日期。例如:20170630
现在的问题是,如何告诉 Excel 根据字符串中的月份值自动创建日期?
我打算使用 if 语句根据字符串后面的结束值来声明每个月。 (即:如果 201706 ,日期 = 20170630)
但后来我认为这不适用于二月的闰年。除此之外还有其他方法可以使用吗?
【问题讨论】:
试试这个
dtmDate = 201706 (or put there value from cell)
dhLastDayInMonth = DateSerial(Left(dtmDate, 4), Right(dtmDate, 2) + 1, 0)
【讨论】:
Right(dtmDate, 2) 返回月份,+1 将其加一,因此指的是 7 月。 0 是天数 - 天数 0 实际上是上个月的最后一天,因此是 6 月 30 日。
解决问题的最简单方法是甚至不使用 vba makro。使用 Date、Left 和 Right 以及 EOMonth 函数,您可以将字符串转换为日期,如下例所示。
使用这个你甚至不需要 vba:
=EOMONTH(DATE(LEFT(A1;4);RIGHT(A1;2);1);0)
(例如,如果日期字符串在 A1 中)
查看this页面以获取有关此功能的更多详细信息
【讨论】:
=EOMONTH(LEFT("201711",4)&"-"&RIGHT("201711",2)&"-01",0)
我经常使用一些解决方法,将下个月的第一天(始终是第一天)减去该日期的 1。不幸的是,这只适用于日期值:
试试这个:
Sub LastDayOfMonth()
strInput = "201711"
y = Left(strInput, 4)
m = Right(strInput, 2)
dat = DateSerial(y, m + 1, 1) - 1
End Sub
【讨论】:
Dim dLast As Date
dLast = DateAdd("d", -1, CDate("1/" & Format(Date, "mm/yyyy")))
如果您将日期放在单元格 A1 中,则通过消息框:
MsgBox Format([eomonth(A1,6)], "dd/mm/yyyy")
【讨论】: