【问题标题】:Get all weeknums from 2 input dates and put them in an array?从 2 个输入日期获取所有 weeknums 并将它们放入一个数组中?
【发布时间】:2020-01-11 21:15:51
【问题描述】:

由于我在上一篇文章中问了一个错误的问题,但仍然有很多改进(我已经在 Excel 中创建了一个计划表,如果有人想要我会很乐意分享),这就是我想要做的:单元格 B2:开始日期 和 单元格 B3:结束日期

示例:
B2 --> 2019 年 11 月 3 日
B3 --> 22/04/2019

在这个社区的帮助下,这是我的代码

Option Explicit

Sub Sample()

Dim sDate As Date, eDate As Date
Dim NoOfWeeks As Long
Dim arr As Variant
Dim i As Long
Dim myCellToStart As Range
Set myCellToStart = Worksheets(1).Range("D4")

Dim myVar As Variant
Dim myCell As Range
Set myCell = myCellToStart

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

End Sub

基本上,使用我当前的代码,我将获得一个具有以下输出的数组:arr(1, 2, 3, 4, 5, 6)

与此相关 --> See Calendar

我想获取:arr(11, 12, 13, 14, 15, 16, 17)

【问题讨论】:

  • 插入 arr(i) = i 使用 arr(i) = i + Application.Worksheetfunction.WeekNum(sDate)

标签: excel vba date


【解决方案1】:

使用Application.WeekNum 会简单得多:

Option Explicit
Sub Test()

    Dim StartDate As Date, EndDate As Date

    With ThisWorkbook.Sheets("Foglio1") 'remember to fully qualify your ranges, including the workbook
        StartDate = .Range("B2")
        EndDate = .Range("B3")
    End With

    Dim StartWeek As Long, EndWeek As Long
    StartWeek = Application.WeekNum(StartDate, 2)
    EndWeek = Application.WeekNum(EndDate, 2)

    Dim arr
    Dim i As Long
    ReDim arr(StartWeek To EndWeek)
    For i = StartWeek To EndWeek
        arr(i) = i
    Next

End Sub

【讨论】:

  • 非常好,点赞!唯一的小评论是 OP 使用 vbMonday (或者更确切地说是 2)如果我没记错的话,如果我没记错的话,将其保留为 1。
  • 哇,非常干净且易于理解。我不需要 IT 老师,这个社区很漂亮:)
  • 如果可以,请稍加评论。如何使星期一,一周的第一天。如果我没记错的话,你的代码周从星期日开始。
  • @ChangeWorld like JvdV 很好地指出您只需要像这样添加vbMonday2Application.WeekNum(StartDate, vbMonday)
【解决方案2】:

这是另一种方式:

Sub Test()

Dim StrtD As Long, EndD As Long
Dim arr As Variant

With Sheets("Foglio1")
    StrtD = Application.WeekNum(.Cells(1, 2).Value, 2)
    EndD = Application.WeekNum(.Cells(2, 2).Value, 2)
    arr = Application.Transpose(.Evaluate("ROW(" & StrtD & ":" & EndD & ")"))
End With

End Sub

Application.Transpose() 创建一个可以通过arr(x) 调用的一维数组,其中 x 是数组中的任意位置。如果你想创建一个二维数组,你可以离开转置。


要不使用 .Transpose 而是使用 .Columns 返回一维数组,您可以将代码调整为:

Sub Test()

Dim StrtD As Long, EndD As Long
Dim arr As Variant

With Sheets("Foglio1")
    StrtD = Application.WeekNum(.Cells(1, 2).Value, 2)
    EndD = Application.WeekNum(.Cells(2, 2).Value, 2)
    arr = .Evaluate("COLUMN(" & .Cells(1, StrtD ).Address & ":" & .Cells(1, EndD ).Address & ")")
End With

End Sub

我想这是一个偏好问题,因为两种方式都会返回一个数组 > arr(11, 12, 13, 14, 15, 16, 17)

【讨论】:

  • 很好,替代Application.Transpose(),我会注意的:) +1
  • "Application.Transpose() 创建一个一维数组,您可以通过 arr(x) 调用其中 x 是数组中的任何位置。如果您想创建一个二维,可以离开转置大批。”我没有得到这个 JvdV,应用程序转置不是总是创建一个二维数组吗?
  • @Damian, arr = .Evaluate("ROW(" &amp; StrtD &amp; ":" &amp; EndD &amp; ")") 将返回一个二维数组,例如arr(x,y)Application.Transpose 会将其转换为一维数组,即arr(x)
  • 真的!我在想另一种方式
  • @Damian Transpose 交换数组中的行和列,但是如果输入数组只有一列,则结果数组将是一维的。请注意,使用 COLUMN 而不是 ROW 将直接获得一维数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
  • 2015-10-15
  • 2023-03-31
  • 2011-09-03
  • 1970-01-01
相关资源
最近更新 更多