編輯澄清:返回的日期必須小於當前日期的 24 個月,因為這是到期日期,除非續訂,否則項目必須在正確的時間到期。另一種說法是,該日期需要盡可能接近 2 年續約週期,但不能超過 2 年。
原文:早安!我一直在谷歌上進行篩選,但一無所獲,所以我希望我能幫忙創建一個公式。我需要建立一個不引用其他儲存格的公式,因為我希望限制其他使用者的錯誤數量:)
我需要什麼:找到 03/31 或 09/30 的下一個實例,該實例距離今天大於 18 個月但小於 24 個月。
根據我上面的措辭,我覺得今天、或、<、> 和月/日標識符的某種組合會給我我正在尋找的東西,但我在操作順序上遇到了困難。目前,我的同事正在使用表格(如下)來手動計算這些日期,這很乏味。
- 四月 - 九月單數 = 下個三月單數
- 四月 - 九月偶數 = 三月下偶數
- 10 月偶數 - 3 月奇數 = 9 月次日偶數
- 10 月奇數 - 3 月偶數 = 9 月下奇數
預先感謝您的任何意見,如果我在工作後想出一個粗略的公式,我會編輯這個!
答案1
這是一個易於理解、基於公式的非陣列解決方案,適用於 Excel 2010(及舊版本)。它使用輔助列(可以隱藏)。
由於<24個月和>18個月的要求並不總是能夠滿足,而硬性要求是<24個月,所以我將另一端的要求放寬到>=18個月。
對於任何給定日期,只有三個可能的目標日期:自該日期起 18 個月內當年的 3/31 或 9/30,或次年的 3/31。您只需選擇第一個符合條件的即可。
該問題指定基於 TODAY 的結果。我還想展示這在其他「今天」的表現。單元格 A2 包含=TODAY()
. A 列中的其他儲存格只是用來說明的一些其他日期;尤其是與 3/31 和 9/30 相關的「邊界日期」。公式引用日期儲存格,但 TODAY() 可以改為硬編碼。
I:J 列僅用於說明。它們顯示 A 日期列中的 18 個月和 24 個月的日期,以幫助理解選擇結果值的原因。
輔助列是 C:E。這些包含 A 列中日期的三個候選目標日期。
=DATE(YEAR(EDATE(A2,18)),3,31)
這將建立距離 A 列日期 18 個月內的日期 3/31。 D2 中的目標 2 包含:
=DATE(YEAR(EDATE(A2,18)),9,30)
這將建立距 A 列日期 18 個月內的日期 9/30。 E2 中的目標 3 包含:
=DATE(YEAR(EDATE(A2,18))+1,3,31)
這將建立 A 列日期之後 18 個月後一年中的日期 3/31。
結果在G列。
=SUMPRODUCT((C2:E2<EDATE(A2,24))*(C2:E2>=EDATE(A2,18))*C2:E2)
由於要求的原因,只有一個目標日期符合資格。 SUMPRODUCT 處理陣列與普通(非陣列)公式的比較。
C2:E2<EDATE(A2,24)
根據每個目標日期距離 A 列日期是否小於 24 個月,傳回 TRUE/FALSE (1/0)。
C2:E2>=EDATE(A2,18)
同樣,根據每個目標日期距 A 列日期是否 >= 18 個月,傳回 1/0。
只有一個目標日期符合這兩個條件,因此這些 1/0 值的乘積將適用1
於該日期和0
其他兩個日期。此乘積將乘以每個目標日期儲存格中的值。由於日期儲存為數字,因此結果是代表合格目標日期的數字。只需將其格式化為日期即可。
答案2
以下使用者定義的函數首先建立從今天起 18 到 24 個月的日曆範圍。然後,它會在範圍內循環,直到找到符合您條件的日期:
Public Function ProjDate() As Date
Dim d1 As Date, d2 As Date, y As Long
Dim dd As Date, d As Long, m As Long
d = Day(Date)
m = Month(Date)
y = Year(Date)
d1 = DateSerial(y, m + 18, d + 1)
d2 = DateSerial(y, m + 24, d - 1)
For dd = d1 To d2
d = Day(dd)
m = Month(dd)
If (m = 3 And d = 31) Or (m = 9 And d = 30) Then
ProjDate = dd
Exit Function
End If
Next dd
End Function
使用者定義函數 (UDF) 非常容易安裝並使用:
- ALT-F11 調出 VBE 窗口
- ALT-I ALT-M 開啟新模組
- 將內容貼進去並關閉 VBE 窗口
如果儲存工作簿,UDF 將隨之儲存。如果您使用的是 2003 年以後的 Excel 版本,則必須將檔案另存為 .xlsm 而不是 .xlsx
到消除UDF:
- 如上所示調出 VBE 窗口
- 清除程式碼
- 關閉VBE視窗
到使用來自 Excel 的 UDF:
=我的函數(A1)
要了解有關巨集的更多信息,請參閱:
http://www.mvps.org/dmcritchie/excel/getstarted.htm
和
http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx
有關 UDF 的詳細信息,請參閱:
http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx
必須啟用巨集才能使其工作!
答案3
這是一個公式。正如所寫,為了測試,它引用了A1
.但是,如果您發現它會傳回預期結果,您可以替換A1
為:TODAY()
=MAX((MONTH(EDATE(A1-DAY(A1)+1,{18;19;20;21;22;23;24}))={4,10})*EDATE(A1-DAY(A1)+1,{18;19;20;21;22;23;24}))-1
上面是一個大批公式。
由於這是一個數組公式,因此您需要按住ctrl+ 的shift同時點擊 來「確認」它enter。如果運算正確,Excel 會{...}
在公式周圍放置大括號,如公式欄所示
如果你想避免CSE
進入程序,你可以嘗試稍微長一點的:
=AGGREGATE( 14,4,(MONTH(EDATE(A1-DAY(A1)+1,{18;19;20;21;22;23;24}))={4,10})*EDATE(A1-DAY(A1)+1,{18;19;20;21;22;23;24}),1)-1