返回列表 上一主題 發帖

[發問] 請問如何找出最接近日期

回復 7# 准提部林

謝謝准提部林大大的幫忙,不過公式有些會出問題:
例:
輸入202307_B 時,公式應該要回傳「202305_B」, 但卻跳出202307_B
輸入202212_A時,公式應該要回傳「無」, 但卻跳出202212_A

TOP

回復 9# gaishutsusuru


    謝謝論壇,謝謝前輩回復
後學今天複習方案,心得註解如下,請前輩參考,請各位前輩指教

Option Explicit
Function GetSerial(ST$)
'↑自訂函數GetSerial() 宣告變數:輸入函數的 ST變數是 字串
Dim Brr, X, Q, Z$, K$, V0$, V1$, T0$, T1$, i&, M%, Y%
'↑宣告變數:(Z,K,V0,V1,T0,T1)是字串變數,i是長整數變數,
'(Y,M)是短整數變數,(Brr,X,Q)是通用型變數

Dim D As Date, P As Date, P1 As Date
'↑(D,P,P1)是日期變數
Brr = Range([A1], Cells(Rows.Count, 1).End(3))
'↑令Brr這通用型變數是二維陣列,以[A1]到A欄最後一個有內容儲存格值帶入
T0 = ST: V0 = Mid(T0, InStr(T0, "_") + 1)
'↑令T0這字串變數是 使用者輸入函數裡的儲存格值,
'令V0這字串變數是 T0變數取底線字元(不含)後的所有字元組成的新字串

Y = Left(Val(T0), 4): M = Val(Right(Val(T0), 2))
'↑令Y這短整數是 T0變數轉整數數值後取左側4字元的數值,
'↑令M這短整數是 T0變數轉整數數值後取右側2字元的數值

D = CDate(Y & "/" & M & "/01")
'↑令D這日期變數是 Y變數連接"/",再連接M變數,最後連接"/01"組成的日期
For i = 1 To UBound(Brr)
'↑設順迴圈!i從1到 Brr陣列縱向最大索引列號
   T1 = Brr(i, 1): V1 = Mid(T1, InStr(T1, "_") + 1)
   '↑令T1這字串變數是 i迴圈列第1欄Brr陣列值,
   '令V1這字串變數是 T1變數取底線字元(不含)後的所有字元組成的新字串

   Y = Left(Val(T1), 4): M = Val(Right(Val(T1), 2))
   '↑令Y這短整數是 T1變數轉整數數值後取左側4字元的數值,
   '↑令M這短整數是 T1變數轉整數數值後取右側2字元的數值

   Y = Y + M \ 12: M = M Mod 12 + 1
   '↑令Y變數是 自身+(M變數除12的整數商)
   '令M變數是 自身除12後的餘數,再+1

   P = CDate(Y & "/" & M & "/01") - 1
   '↑令P這日期變數是 Y變數連接"/",再連接M變數,
   '最後連接"/01"組成的前一天日期(求前一個月的最後一天)

   If (T0 = T1) + (V0 <> V1) + (P > D) Then GoTo i01
   '↑如果這三個條件的其中一個不是0!就跳到 i01位置繼續執行
   If P1 - Date < P - Date Then
   '↑如果P1變數-今天日期 小於 P變數-今天日期?
      P1 = P: Z = Format(P1, "YYYYMM") & "_" & V0
      '↑令P1變數裝P變數,令Z這字串變數是 P1變數轉4碼年2碼月,
      '再連接底線字元,最後連接V0變數的新字串

   End If
i01: Next
GetSerial = IIf(Z <> "", Z, "無")
'↑回傳值給自訂函數:
'如果Z變數不是空字元就回傳Z變數,否則回傳"無"字元

Erase Brr
'↑令釋放變數
End Function
用行動裝置瀏覽論壇學習很方便,謝謝論壇經營團隊
請大家一起上論壇來交流

TOP

回復 11# gaishutsusuru


把 <= 改成 <

TOP

        靜思自在 : 我們最大的敵人不是別人.可能是自己。
返回列表 上一主題