【问题标题】:VBA Weekday and Workday to replace Saturday and Sunday with next MondayVBA Weekday 和 Workday 用下周一替换周六和周日
【发布时间】:2018-04-05 06:25:29
【问题描述】:

快速提问:我有一个小的 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 循环中将日期传递给它。有什么建议吗?

【问题讨论】:

  • 请添加您的输入数据示例和预期输出
  • 如果您引用的单元格包含日期,只需使用 Weekday(Cells(i, "I").value, vbMonday) - WorksheetFunction.Workday() 也是如此。另外最好不要Cells(i, "I") = ,而是Cells(i, "I").value = - 换句话说,明确地将结果分配给值。
  • 您缺少的一件事是有两个可选参数。您应该在 vbMonday 之前添加 , 。
  • 非常感谢你们。弄清楚它是什么 - 该范围内的一些单元格包含文本,Weekday 无法处理。我刚刚错过的简单问题。

标签: excel weekday vba


【解决方案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)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多