【发布时间】: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?这可以通过工作表函数来完成。