这是我要尝试的操作:单元格B2:开始日期和单元格B3:结束日期
示例:
B2-> 01/01/2019
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/2019 , 01/03/2019 获取星期数并将其放入数组中(如果可能)
所以我的输出将是:
Array(1、2、3、4、5、6、7、8、9)->从一月到三月之间有9周
答案 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
各种测试
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
参数。