返回列表 上一主題 發帖

[發問] 逐筆比對回傳資料

[發問] 逐筆比對回傳資料

各位大大好
小妹我想做個特休統計,因我司特休是周年制,故每個人的年度特休期間都不相同,
不知道VBA可以做到日期區間的判斷並回傳年度嗎?
我預計將每個人年度特休區間的日期放在特休天數sheet裡,在登錄sheet輸入完相關資料後會幫我判斷請的是哪個年度特休

因公司出勤無系統可用,故還請各位大大幫忙

特休統計.zip (15.2 KB)

回復 13# 軒云熊


請假也許是一天, 或半天, 或幾小時幾分的, 越弄越複雜,
還是看題主的意思吧!
我是覺得, 這用手動登錄較不出錯, 應該都有請假單,
或者, 出勤系統也會有這種設置.

TOP

回復 12# 准提部林

回準大補班的條件我加了 如果有多餘的時間 可以幫我看看 是不是這樣的邏輯 麻煩你了  


javascript:;

特休統計0129.rar (103.29 KB)

TOP

回復 11# 軒云熊


這跟萬年曆沒有關係,
每年政府都會公佈隔年的節日及補班日,
所以幾乎每年都要建一個年度日期對照表!!!
請特休, 也只跟今年及明年有關係

TOP

本帖最後由 軒云熊 於 2021-1-29 16:19 編輯

回復 10# 准提部林

準大 這是有加入萬年曆(網路上找的稍微修改假日) 的方式有扣除列假日 大概隨意設定了幾個項目 有空可以幫我看看 有沒有達到你給的題目要求 缺點就是 有點慢 因為程式太長了
感覺我的邏輯有問題的樣子.   麻煩你了

   
[attach]33015[/attach]

特休統計練習.rar (54.88 KB)

TOP

題主這檔案應是草稿性質,其實還有諸多實際問題,
1) 可能上午有上班, 下午臨時有事, 又不能請事假(會扣錢), 只能用半天抵特休
2) 特休連續日期中遇例假日, 這總不能算進去吧!
3) 例假日中的周六, 有時又是調休的補班日, 那又可以算進去?

TOP

回復 6# 准提部林

抱歉 沒有發現準大在提醒我 .. 但這寫法 沒有 jcchiang 大大的好
  1. Public Sub 字典運用練習()
  2.     Application.ScreenUpdating = False
  3.    
  4.     Arr = [特休天數!A1].CurrentRegion
  5.     Brr = [登錄!A1].CurrentRegion
  6.     Set xD = CreateObject("Scripting.Dictionary")
  7.    
  8.     For H = Brr(3, 2) To Brr(3, 2) + (Brr(3, 3) - 1)
  9.         xD(H) = ""
  10.     Next H
  11.    
  12.     For x = 2 To UBound(Arr)
  13.    
  14.         If Brr(1, 2) = Arr(x, 1) Then
  15.         
  16.             For Each D In xD
  17.                 R = Array(Arr(x, 1), Arr(x, 2), [登錄!A3], D, 1, Arr(x, 8))
  18.                 If D >= Arr(x, 4) And D <= Arr(x, 5) Then
  19.                
  20.                     For K = 1 To 6
  21.                         [list!A1].Cells(Rows.Count, K).End(xlUp)(2) = R(K - 1)
  22.                     Next K
  23.                 Sheets(2).Cells(3, 4) = Sheets(2).Cells(3, 4) & " " & Arr(x, 8)
  24.                 G = G + 1
  25.                 End If
  26.             Next D
  27.             
  28.         If G <> 0 Then Sheets(1).Cells(x, 9) = Sheets(1).Cells(x, 9) + G
  29.         End If
  30.    
  31.     G = 0
  32.     Next x
  33.    
  34. Application.ScreenUpdating = True
  35. End Sub
複製代碼

TOP

本帖最後由 jcchiang 於 2021-1-28 12:47 編輯

回復 1# 蘿蔔泥

試試看
Sub ex()
Dim d As Object
Dim a, b, x%
Set d = CreateObject("Scripting.Dictionary")
For Each b In Range(Sheets("登錄").[B3], Sheets("登錄").[B65536].End(3))
   For x = 0 To b.Offset(, 1) - 1
      With Sheets("特休天數")
         For Each a In Range(.[a2], .[a65535].End(3))
            If a = Sheets("登錄").[b1] And a.Offset(, 3) <= b + x And a.Offset(, 4) >= b + x Then                    
               If b.Offset(, 2) = "" Then   '將年度資料放入Sheets("登錄")
                  b.Offset(, 2) = a.Offset(, 7)
               Else
                   b.Offset(, 2) = b.Offset(, 2) & "/" & a.Offset(, 7)
               End If               
               a.Offset(, 8) = a.Offset(, 8) + 1    '將已休天數累計放入Sheets("特休天數")
               d(a & b + x) = Array(a, a.Offset(, 1), b.Offset(, -1), b + x, "1", a.Offset(, 7))
            End If
         Next
      End With
   Next
Next
Sheets("list").[a65535].End(3).Offset(1).Resize(d.Count, 6) = Application.Transpose(Application.Transpose(d.Items))
Set d = Nothing
End Sub

TOP

本帖最後由 軒云熊 於 2021-1-27 20:50 編輯

回復 5# 蘿蔔泥

(2) 會固定保持在第2欄開始
End(xlUp) 是避免每列中如果有空格也不會偵測錯誤 因為 是由下往上
如果使用 End(xlDown) 也是可以 但第一列到最後一列 中間不可以有空格 否則會少抓資料
a(Y - 1)因為是陣列所以A(0)是第一的意思嗎?   是的  
我到這裡 從0開始 到現在也還在摸索中.. 有機會就來這裡找一些題目來練習順便請大大們幫忙測試 也許會跌跌撞撞...
但到最後還是可以學習到更多的 經驗. 知識
對我來說這些都是會累積的  都是值得的  這裡是一個很好的地方 我也很喜歡這裡  
因為可以學習到很多大大的 編寫方式 與 函式的用法 還有 思考觀念  


謝謝準大幫忙回復 感謝

TOP

工號 W0008
2020/4/24 請特休3天
則108年度有2天..4/24.4/25, 109年有1天..4/26

TOP

        靜思自在 : 真正的愛心,是照顧好自己的這顆心。
返回列表 上一主題