web-dev-qa-db-ja.com

vbaは週番号(および年)を現在に変換しますか?

セルC13に週番号、セルC14にがあります。

私は以下の式を使用してこれをその週の木曜日に変換します数値の日付:

=DATE(C14,1,-6)-WEEKDAY(DATE(C14,1,3))+C13*7

VBAを使用して同じことを行うにはどうすればよいですか?

7
user7415328

特定の年、あなたはこのようにそれを行うことができます:

DateAdd("ww", WeekNumber - 1, DateSerial(2017, 1, 5))

そしてそれをテストするには:

Debug.Print Format(DateAdd("ww", WeekNumber - 1, DateSerial(YearNumber, 1, 5)), "ddd d MMM yy")

他の人がこれを調べていて木曜日が欲しくない、または2017年に仕事をしない

  1. ニーズに合わせて5を変更してください!

  2. または、以下の関数GetDayFromWeekNumberを使用します

それをテストするためのコード:

Sub test()
    Debug.Print Format(GetDayFromWeekNumber(2017, 1, 4), "ddd d MMM yyyy")
End Sub

そして汎用関数GetDayFromWeekNumber

Public Function GetDayFromWeekNumber(InYear As Integer, _
                WeekNumber As Integer, _
                Optional DayInWeek1Monday7Sunday As Integer = 1) As Date
    Dim i As Integer: i = 1
    If DayInWeek1Monday7Sunday < 1 Or DayInWeek1Monday7Sunday > 7 Then
        MsgBox "Please input between 1 and 7 for the argument :" & vbCrLf & _
                "DayInWeek1Monday7Sunday!", vbOKOnly + vbCritical
        'Function will return 30/12/1899 if you don't use a good DayInWeek1Monday7Sunday
        Exit Function
    Else
    End If

    Do While Weekday(DateSerial(InYear, 1, i), vbMonday) <> DayInWeek1Monday7Sunday
        i = i + 1
    Loop

    GetDayFromWeekNumber = DateAdd("ww", WeekNumber - 1, DateSerial(InYear, 1, i))
End Function
5
R3uK

週の最初の日が日曜日であることを念頭に置いて、それは非常にうまく機能します:

Function fnDateFromWeek(ByVal iYear As Integer, ByVal iWeek As Integer, ByVal iWeekDday As Integer)

        fnDateFromWeek = DateSerial(iYear, 1, ((iWeek - 1) * 7) + iWeekDday - Weekday(DateSerial(iYear, 1, 1)) + 1)

End Function

3番目のパラメータとして希望する日を渡す必要があります。木曜日は5日目です。これらの人へのクレジット: http://www.dreamincode.net/forums/topic/111464-calculate-date-from-year-weeknr-and-daynumber/

1
Vityata

追加オプションとして、ISO週番号システムを使用している場合、その年の第1週は、4日を含む年の最初の週(または暦年の最初の木曜日と週の最初の日を含む週)です。日曜日です。

  • DOWは、曜日を表すオプションの引数です。デフォルトは木曜日で、ISO週番号システムを使用しているため、常に現在の年内に収まるはずです。

Option Explicit
Function WNtoDate(WN As Long, YR As Long, Optional DOW As Long = 5) As Date
    'DOW:  1=Sun, 2=MON, etc
    Dim DY1 As Date
    Dim Wk1DT1 As Date
    Dim I As Long

DY1 = DateSerial(YR, 1, 1)
'Use ISO weeknumber system
I = DatePart("ww", DY1, vbSunday, vbFirstFourDays)

'Sunday of Week 1
Wk1DT1 = DateAdd("d", -Weekday(DY1), DY1 + 1 + IIf(I > 1, 7, 0))

WNtoDate = DateAdd("ww", WN - 1, Wk1DT1) + DOW - 1

End Function

1
Ron Rosenfeld