我正在嘗試查找給定月份和貨幣的第 n 個 [例如第 1、第 2、第 3、第 4、最后] 個作業日的日期。
例如,1 月份“PLN”的 [1st, 2nd, 3rd, 4th, Last] “作業日”。
(以下日期可能有誤 - 這是示例資料)
| 日期 | 貨幣 | 日期型別 |
|---|---|---|
| 2022 年 1 月 1 日 | 波蘭茲羅提 | 元旦 |
| 2022 年 1 月 2 日 | 波蘭茲羅提 | 周末 |
| 2022 年 1 月 3 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 1 月 4 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 1 月 5 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 1 月 6 日 | 波蘭茲羅提 | 頓悟 |
| 2022 年 1 月 7 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 1 月 8 日 | 波蘭茲羅提 | 周末 |
| 2022 年 1 月 9 日 | 波蘭茲羅提 | 周末 |
| 2022 年 1 月 10 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 1 月 11 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 1 月 12 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 1 月 13 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 1 月 14 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 1 月 15 日 | 波蘭茲羅提 | 周末 |
| 2022 年 1 月 16 日 | 波蘭茲羅提 | 周末 |
| 2022 年 1 月 17 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 1 月 18 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 1 月 19 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 1 月 20 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 1 月 21 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 1 月 22 日 | 波蘭茲羅提 | 周末 |
| 2022 年 1 月 23 日 | 波蘭茲羅提 | 周末 |
| 2022 年 1 月 24 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 1 月 25 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 1 月 26 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 1 月 27 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 1 月 28 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 1 月 29 日 | 波蘭茲羅提 | 周末 |
| 2022 年 1 月 30 日 | 波蘭茲羅提 | 周末 |
| 2022 年 1 月 31 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 2 月 1 日 | 波蘭茲羅提 | 作業日 |
| 2/2/2022 | 波蘭茲羅提 | 作業日 |
| 2022 年 2 月 3 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 2 月 4 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 2 月 5 日 | 波蘭茲羅提 | 周末 |
| 2022 年 2 月 6 日 | 波蘭茲羅提 | 周末 |
| 2022 年 2 月 7 日 | 波蘭茲羅提 | 作業日 |
| 2022 年 2 月 8 日 | 波蘭茲羅提 | 作業日 |
我嘗試創建一個函式來完成這個:
Function NthBusinessDay(Nth As Variant, FcstCurrency As Variant, MonthNumber As Variant, YearNumber As Variant) As Variant
Dim varVal1 As Variant
Dim varVal2 As Variant
Dim varVal3 As Variant
Dim varVal4 As Variant
Dim rngTargetA As Range
Dim rngTargetB As Range
Dim lngRowCounter As Long
Dim ws As Worksheet
Dim wb As Workbook
varVal1 = FcstCurrency
varVal2 = MonthNumber
varVal3 = YearNumber
varVal4 = Nth
Set wb = ActiveWorkbook
Set ws = wb.Sheets("CCY_HOL_CAL(LIVE)")
lngRowCounter = 2
Set rngTargetA = ws.Range("B" & lngRowCounter)
Set rngTargetB = ws.Range("C" & lngRowCounter)
Do While Not IsEmpty(rngTargetA.Value)
If rngTargetA.Value = varVal1 And rngTargetB.Value = "Business Day" Then
FindValue = ws.Range("A" & lngRowCounter).Value
Exit Function
End If
lngRowCounter = lngRowCounter 1
Set rngTargetA = ws.Range("B" & lngRowCounter)
Set rngTargetB = ws.Range("C" & lngRowCounter)
Loop
FindValue = "Nothing"
End Function
如何使此功能在給定月份的第 n 天和最后一天有效?
Expected results:
1st Business Day = 1/3/2022
2nd Business Day = 1/4/2022
3rd Business Day = 1/5/2022
4th Business Day = 1/7/2022
Last Business Day = 1/31/2022
uj5u.com熱心網友回復:
請嘗試下一個功能。它首先根據函式引數條件(討論中的引數的作業日)創建一個日期陣列,然后Nth在陣列中提取第一天和最后一天。這些Nth天被放置在它們自己的陣列中,最后一個作為Date,在回傳的陣列第二個元素中:
Function NthBusinessDay(Nth As Long, FcstCurrency As String, MonthNumber As Long, YearNumber As Long) As Variant
Dim sh As Worksheet, lastR As Long, arr, arrFin, i As Long, k As Long, lastD As Date
Set sh = ActiveSheet
lastR = sh.Range("A" & sh.Rows.count).End(xlUp).row
arr = sh.Range("A2:C" & lastR).Value
ReDim arrFin(1 To UBound(arr)): k = 1
'build an array of dates mathing the function requirements:
For i = 1 To UBound(arr)
'Debug.Print Month(arr(i, 1)), Year(arr(i, 1)): Stop
If arr(i, 2) = FcstCurrency And Month(arr(i, 1)) = MonthNumber And _
Year(arr(i, 1)) = YearNumber And arr(i, 3) = "Business Day" Then
arrFin(k) = arr(i, 1): k = k 1
End If
Next i
ReDim Preserve arrFin(1 To k - 1)
'Prepare the data to be returned
Dim arrFrst: ReDim arrFrst(1 To Nth): k = 1
For i = 1 To UBound(arrFrst)
arrFrst(k) = arrFin(i): k = k 1
Next
'return in an array:
NthBusinessDay = Array(arrFrst, arrFin(UBound(arrFin)))
End Function
上面的函式應該以下面的方式呼叫:
Sub testNthbusinessDay()
Dim arrRet, i As Long, strBD As String
arrRet = NthBusinessDay(4, "PLN", 1, 2022)
For i = 1 To UBound(arrRet(0))
strBD = strBD & "Business Day " & i & " = " & arrRet(0)(i) & vbLf
Next i
strBD = strBD & "Last Business Day = " & arrRet(1)
MsgBox strBD
End Sub
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/419964.html
標籤:
