Board logo

標題: [發問] 逐筆比對回傳資料 [打印本頁]

作者: 蘿蔔泥    時間: 2021-1-18 15:27     標題: 逐筆比對回傳資料

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

因公司出勤無系統可用,故還請各位大大幫忙
作者: 軒云熊    時間: 2021-1-18 19:30

回復 1# 蘿蔔泥
有空幫我試試看是不是這樣的結果 感謝


javascript:;
作者: 蘿蔔泥    時間: 2021-1-26 16:20

本帖最後由 蘿蔔泥 於 2021-1-26 16:33 編輯

回復 2# 軒云熊


    是的,謝謝

不好意思,這部分我不懂是意思,可以跟您請教嗎?
            A = Arr(x, 1) & "|" & Arr(x, 2) & "|" & Brr(3, 1) & "|" & Brr(3, 2) & "|" & Brr(3, 3) & "|" & Sheets(2).Cells(3, 4)
            A = Split(A, "|")
            For Y = 1 To 6
           Sheets(3).Cells(Rows.Count, Y).End(xlUp)(2) = A(Y - 1)

Public Sub 特休統計練習()
    Application.ScreenUpdating = False
   
    Arr = [特休天數!A1].CurrentRegion
    Brr = [登錄!A1].CurrentRegion
   
    For x = 2 To UBound(Arr)
        If Brr(1, 2) = Arr(x, 1) And _
        Brr(3, 2) >= Arr(x, 4) And _
        Brr(3, 2) <= Arr(x, 5) Then
            Sheets(2).Cells(3, 4) = Arr(x, 8)
            Sheets(1).Cells(x, 9) = _
            Sheets(1).Cells(x, 9) + Brr(3, 3)
            A = Arr(x, 1) & "|" & Arr(x, 2) & "|" & _
            Brr(3, 1) & "|" & Brr(3, 2) & "|" & _
            Brr(3, 3) & "|" & Sheets(2).Cells(3, 4)
            A = Split(A, "|")
            For Y = 1 To 6
                Sheets(3).Cells(Rows.Count, Y).End(xlUp)(2) = A(Y - 1)
            Next Y
        Exit For
        End If
    Next x
   
    Application.ScreenUpdating = True
End Sub

作者: 軒云熊    時間: 2021-1-26 20:50

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

回復 3# 蘿蔔泥
其實 用字典方式比較好 但我還在學習中.. 所以用了比較笨的方式   
以下只是串聯文字
A = Arr(x, 1) & "|" & Arr(x, 2) & "|" & Brr(3, 1) & "|" & Brr(3, 2) & "|" & Brr(3, 3) & "|" & Sheets(2).Cells(3, 4)

然後再分割到儲存格
A = Split(A, "|")
For Y = 1 To 6
           Sheets(3).Cells(Rows.Count, Y).End(xlUp)(2) = A(Y - 1)

謝謝你願意花時間幫我測試  謝謝你
作者: 蘿蔔泥    時間: 2021-1-27 14:19

回復 4# 軒云熊


            a = Arr(x, 1) & "|" & Arr(x, 2) & "|" & _
            Brr(3, 1) & "|" & Brr(3, 2) & "|" & _
            Brr(3, 3) & "|" & Sheets(2).Cells(3, 4)
            a = Split(a, "|")
            For Y = 1 To 6
                Sheets(3).Cells(Rows.Count, Y).End(xlUp)(2) = a(Y - 1)
            Next Y
           Exit For

不好意思再請教一下,Sheets(3).Cells(Rows.Count, Y).End(xlUp)(2)的部分,
Sheets(3).Cells(Rows.Count, Y)這是會抓到最後一筆資料的列數,加上End(xlUp)(2)選取下一列空格,可我不了解End(xlUp)(2)指的是?(2)又有啥意思呢?為什麼選取下一列不是用End(xlDown)?
另外,a(Y - 1)因為是陣列所以A(0)是第一的意思嗎?

還在努力學習中,所以有些指令看不太懂,如果造成困擾還請見諒
作者: 准提部林    時間: 2021-1-27 17:12

工號 W0008
2020/4/24 請特休3天
則108年度有2天..4/24.4/25, 109年有1天..4/26
作者: 軒云熊    時間: 2021-1-27 20:45

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

回復 5# 蘿蔔泥

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


謝謝準大幫忙回復 感謝
作者: jcchiang    時間: 2021-1-28 12:35

本帖最後由 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
作者: 軒云熊    時間: 2021-1-29 04:57

回復 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
複製代碼

作者: 准提部林    時間: 2021-1-29 10:14

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

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

回復 10# 准提部林

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

   
[attach]33015[/attach]
作者: 准提部林    時間: 2021-1-29 16:28

回復 11# 軒云熊


這跟萬年曆沒有關係,
每年政府都會公佈隔年的節日及補班日,
所以幾乎每年都要建一個年度日期對照表!!!
請特休, 也只跟今年及明年有關係
作者: 軒云熊    時間: 2021-1-29 18:21

回復 12# 准提部林

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


javascript:;
作者: 准提部林    時間: 2021-1-31 09:54

回復 13# 軒云熊


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




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