Tính tổng số giờ công theo từng nhóm phép (3 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Tôi tuân thủ nội quy khi đăng bài

Masu1991

Thành viên hoạt động
Tham gia
21/3/20
Bài viết
110
Được thích
14
Chào Anh Chị và các Bạn,

MÌnh có 1 file với dữ liệu tương đối lớn, xin nhờ anh chị giúp đỡ lấy dữ liệu với các tiêu chí:

Tính tổng theo mã số thẻ cho các cột sau:
+ số ngày công yêu cầu (G): tính tổng cột AA ở sheet data
+ số giờ công thực tế(H): Tính tổng cột AB ở sheet data
+ số giờ tăng ca (O): Tính tổng cột AO ở sheet data

Tính tổng các nhóm phép theo mã số thẻ và loại phép theo nhóm phép tương ứng
  • Phép năm
  • Phép việc riêng
  • Phép bệnh
  • Phép khác
  • Không phép
  • Phép hưởng lương
Ví dụ:
cột AJ (sheet data ) có dữ liệu là: VN-PN(8)-07:45~16:45 thì: cột PHÉP NĂM (sheet t1) sẽ là 8. (tức là lấy sô trong dấu ngoặc tương ứng VN-PN)

cột AJ (sheet data ) có dữ liệu là: VN-FH2(4)-14:00~18:00,VN-RP(4)-18:00~22:00 thì kết quả cột PHÉP NĂM (sheet t1) sẽ là 4 và cột PHÉP VIỆC riêng (sheet t1) sẽ là 4

Xin cảm ơn
Anh Chị và các Bạn đã hỗ trợ ạ
 

File đính kèm

Lần chỉnh sửa cuối:
Chào Anh Chị và các Bạn,

MÌnh có 1 file với dữ liệu tương đối lớn, xin nhờ anh chị giúp đỡ lấy dữ liệu với các tiêu chí:

Tính tổng theo mã số thẻ cho các cột sau:
+ số ngày công yêu cầu (G): tính tổng cột AA ở sheet data
+ số giờ công thực tế(H): Tính tổng cột AB ở sheet data
+ số giờ tăng ca (O): Tính tổng cột AO ở sheet data

Tính tổng các nhóm phép theo mã số thẻ và loại phép theo nhóm phép tương ứng
  • Phép năm
  • Phép việc riêng
  • Phép bệnh
  • Phép khác
  • Không phép
  • Phép hưởng lương
Ví dụ:
cột AJ (sheet data ) có dữ liệu là: VN-PN(8)-07:45~16:45 thì: cột PHÉP NĂM (sheet t1) sẽ là 8. (tức là lấy sô trong dấu ngoặc tương ứng VN-PN)

cột AJ (sheet data ) có dữ liệu là: VN-FH2(4)-14:00~18:00,VN-RP(4)-18:00~22:00 thì kết quả cột PHÉP NĂM (sheet t1) sẽ là 4 và cột PHÉP VIỆC riêng (sheet t1) sẽ là 4

Xin cảm ơn
Anh Chị và các Bạn đã hỗ trợ ạ
Trong khi chờ các giải pháp khác hãy thử xem code này xem sao.
Mã:
Option Explicit

Sub MaSu()
Dim i&, j&, Lr&, t&, k&, v1&, v2&, P&
Dim Arr(), ArrF(), KQ(), S, F As String
Dim Dic As Object, DicF As Object, Key, Tmp, Temp
Dim Ws As Worksheet, Sh As Worksheet
Set Ws = Sheets("t1")
ArrF = Ws.Range("T2:V24").Value
Set DicF = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(ArrF)
    Temp = Split(ArrF(i, 1), "-")
    If Not DicF.exists(Temp(1)) Then DicF.Add (Temp(1)), ArrF(i, 3)
Next i
Set Sh = Sheets("data")
Lr = Sh.Cells(Rows.Count, 9).End(xlUp).Row
Arr = Sh.Range("A3:AO" & Lr).Value

Set Dic = CreateObject("Scripting.Dictionary")
ReDim KQ(1 To UBound(Arr), 1 To 15)
For i = 1 To UBound(Arr)
    Key = Arr(i, 9)
        If Not Dic.exists(Key) Then
            t = t + 1: Dic.Add (Key), t
            KQ(t, 1) = Arr(i, 4)
            KQ(t, 2) = Arr(i, 5)
            KQ(t, 4) = Arr(i, 13)
            KQ(t, 5) = Arr(i, 9)
            KQ(t, 6) = Arr(i, 10)
            KQ(t, 7) = Arr(i, 27)
            KQ(t, 8) = Arr(i, 28)
            KQ(t, 15) = Arr(i, 41)
            If Arr(i, 36) <> Empty Then
                S = Split(Arr(i, 36), ",")
                For j = 0 To UBound(S)
                    Tmp = Split(S(j), "-")
                    v1 = InStr(1, Tmp(1), "("): v2 = InStr(1, Tmp(1), ")")
                    P = -1 * Mid(Tmp(1), v1, 1 + v2 - v1)
                    F = Mid(Tmp(1), 1, v1 - 1)
                    If DicF.exists(F) Then
                        Col = DicF.Item(F): KQ(t, Col) = P
                    End If
                Next j
            End If
        Else
            k = Dic.Item(Key)
            KQ(k, 7) = KQ(k, 7) + Arr(i, 27)
            KQ(k, 8) = KQ(k, 8) + Arr(i, 28)
            KQ(k, 14) = KQ(k, 14) + Arr(i, 41)
            If Arr(i, 36) <> Empty Then
                S = Split(Arr(i, 36), ",")
                For j = 0 To UBound(S)
                    Tmp = Split(S(j), "-")
                    v1 = InStr(1, Tmp(1), "("): v2 = InStr(1, Tmp(1), ")")
                    P = -1 * Mid(Tmp(1), v1, 1 + v2 - v1)
                    F = Mid(Tmp(1), 1, v1 - 1)
                    If DicF.exists(F) Then
                        Col = DicF.Item(F): KQ(k, Col) = KQ(k, Col) + P
                    End If
                Next j
            End If
        End If
Next i

If t Then
    Ws.Range("A70").Resize(10000, 15).ClearContents
    Ws.Range("A70").Resize(t, 15) = KQ
End If
Set Dic = Nothing
MsgBox "Xong"
End Sub
Nhấn nút chạy Code để được kết quả ở A70.....
 

File đính kèm

Upvote 0
Trong khi chờ các giải pháp khác hãy thử xem code này xem sao.
Mã:
Option Explicit

Sub MaSu()
Dim i&, j&, Lr&, t&, k&, v1&, v2&, P&
Dim Arr(), ArrF(), KQ(), S, F As String
Dim Dic As Object, DicF As Object, Key, Tmp, Temp
Dim Ws As Worksheet, Sh As Worksheet
Set Ws = Sheets("t1")
ArrF = Ws.Range("T2:V24").Value
Set DicF = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(ArrF)
    Temp = Split(ArrF(i, 1), "-")
    If Not DicF.exists(Temp(1)) Then DicF.Add (Temp(1)), ArrF(i, 3)
Next i
Set Sh = Sheets("data")
Lr = Sh.Cells(Rows.Count, 9).End(xlUp).Row
Arr = Sh.Range("A3:AO" & Lr).Value

Set Dic = CreateObject("Scripting.Dictionary")
ReDim KQ(1 To UBound(Arr), 1 To 15)
For i = 1 To UBound(Arr)
    Key = Arr(i, 9)
        If Not Dic.exists(Key) Then
            t = t + 1: Dic.Add (Key), t
            KQ(t, 1) = Arr(i, 4)
            KQ(t, 2) = Arr(i, 5)
            KQ(t, 4) = Arr(i, 13)
            KQ(t, 5) = Arr(i, 9)
            KQ(t, 6) = Arr(i, 10)
            KQ(t, 7) = Arr(i, 27)
            KQ(t, 8) = Arr(i, 28)
            KQ(t, 15) = Arr(i, 41)
            If Arr(i, 36) <> Empty Then
                S = Split(Arr(i, 36), ",")
                For j = 0 To UBound(S)
                    Tmp = Split(S(j), "-")
                    v1 = InStr(1, Tmp(1), "("): v2 = InStr(1, Tmp(1), ")")
                    P = -1 * Mid(Tmp(1), v1, 1 + v2 - v1)
                    F = Mid(Tmp(1), 1, v1 - 1)
                    If DicF.exists(F) Then
                        Col = DicF.Item(F): KQ(t, Col) = P
                    End If
                Next j
            End If
        Else
            k = Dic.Item(Key)
            KQ(k, 7) = KQ(k, 7) + Arr(i, 27)
            KQ(k, 8) = KQ(k, 8) + Arr(i, 28)
            KQ(k, 14) = KQ(k, 14) + Arr(i, 41)
            If Arr(i, 36) <> Empty Then
                S = Split(Arr(i, 36), ",")
                For j = 0 To UBound(S)
                    Tmp = Split(S(j), "-")
                    v1 = InStr(1, Tmp(1), "("): v2 = InStr(1, Tmp(1), ")")
                    P = -1 * Mid(Tmp(1), v1, 1 + v2 - v1)
                    F = Mid(Tmp(1), 1, v1 - 1)
                    If DicF.exists(F) Then
                        Col = DicF.Item(F): KQ(k, Col) = KQ(k, Col) + P
                    End If
                Next j
            End If
        End If
Next i

If t Then
    Ws.Range("A70").Resize(10000, 15).ClearContents
    Ws.Range("A70").Resize(t, 15) = KQ
End If
Set Dic = Nothing
MsgBox "Xong"
End Sub
Nhấn nút chạy Code để được kết quả ở A70.....
Bạn @HUONGHCKT phong độ vẫn ổn định nhỉ
 
Upvote 0
Trong khi chờ các giải pháp khác hãy thử xem code này xem sao.
Mã:
Option Explicit

Sub MaSu()
Dim i&, j&, Lr&, t&, k&, v1&, v2&, P&
Dim Arr(), ArrF(), KQ(), S, F As String
Dim Dic As Object, DicF As Object, Key, Tmp, Temp
Dim Ws As Worksheet, Sh As Worksheet
Set Ws = Sheets("t1")
ArrF = Ws.Range("T2:V24").Value
Set DicF = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(ArrF)
    Temp = Split(ArrF(i, 1), "-")
    If Not DicF.exists(Temp(1)) Then DicF.Add (Temp(1)), ArrF(i, 3)
Next i
Set Sh = Sheets("data")
Lr = Sh.Cells(Rows.Count, 9).End(xlUp).Row
Arr = Sh.Range("A3:AO" & Lr).Value

Set Dic = CreateObject("Scripting.Dictionary")
ReDim KQ(1 To UBound(Arr), 1 To 15)
For i = 1 To UBound(Arr)
    Key = Arr(i, 9)
        If Not Dic.exists(Key) Then
            t = t + 1: Dic.Add (Key), t
            KQ(t, 1) = Arr(i, 4)
            KQ(t, 2) = Arr(i, 5)
            KQ(t, 4) = Arr(i, 13)
            KQ(t, 5) = Arr(i, 9)
            KQ(t, 6) = Arr(i, 10)
            KQ(t, 7) = Arr(i, 27)
            KQ(t, 8) = Arr(i, 28)
            KQ(t, 15) = Arr(i, 41)
            If Arr(i, 36) <> Empty Then
                S = Split(Arr(i, 36), ",")
                For j = 0 To UBound(S)
                    Tmp = Split(S(j), "-")
                    v1 = InStr(1, Tmp(1), "("): v2 = InStr(1, Tmp(1), ")")
                    P = -1 * Mid(Tmp(1), v1, 1 + v2 - v1)
                    F = Mid(Tmp(1), 1, v1 - 1)
                    If DicF.exists(F) Then
                        Col = DicF.Item(F): KQ(t, Col) = P
                    End If
                Next j
            End If
        Else
            k = Dic.Item(Key)
            KQ(k, 7) = KQ(k, 7) + Arr(i, 27)
            KQ(k, 8) = KQ(k, 8) + Arr(i, 28)
            KQ(k, 14) = KQ(k, 14) + Arr(i, 41)
            If Arr(i, 36) <> Empty Then
                S = Split(Arr(i, 36), ",")
                For j = 0 To UBound(S)
                    Tmp = Split(S(j), "-")
                    v1 = InStr(1, Tmp(1), "("): v2 = InStr(1, Tmp(1), ")")
                    P = -1 * Mid(Tmp(1), v1, 1 + v2 - v1)
                    F = Mid(Tmp(1), 1, v1 - 1)
                    If DicF.exists(F) Then
                        Col = DicF.Item(F): KQ(k, Col) = KQ(k, Col) + P
                    End If
                Next j
            End If
        End If
Next i

If t Then
    Ws.Range("A70").Resize(10000, 15).ClearContents
    Ws.Range("A70").Resize(t, 15) = KQ
End If
Set Dic = Nothing
MsgBox "Xong"
End Sub
Nhấn nút chạy Code để được kết quả ở A70.....
Cảm ơn anh rất nhiều ạ.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom