- 帖子
- 1447
- 主題
- 40
- 精華
- 0
- 積分
- 1471
- 點名
- 0
- 作業系統
- Windows 7
- 軟體版本
- Excel 2010 & 2016
- 閱讀權限
- 50
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2020-7-15
- 最後登錄
- 2025-5-5
|
12#
發表於 2023-4-26 09:03
| 只看該作者
回復 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 |
|