将Weeknum放入数组中?

时间:2019-09-06 11:45:03

标签: excel vba date

这是我要尝试的操作:单元格B2:开始日期单元格B3:结束日期

示例:
B2-> 01/01/2019
B3-> 01/03/2019

我想获取所有星期几并将它们放在一个数组中

这是Excel单元格的图片

Example Excel

到目前为止,这是我的代码

Application.ScreenUpdating = False
Application.DisplayAlerts = False

Dim StartD As Date, EndD As Date 
Set wks = ThisWorkbook.Sheets("Foglio1")

Worksheets("Foglio1").Range("D2:XZ39").Clear 

StartD = Worksheets("Foglio1").Cells(2, 2) 
EndD = Worksheets("Foglio1").Cells(3, 2) 

我想遍历给定的两个日期: 01/01/2019 01/03/2019 获取星期数并将其放入数组中(如果可能)

所以我的输出将是:

Array(1、2、3、4、5、6、7、8、9)->从一月到三月之间有9周

4 个答案:

答案 0 :(得分:2)

您可以使用类似以下的内容

Option Explicit

Sub Sample()
    Dim sDate As Date, eDate As Date
    Dim NoOfWeeks As Long
    Dim arr As Variant
    Dim i As Long

    With Worksheets("Foglio1")
        sDate = .Range("B2")

        If Weekday(sDate, vbMonday) <> 1 Then
            sDate = DateAdd("d", 7 - Weekday(sDate, vbMonday) + 1, sDate)
            NoOfWeeks = 1
        End If

        eDate = .Range("B3")
    End With

    If sDate = eDate Then
        NoOfWeeks = NoOfWeeks + 1
    Else
        NoOfWeeks = NoOfWeeks + WorksheetFunction.RoundUp((eDate - sDate) / 7, 0)
    End If

    ReDim arr(1 To NoOfWeeks)
    For i = 1 To NoOfWeeks
        arr(i) = i
    Next i

    MsgBox Join(arr, ";")
End Sub

答案 1 :(得分:2)

如果您不希望日历周,并且希望包括一周,即使距该日期还有一天,您也可以尝试一下。

逻辑

  1. 查找下周开始的时间。因此,默认的星期数是1
  2. 循环计算两个日期之间的天数(例如说 Monday 然后是 Tuesday ,依此类推),以最高的日期为准,然后将其返回并将其添加到{ {1}}。

也不需要循环和创建数组。您可以在一键通

中创建顺序数组

代码

1

各种测试

Option Explicit

Sub Sample()
    Dim WeeksCount As Long
    Dim CurCount As Long
    Dim countOfWeeks As Long
    Dim i As Long, tmpCount As Long

    Dim sDate As Date, eDate As Date

    sDate = DateSerial(2019, 1, 6)
    eDate = DateSerial(2019, 1, 8)

    If Weekday(sDate, vbMonday) <> 1 Then
        sDate = DateAdd("d", 7 - Weekday(sDate, vbMonday) + 1, sDate)
        WeeksCount = 1
    End If

    For i = 1 To 7
        CurCount = GetMeMyKindOfWeeksTotal(sDate, eDate, i)
        If tmpCount < CurCount Then tmpCount = CurCount
    Next i

    WeeksCount = WeeksCount + tmpCount

    Dim MyArray

    MyArray = Evaluate("Row(1" & ":" & WeeksCount & ")")

    If WeeksCount = 1 Then
        Debug.Print MyArray(1)
    Else
        For i = LBound(MyArray) To UBound(MyArray)
            Debug.Print MyArray(i, 1)
        Next i
    End If
End Sub

Private Function GetMeMyKindOfWeeksTotal(ByVal sDate As Date, ByVal eDate As Date, dy As Long)
    Dim j As Long
    Dim TotalDays As Long

    For j = sDate To eDate
        If Weekday(j) = dy Then
            TotalDays = TotalDays + 1
        End If
    Next

    GetMeMyKindOfWeeksTotal = TotalDays
End Function

这会给你sDate = DateSerial(2019, 1, 6) eDate = DateSerial(2019, 1, 8)

2

这会给你sDate = DateSerial(2019, 1, 1) eDate = DateSerial(2019, 3, 1)

9

这会给你sDate = DateSerial(2019, 1, 1) eDate = DateSerial(2019, 1, 1)

1

这会给你sDate = DateSerial(2019, 1, 1) eDate = DateSerial(2019, 1, 8)

答案 2 :(得分:1)

您可以定义如下所示的UDF:

Public Function GetWeekNums(startDate As Date, endDate As Date, Optional varDelim As Variant)
Dim lngStartWeek As Long
Dim lngEndWeek As Long
Dim i As Long

If IsMissing(varDelim) Then varDelim = ","

lngStartWeek = Application.WorksheetFunction.WeekNum(startDate)
lngEndWeek = Application.WorksheetFunction.WeekNum(endDate)
For i = lngStartWeek To lngEndWeek
    GetWeekNums = GetWeekNums & " " & i
Next

GetWeekNums = Replace(Trim(GetWeekNums), " ", varDelim & " ")

End Function

,然后在工作簿中使用它,如:

=GetWeekNums(B2,B3,";")

答案 3 :(得分:0)

如果某人只喜欢工作表公式,则可以使用:

=ROW(INDEX($A:$A,WEEKNUM($B$2),1):INDEX($A:$A,WEEKNUM($B$3),1))

根据一周的开始时间,对该函数使用适当的return_type参数。