【问题标题】:Calculate date then adjust if weekend or holiday计算日期,然后在周末或节假日进行调整
【发布时间】:2021-08-22 02:39:54
【问题描述】:

我正在尝试创建一个使用四个变量计算截止日期的公式:
StartDate、Over2%Date、Percentage、Currency

  • 如果百分比 StartDate + 120)
  • 如果百分比 >= 2%,计算 (StartDate + 120) 和 (Over2%Date + 30) 中的较小者李>
  • 结果日期不能是周末或节假日。在找到有效工作日之前,应减去天数。
  • 包含假期列表的范围会因货币而异

示例:

StartDate = 01 March 2021;  Over2%Date = 05 March 2021;  Percentage = 3%;  Currency = "EUR"

Percentage > 0.02   [therefore test:]   Over2%Date + 30  =  04 April 2021    
04 April 2021 is a Sunday   [therefore test:]   02 April 2021    
02 April 2021 is a holiday for EUR   [therefore test:]   01 April 2021    
Not a weekend, not a holiday    >>>>    function = 01 April 2021

问题:

我尝试了一些代码,但 Excel 返回值错误。我认为问题在于让 VBA 识别日期,格式为:“DD MMM”,甚至开始计算。我尝试将日期变量称为日期和整数。

我还尝试注释掉引用假期的部分,但没有任何变化,虽然我确信这也被破坏了,但这不是唯一的问题。

Function DEADLINE(SD As Date, OD As Date, PCT As Double, CCY As String) As Date
    Dim TEST As Date, HRANGE As Range, VALID As Boolean
    VALID = False
    If PCT = "" Then DEADLINE = ""
    If PCT >= 0.02 And (OD - SD) < 90 Then
        TEST = OD + 30
    Else: TEST = SD + 120
    End If
    If CCY = "EUR" Then
        HRANGE = Range("Holidays!A2:A60")
    Else: HRANGE = Range("Holidays!B2:B60")
        ' Select range to cross-check holidays
    End If
    If Weekday(TEST) = 1 Then TEST = TEST - 2
    If Weekday(TEST) = 7 Then TEST = TEST - 1
    ' Check if weekend
    Do Until VALID = True
        ' If holiday, subtract 1 and retry
        If Application.WorksheetFunction.CountIf(HRANGE, TEST) = 0 Then
    VALID = True
        Else: TEST = TEST - 1
        End If
        If Weekday(TEST) = 1 Then TEST = TEST - 2
        If Weekday(TEST) = 7 Then TEST = TEST - 1
        ' Re-check weekend
    Loop
    DEADLINE = TEST
End Function

【问题讨论】:

  • 乍一看,您的范围变量缺少Set。如果您从子例程而不是从单元格(作为 UDF)调用此函数,则调试会更容易。
  • 为什么选择 VBA?这可以通过工作表函数来完成。

标签: excel vba date


【解决方案1】:

在 VBA 中:

Option Explicit
Function DEADLINE(SD As Date, OD As Date, PCT As Double, CCY As String) As Date
    Dim HRANGE As Range
    Dim DT As Date

'set holiday range
Select Case CCY
    Case "EUR"
        Set HRANGE = Range("EUR") 'presume this  is a named range on the worksheet
    'Case "USD"
        'Set HRANGE = Range("USD"
    'etc
End Select

'Calculate deadline
DT = SD + 120
If PCT >= 0.02 Then _
    DT = IIf(DT > OD + 30, OD + 30, DT)
    
'Adjust for weekend/holidays

DEADLINE = WorksheetFunction.WorkDay(DT + 1, -1, HRANGE)

End Function

作为没有 VBA 的工作表函数:

=WORKDAY(IF(Percent<2%,StartDate+120,MIN(StartDate+120,Over2+30))+1,-1,INDIRECT(Currency))

【讨论】:

  • 天啊!我完全忘记了本机 WORKDAY 函数可以与自定义假期一起使用。非常感谢:)
  • @XTW430 很高兴为您提供帮助。由于我的回答似乎满足了您的问题,如果您能将其标记为已接受,我将不胜感激。您可以阅读What should I do when someone answers my question 了解更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-20
  • 2020-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-08
  • 1970-01-01
相关资源
最近更新 更多