【问题标题】:Put weeknum in an array?将 weeknum 放入数组中?
【发布时间】:2020-01-09 07:04:36
【问题描述】:

这是我想要做的:Cell B2:开始日期Cell B3:结束日期

示例:
B2 --> 2019 年 1 月 1 日
B3 --> 01/03/2019

我想获取所有的周数并将它们放入一个数组中

这是 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/201901/03/2019 获取周数并将它们放入一个数组中(如果可能的话)

所以我的输出是:

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

【问题讨论】:

  • 只是好奇......你是怎么得到 9 周的 :) 试试这个Datediff("ww",dateserial(2019,1,1),dateserial(2019,3,1))
  • 在我的日历中,2 月的日子是:第 9 周的 25、26、27、28 和 3 月:1、2、3 仍然是一周9、我是不是做错了什么?
  • 这取决于您认为一周是多少 :) 这些日期之间有 8 个日历周。见this
  • @SiddharthRout 是的,抱歉,我实际上是在查看日历周...link
  • 在试验过程中,我发现了比DateAdd() 更好的方法。我实际上是在发布一个答案(几乎完成了一半)@YasserKhalil

标签: excel vba date


【解决方案1】:

你可以使用类似下面的东西

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;3;4;5;6;7;8 缺少第 9 周。
  • @ChangeWorld 如果你想包括上周使用 NoOfWeeks = worksheetfunction.ROUNDUP((EndDate.Value2 - StartDate.Value2) / 7,0) 它默认向下舍入,因为这两个日期之间不是整周(达到 8.5ish)
  • 它给了我一个编译错误:argument not optional .ROUNDUP 下划线
  • 抱歉忘记0 - NoOfWeeks = worksheetfunction.ROUNDUP((EndDate.Value2 - StartDate.Value2) / 7,0)
  • @SiddharthRout 去吧 :)
【解决方案2】:

你可以像下面这样定义一个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】:

    如果您不想要日历周,并且想要包括一周,即使其中有一天,那么您可以试试这个。

    逻辑

    1. 它会查找下一周的开始时间。所以默认的周数是1
    2. 循环并计算两个日期之间的天数(例如 Monday,然后是 Tuesday 等等),以最高者为准,将其返回并将其添加到 @ 987654323@。

    也不需要循环和创建数组。您可以在 One Go

    中创建顺序数组

    代码

    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 计数到正确的结束。但是如果我写Start Date: 01/02/2019End Date: 01/03/2019 它总是给我1, 2, 3, 4, 5。但是您在回答 If you do not want Calendar Weeks... 时说过,这是我的错,我需要打开另一个问题还是您可以帮我更新您的问题?
    • Start Date: 01/02/2019End Date: 01/03/2019 的实际结果将是 5, 6, 7, 8, 9 仍然很困惑...
    • 这应该是一个不同的问题,因为如果你查看THIS,它应该是1,2,3,4,5,6,7,8,9 而不是5, 6, 7, 8, 9 对于你想要什么,必须问一个新问题你必须在哪里解释你是怎么得到5, 6, 7, 8, 9 :)
    • 在您提出问题后在此处发布链接
    • 好的 Siddharth 谢谢你,我会问一个新问题。你最好的顺便说一句
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多