在 Excel 中使用 TODAY 計算特定月份內某個日期的下一個實例?

在 Excel 中使用 TODAY 計算特定月份內某個日期的下一個實例?

編輯澄清:返回的日期必須小於當前日期的 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) 非常容易安裝並使用:

  1. ALT-F11 調出 VBE 窗口
  2. ALT-I ALT-M 開啟新模組
  3. 將內容貼進去並關閉 VBE 窗口

如果儲存工作簿,UDF 將隨之儲存。如果您使用的是 2003 年以後的 Excel 版本,則必須將檔案另存為 .xlsm 而不是 .xlsx

消除UDF:

  1. 如上所示調出 VBE 窗口
  2. 清除程式碼
  3. 關閉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

相關內容