VBA平日和工作日将在下周一取代周六和周日

时间:2017-10-24 12:36:55

标签: excel-vba weekday vba excel

快速提问:我有一个小的vba脚本,它根据许多条件填充一系列日期。我想采取这个日期范围,并在下周一取代周末的任何日期。我正在尝试使用WeekdayWorkday来执行此操作(请假设所有变量都已正确定义):

i = 6
For i = 6 to LastRow
    If Weekday(Cells(i, "I"), vbMonday) > 5 Then
        Cells(i, "I") = Application.WorksheetFunction.Workday(Cells(i, "I"), 1, 1)
    End If
Next i

据我所知,Weekday旨在接受日期,而不是单元格引用。我不知道如何在for循环中传递日期。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

你可以通过将星期六增加+2或星期日+1来实​​现。因为如果你使用vbMonday函数的Weekday参数,星期六= 6和星期日= 7,那么这将有效:

7 - lngDayIndex + 1

其中lngDayIndexWeekday函数的返回值。

代码示例:

Sub ConvertToNextMonday()

    Dim ws As Worksheet
    Dim lngLastRow As Long, lngCounter As Long, lngDayIndex As Long

    Set ws = ThisWorkbook.Worksheets("Sheet2") '<-- change to your sheet
    lngLastRow = ws.Cells(ws.Rows.Count, "I").End(xlUp).Row '<-- change to your column

    For lngCounter = 1 To lngLastRow
        lngDayIndex = Application.WorksheetFunction.Weekday(ws.Cells(lngCounter, "I").Value, vbMonday)
        If lngDayIndex = 6 Or lngDayIndex = 7 Then
            ws.Cells(lngCounter, "I") = ws.Cells(lngCounter, "I") + (7 - lngDayIndex + 1)
        End If
    Next lngCounter

End Sub

根据Office support webpageWeekday函数date参数可以是:

  

...变量,数值表达式,字符串表达式或可表示日期的任何组合。如果date包含Null,则返回Null。

所以你可以使用:

Weekday(Now())

还有,例如:

WeekDay("2017-10-25", vbMonday)

根据您的区域设置,您只需确保任何文本值实际上都能正确转换为日期。