Board logo

標題: [發問] 將員工假期按糧期到出在薪資單 [打印本頁]

作者: missbb    時間: 2023-9-12 22:53     標題: 將員工假期按糧期到出在薪資單

本帖最後由 missbb 於 2023-9-12 22:57 編輯

[attach]36802[/attach]

本人有一個工作表紀錄員工不同日期的假期, 另每月糧期要發出薪金單, 將屬於按糧期的假期列在薪金單, 請問用那一個程可以做到?

難度是假期日期要與糧期(如糧期是2023/9/1, 要將2023/9/1-2023/9/30內的假期抽出條列, 並按假期類別排列)

例如:
AL 2023/9/4 1日
SL 2023/9/6  1日
AL 2023/9/12 1日


要排列為
AL 2023/9/4 1日
AL 2023/9/12 1日
SL 2023/9/6  1日

凡請指導
作者: hcm19522    時間: 2023-9-13 16:56

本帖最後由 hcm19522 於 2023-9-13 17:08 編輯

https://hcm19522.blogspot.com/2023/09/11793.html
作者: Andy2483    時間: 2023-9-14 11:06

回復 1# missbb


    謝謝前輩發表此主題與範例
後學藉此帖練習陣列與字典,學習方案如下,請前輩參考
[attach]36805[/attach]

假期表:
[attach]36806[/attach]

假期表執行結果:
[attach]36807[/attach]

假期2表:
[attach]36808[/attach]

假期2表執行結果:
[attach]36809[/attach]

Option Explicit
Sub TEST()
Dim Brr, Crr, Z, Q, i&, j%, v&, Y, T$, R&, n%, vD$, xU As Range, w&, xA As Range, Zn%
Set Z = CreateObject("Scripting.Dictionary")
Set Y = CreateObject("Scripting.Dictionary")
Set xA = [結果!A1]
If Not IsDate([H1]) Then MsgBox "先輸入正確糧期": [H1].Activate: Exit Sub
vD = Format([H1], "YYYY/MM")
Brr = Range([D1], Cells(Rows.Count, "A").End(3))
For i = 2 To UBound(Brr)
   If Brr(i, 1) = "" Then GoTo i01 Else Y(Brr(i, 1)) = 0
   If Format(Brr(i, 3), "YYYY/MM") <> vD Then GoTo i01
   If Brr(i, 2) = "NPSL" Then Z(Brr(i, 2) & Brr(i, 3)) = Brr(i, 3): GoTo i01
   R = R + 1: For j = 1 To 4: Brr(R, j) = Brr(i, j): Next
i01: Next
Zn = Z.Count: If Zn = 0 Then MsgBox vD & " 糧期沒有 NPSL 的資料": Exit Sub
If R = 0 Then MsgBox "沒有吻合糧期的資料": Exit Sub
With Sheets("結果").[A1].Resize(R, 4)
   Union(.Cells, .Offset(0, 2)).EntireColumn.Clear
   .Value = Brr
   .Sort KEY1:=.Item(1), Order1:=1, Key2:=.Item(3), Order2:=1, Header:=2
   .Sort KEY1:=.Item(1), Order1:=1, Key2:=.Item(2), Order2:=1, Header:=2
   Brr = .Value: .Clear
End With
For i = 1 To UBound(Brr)
   T = Brr(i, 1):
   If Y(T & "|") = "" Then Y(T & "|") = i Else Y(T) = Y(T) + 1
Next
Set xU = xA
For Each Q In Y.keys
   If InStr(Q, "|") Then Exit For
   Set xU = Union(xU, xA.Offset(w, 0))
   w = w + 8 + Y(Q) + Zn: If Y(Q) Then w = w + 3
Next
[F1:K45].Copy xU: Application.Goto xA
Set xA = [A1].Resize(w, 6)
For i = 7 To 10: xA.Borders(i).Weight = 4: Next
Crr = xA
w = 0
For Each Q In Y.keys
   If InStr(Q, "|") Then Exit For
   v = 2 + w
   Crr(v, 3) = Q
   v = v + 5
   If Y(Q) Then
      For i = Y(Q & "|") To Y(Q & "|") + Y(Q)
         v = v + 1: For j = 2 To 4: Crr(v, j) = Brr(i, j): Next
      Next
   End If
   For i = 1 To Zn
      n = IIf(Y(Q), 2, 0): n = n + v + i
      Crr(n, 2) = "NPSL": Crr(n, 3) = Z.Items()(i - 1): Crr(n, 4) = 1
   Next
   w = w + 8 + Y(Q) + Zn: If Y(Q) Then w = w + 3
Next
xA = Crr
Set Z = Nothing: Erase Brr, Crr
End Sub




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)