自定義函數 dset 代碼:
Function dset(rge As Range, dd As Date, Optional pp As Integer) As Date
If rge.Columns.Count < 4 Then Exit Function
If IsMissing(pp) Then pp = 1
Select Case pp
Case 2
d = dd - Day(dd)
Case 3
d = dd - Weekday(dd)
Case 4
d = dd - 1
Case Else
d = DateSerial(Year(dd) - 1, 12, 31)
End Select
For t = 1 To rge.Rows.Count
If rge.Cells(t, 4) <> "R" Then
dx = rge(t, 1)
End If
If rge.Cells(t, 1) >= d Then
dset = dx
Exit Function
End If
Next
End Function
在 計算表
A3輸入 =dset(日曆!A3:D60000,A1,1)
A4輸入 =dset(日曆!A3:D60000,A1,2)
A5輸入 =dset(日曆!A3:D60000,A1,3)
A6輸入 =dset(日曆!A3:D60000,A1,4)
公式結構:
dset(資料庫範圍,目標日期,[選擇性參數: 1=上年;2=上月;3=上週;4=上日])
忽略參數, 參數大于4, 或小于1, 將被默認為1, 即上年
如有輸入錯誤或找不到, 傳回 1900/1/0
另我覺得將資料庫的範圍放在公式上是有必要的, 好處是可隨時轉用其他工作表/資料庫, 而資料庫內容如有編輯, 公式亦可馬上自動更新。
樓上的巨集, 正統及做足程序, 可作教材。
但編程猶如作家寫文章, 各人有各人風格/佈局/用詞, 我只將我這個自學消閑的老人家所寫的自家風格代碼供樓主多一個選擇。