【问题标题】:Creating a date with 1st, 2nd or 3rd day of the week in excel在 Excel 中创建具有一周中的第 1、第 2 或第 3 天的日期
【发布时间】:2018-12-06 10:57:55
【问题描述】:

我需要确定给定数字是星期几,

例如我有 Year = 2018 Calendar Week = 51 和 Number = 3(这是一周的第三天)

日历第 51 周落在 12 月

每周从周一到周日开始

由于第 51 周的第 3 天是第 19 天,因此结果应该是 “19/12/2018”。

我们可以用excel公式或VBA宏来做吗?

非常感谢这方面的任何帮助。

谢谢, 加内什

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    公然从here复制你可以使用Excel公式:

    =DATE(<YearNumber>, 1, -2) - WEEKDAY(DATE(<YearNumber>, 1, 3)) + <WeekNumber> * 7+ <DayNumber> -1   
    

    所以=DATE(2018, 1, -2) - WEEKDAY(DATE(2018, 1, 3)) + 51 * 7 + 3 - 1 返回2018 年 12 月 19 日。

    【讨论】:

    • 这太棒了!它的工作....但是,而不是手动输入年数、周数和日数。我做了单元格引用,年份和周数工作正常,但是如果我更改单元格中的天数,结果不会改变。这是我使用的公式,其中单元格 F3 中的年份,G3 中的周和 H3 中的天 = DATE(F3 , 1, -2) - WEEKDAY(DATE(F3, 1, H3)) + G3 * 7+ H3-1
    • 您第一次提到的日子应该只是数字 3:=DATE(F3, 1, -2) - WEEKDAY(DATE(F3, 1, 3)) + G3 * 7+ (H3-1)
    【解决方案2】:

    通过vba获取。一个是宏,一个是udf。

    宏

    Sub getWeekDays()
        Dim vDB, vS(), vR()
        Dim y As Integer, s As Date, e As Date
        Dim i As Integer, k As Integer
        Dim n As Integer
        'y = Year
        y = InputBox("Input year : 2018  ")
    
        s = DateSerial(y, 1, 0)
        e = DateSerial(y + 1, 1, 0)
        n = e - s
        For i = 1 To n
            d = s + i
            If DatePart("ww", d, vbMonday) = DatePart("ww", d + 1, vbMonday) Then
            Else
                k = k + 1
                ReDim Preserve vR(1 To 2, 1 To k)
                vR(1, k) = DatePart("ww", d, vbMonday) & " Wk"
                If k = 1 Then
                    vR(1, k) = DatePart("ww", s + 1, vbMonday) & " Wk"
                    vR(2, k) = Format(s + 1, "dd.mm.yyyy") & "~" & Format(d, "dd.mm.yyyy")
                Else
                    vR(2, k) = Format(d - 6, "dd.mm.yyyy") & "~" & Format(d, "dd.mm.yyyy")
                End If
            End If
        Next i
        Range("a1").CurrentRegion.Clear
        Range("a1").Resize(k, 2) = WorksheetFunction.Transpose(vR)
    End Sub
    

    UDF

    Function getWeekDay(y As Integer, WeekNum As Integer, DayOrder As Integer)
        Dim s As Date, e As Date
        Dim i As Integer
        Dim n As Integer
        Application.Volatile
        'WeekNum = 51
        'y = Year
        'DayOrder <~~ If third day  DayOrder = 3
    
        s = DateSerial(y, 1, 0)
        e = DateSerial(y + 1, 1, 0)
        n = e - s
        For i = 1 To n
            d = s + i
    
            If DatePart("ww", d, vbMonday) = WeekNum Then
                getWeekDay = d + DayOrder - 1
                Exit Function
            End If
        Next i
    End Function
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多