VBA转换为星期和日期

时间:2018-04-10 07:47:22

标签: excel vba excel-vba

我有一个包含周数和星期几的表格。

例:
J2 = 18
G2 =星期一

如何将此转换为2018-04-30?

我可以找到许多用于转换其他方式的线程,这意味着日期到星期。但到目前为止,我在周末+工作日都找不到任何东西 有人知道方法吗?

3 个答案:

答案 0 :(得分:1)

在代码中尝试这个必要的注释:

Option Explicit
Sub GetDate()
    Dim year As Date, day As Long
    'convert day in G2 to integer
    Select Case Range("G2").Value
        Case "Monday"
            day = 1
        Case "Tuesday"
            day = 2
        'rest of cases
    End Select

    'declare what year you want
    year = "01-01-2018"
    'move from first week to the week specified in J2
    year = DateAdd("d", (Range("J2").Value - 1) * 7, year)
    'move back to first day of the week
    Do While DatePart("w", year, vbMonday) <> 1
        year = DateAdd("w", -1, year)
    Loop
    'find date of particular day
    Do While DatePart("w", year, vbMonday) <> day
        year = DateAdd("w", 1, year)
    Loop

End Sub

答案 1 :(得分:1)

WEEKDAY函数的(可选)第二个参数确定一周的第一天是什么。两种最常见的选择是:

  

1:星期日(1)到星期六(7
  或
  2:星期一(1)到星期日(7

但是,如果你愿意,你可以在星期三,星期五等开始。现在选择一个选项。

所以,从1月1日开始(无论你在哪个未指定的年份),并从1月份的1 st 的工作日减去,根据以下任何一个开始 - 你挑选的那天这为您提供第1周的基线。要开始 n ,您只需添加7*(n-1)天。

最后,您需要重新添加工作日。我建议在数组上使用MATCH。你的数组将是你的工作日,按顺序排列,用大括号括起来。所以,对于星期日到星期六,你会使用

MATCH(G2,{"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"},0)

1(“星期日”)到7(“星期六”)获取一个号码,如果小区#NA不包含日期名称,则为G2

坚持下去,你得到这样的东西:

=DATE(YEAR(NOW()),1,1) - WEEKDAY(DATE(YEAR(NOW()),1,1),1) + 7*(J2-1) + MATCH(G2,{"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"},0)

答案 2 :(得分:1)

决定取决于你对“周数”的定义。

如果您使用的是ISO-8601定义,其中一周从星期一开始,而第1周包含一年中的第一个星期四,则可以使用此工作表公式:

=DATE(YEAR(TODAY()),1,-2)-WEEKDAY(DATE(YEAR(TODAY()),1,7),14)+$J$2*7+MATCH($G$2&"*",{"Monday";"Tuesday";"Wednesday";"Thursday";"Friday";"Saturday";"Sunday"},0)-1

您可能需要根据区域设置将逗号更改为分号

解释:

首先,找到上一年的最后一个星期一:

DATE(YEAR(TODAY()),1,-2)-WEEKDAY(DATE(YEAR(TODAY()),1,7),14)

然后加上所需周数的七(7)倍:

+$J$2*7

然后添加从星期一到该周所需日期的天数:

+MATCH($G$2&"*",{"Monday";"Tuesday";"Wednesday";"Thursday";"Friday";"Saturday";"Sunday"},0)-1