我有这种格式的日期:14w01(年:2014周数:1)
我想在这个月中将此日期转换为:14m01 是否有一个函数可以转换月份数中的周数?
也许这样的事情(在vba中,而不是在公式中):
Format(weekNumber, "mm")
谢谢
答案 0 :(得分:2)
这取决于如何定义周数。一种方法是说一年中第一周的第一天是该年的1月1日。对于此定义,典型的 UDF 是:
Public Function MonthFromDt(s As String) As Integer
Dim yr As Integer, wk As Integer, d As Date
ary = Split(s, "w")
yr = CInt(ary(0)) + 2000
wk = ary(1)
MonthFromDt = Month(DateSerial(yr, 1, 1) + 7 * (wk - 1))
End Function
周数有其他定义。
答案 1 :(得分:1)
DateFormat
功能非常舒适,但解析日期的DateValue
功能可能不支持您的周格式。
我建议使用DateAdd
,因为DateAdd
可以处理数周。
首先将您的日期分为年份和周数:
Dim parts
parts = Split("2014w33", "w")
Dim year
Dim week
year = CInt(parts(0))
week = CInt(parts(1))
然后,将两者都添加到"零日期"加起来到最后的日期。请注意,如果你给" 0"作为DateAdd
的年份,VBA编译器解释2000。
dim DateResult
DateResult = dateAdd("yyyy", (year - 2000), DateValue("Jan 1, 0"))
Debug.Print dateResult
DateResult = dateAdd("ww", week, dateResult)
Debug.Print dateResult
然后显示重新格式化的结果:
Debug.Print Format(DateResult, "yyyy\mm")
这打印在我身边:
01.01.2014
20.08.2014
2014m08
2014年8月,如果我查看日历,则有第33周。似乎是正确的。
答案 2 :(得分:0)
我找到了一种没有VBA(并且只使用公式)的方法。假设A1包含“14w01”格式
=LEFT(A1,2)&"m"&TEXT(MONTH(DATE(20&LEFT(A1,2),1,1)+(RIGHT(A1,2)*7)),"00")
下面是代码所做的细分......
LEFT(A1,2)
返回“14”(年)
MONTH(DATE(20&LEFT(A1,2),1,1)+(RIGHT(A1,2)*7))
将周#转换为月份#,它将转换为20&LEFT(A1,2)
年以及周#RIGHT(A1,2)
TEXT(...,"00")
填写月份#,必要时为0(即3变为03)
然后我们将所有内容组合在一起以获得“14m01”