周数到月号

时间:2014-08-06 15:44:07

标签: excel vba

我有这种格式的日期:14w01(年:2014周数:1)

我想在这个月中将此日期转换为:14m01 是否有一个函数可以转换月份数中的周数?

也许这样的事情(在vba中,而不是在公式中):

Format(weekNumber, "mm")

谢谢

3 个答案:

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