【问题标题】:Change any weekend dates that appear in a specific cell to the Friday beforehand [duplicate]预先将特定单元格中出现的任何周末日期更改为星期五[重复]
【发布时间】:2019-09-30 12:14:05
【问题描述】:

这是我目前所拥有的。日期在 sheet1 上是私有的,但如果它还不是工作日,则需要在 sheet5 上转换为工作日。提前感谢您的帮助!

Sub Weekend_remover()    
    '  determines if date is a weekend and changes it to the friday beforehand.
    If (Weekday(Sheet1!B3, vbMonday) <= 5) Then
        Sheet5!D13 = Sheet1!B3
    ElseIf (Weekday(Sheet5!D12, vbMonday) = 6) Then
        Sheet5!D13 = (Sheet1!B3 - 1)
    Else
        If (Weekday(Sheet5!D12, vbMonday) = 7) Then
            Sheet5!D13 = (Sheet1!B3 - 2)
        End If

End Sub

【问题讨论】:

  • 你的代码有什么问题?
  • 代码无法工作,因为缺少End If。或者因为最后一个 Else … If 应该是 ElseIf。请注意,空格和换行符在 VBA 中非常重要。
  • 另外Weekday(Sheet1!B3, vbMonday) 不是有效的语法,应该是Weekday(ThisWorkbook.Worksheets("Sheet1").Range("B3"), vbMonday)

标签: excel vba date


【解决方案1】:

欢迎来到 SO。您可以在 Excel 中使用普通公式轻松完成此操作:

=IF(WEEKDAY(A1;2)&gt;5;A1-WEEKDAY(A1;2)+5;A1)

如果您需要 VBA 解决方案,请创建一个 UDF,然后创建一个循环遍历所有单元格的宏。 UDF 将是:

Function LAST_FRIDAY(ByVal vThisDate As Range) As Date
Dim ThisDate As Date
ThisDate = CDate(vThisDate.Value)

If Weekday(ThisDate, vbMonday) > 5 Then
    LAST_FRIDAY = CDate(ThisDate + 5 - Weekday(ThisDate, vbMonday))
Else
    LAST_FRIDAY = ThisDate
End If

End Function

希望您可以根据自己的需要进行调整。

【讨论】:

  • 非常感谢大家!
【解决方案2】:

我会使用 .Range("") 来指代范围;有一个你正在使用有效日期开始的测试;使用变量并始终使用包含源日期的单元格和目标单元格来放置日期。最后,我会使用 Select Case 作为我的偏好

Public Sub Weekend_remover()
    Dim ws1 As Worksheet, ws5 As Worksheet, dateCell As Range, targetCell As Range

    Set ws1 = ThisWorkbook.Worksheets("Sheet1")
    Set ws5 = ThisWorkbook.Worksheets("Sheet5")
    Set dateCell = ws1.Range("B3")
    Set targetCell = ws5.Range("D13")

    If IsDate(dateCell.Value) Then
        Select Case Weekday(dateCell.Value, vbMonday)
        Case Is <= 5
            targetCell = dateCell
        Case 6
            targetCell = dateCell - 1
        Case 7
            targetCell = dateCell - 2
        End Select
    End If
End Sub

【讨论】:

    【解决方案3】:

    考虑:

    Sub Weekend_remover()
        Dim r1 As Range, r2 As Range
    
        Set r1 = Sheets("Sheet1").Range("B3")
        Set r2 = Sheets("Sheet5").Range("D12")
        v = r1.Value
        dy = Weekday(v, vbMonday)
    
    '  determines if date is a weekend and changes it to the friday beforehand.
    
        If dy <= 5 Then
                r2.Value = v
            ElseIf dy = 6 Then
                r2.Value = v - 1
            ElseIf dy = 7 Then
                r2.Value = v - 2
        End If
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2017-06-05
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      • 2018-03-28
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多