Tổng hơp các sheet chi tiết sang sheet tổng hợp dựa vào mã số (1 người xem)

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

Excel365

Thành viên tích cực
Tham gia
29/10/10
Bài viết
865
Được thích
127
Giới tính
Nam
Nhờ các anh chị giúp em viết code tổng hợp các bảng lương chi tiết sang bảng tổng hợp cả năm dựa vào mã số từng người.
Hàng tháng có phát inh người mới, do vậy khi cần tổng hợp thì người mới cũng sẽ cập nhật bên Bảng TH.
Chức danh sẽ lấy chức danh ở tháng lớn nhất (ví dụ: tháng 1 ông A chức danh là nhân viên, nhưng sang tháng 10 ông A lên có chức danh là phó phong thì bên bảng tổng hợp sẽ tự cập nhật thành chức danh phó phòng.
Rất mong được anh chị giúp đỡ.
Trân trọng cảm ơn
 

File đính kèm

Nhờ các anh chị giúp em viết code tổng hợp các bảng lương chi tiết sang bảng tổng hợp cả năm dựa vào mã số từng người.
Hàng tháng có phát inh người mới, do vậy khi cần tổng hợp thì người mới cũng sẽ cập nhật bên Bảng TH.
Chức danh sẽ lấy chức danh ở tháng lớn nhất (ví dụ: tháng 1 ông A chức danh là nhân viên, nhưng sang tháng 10 ông A lên có chức danh là phó phong thì bên bảng tổng hợp sẽ tự cập nhật thành chức danh phó phòng.
Rất mong được anh chị giúp đỡ.
Trân trọng cảm ơn

Excel mà xài biểu bảng như Word chắc oải luôn.
Nếu chịu thêm 1 cột C (Nhóm) của từng người và 2 cột phụ AE:AF trong sheet TH thì xem file này.
Nếu không chịu thì "chạy"
 

File đính kèm

Upvote 0
Excel mà xài biểu bảng như Word chắc oải luôn.
Nếu chịu thêm 1 cột C (Nhóm) của từng người và 2 cột phụ AE:AF trong sheet TH thì xem file này.
Nếu không chịu thì "chạy"
Dạ cám ơn anh. Như vây thì các sheet chi tiết cột phụ C phải làm thủ công hả anh.
Còn 2 cột AE:AF thì sử dụng như thế nào vậy anh. Có phải trong tháng cần tổng hợp bộ phận nào thì điền tên bộ phận đó vô đúng không anh
Trân trọng
 
Upvote 0
1/ Như vây thì các sheet chi tiết cột phụ C phải làm thủ công hả anh.
2/ Còn 2 cột AE:AF thì sử dụng như thế nào vậy anh. Có phải trong tháng cần tổng hợp bộ phận nào thì điền tên bộ phận đó vô đúng không anh
1/ Cột phụ C và 2 cột AE:AF bắt buộc phải có, thủ công hay công thức, hay gì đó thì tùy bạn.
2/ Cột AE là tên các tháng, cột AF là tên các nhóm cần tổng hợp, bạn cứ vọc "từa lưa" sẽ biết thôi mà.
 
Upvote 0
1/ Cột phụ C và 2 cột AE:AF bắt buộc phải có, thủ công hay công thức, hay gì đó thì tùy bạn.
2/ Cột AE là tên các tháng, cột AF là tên các nhóm cần tổng hợp, bạn cứ vọc "từa lưa" sẽ biết thôi mà.
Anh xem dùm em công thức ở cột C em làm như vậy có được chưa
=IF(AND(D10<>"";G10="");D10;IF(G10<>"";C9;D10)).
Em xin lỗi làm phiên anh thêm lần nữa, anh có thể làm thêm dòng tổng công tùng bộ phận, và tổng cộng cuối cung được không anh.
P/s: Nếu anh thấy rắc rối thì không làm cũng được ạ. em tự tinh bằng công thức
 
Lần chỉnh sửa cuối:
Upvote 0
Anh xem dùm em công thức ở cột C em làm như vậy có được chưa
=IF(AND(D10<>"";G10="");D10;IF(G10<>"";C9;D10)).
Em xin lỗi làm phiên anh thêm lần nữa, anh có thể làm thêm dòng tổng công tùng bộ phận, và tổng cộng cuối cung được không anh.
P/s: Nếu anh thấy rắc rối thì không làm cũng được ạ. em tự tinh bằng công thức

Bạn nhập vào ô AF4="TỔNG CỘNG:"
Thay Sub cũ bằng cái này, rồi tự kiểm tra kết quả xem có đúng không nhé.
PHP:
Public Sub TongHop()
Dim Dic As Object, Sh(), Nhom(), Tong(1 To 1, 1 To 20), N As Long, M As Long, I As Long, J As Long, K As Long, R As Long
Dim sArr(), dArr(1 To 1000, 1 To 28), Tem As String, ShName As String, STT As Long, X As Long
Set Dic = CreateObject("Scripting.Dictionary")
Sh = Range([AE6], [AE6].End(xlDown)).Value
Nhom = Range([AF6], [AF6].End(xlDown)).Value
For N = 1 To UBound(Nhom, 1)
    K = K + 1: R = K
    dArr(K, 4) = Nhom(N, 1)
    For M = 1 To UBound(Sh, 1)
        ShName = Sh(M, 1)
        sArr = Sheets(ShName).Range(Sheets(ShName).[C11], Sheets(ShName).[C65536].End(xlUp)).Offset(, -2).Resize(, 27).Value
        For I = 1 To UBound(sArr, 1)
            If UCase(sArr(I, 3)) = UCase(Nhom(N, 1)) Then
                Tem = sArr(I, 2)
                If Not Dic.exists(Tem) Then
                    K = K + 1: STT = STT + 1
                    Dic.Add Tem, K
                    dArr(K, 1) = STT
                    For J = 2 To 27
                        dArr(K, J) = sArr(I, J)
                        If J >= 8 Then Tong(1, J - 7) = Tong(1, J - 7) + sArr(I, J)
                    Next J
                    dArr(K, 28) = 1
                Else
                    X = Dic.Item(Tem)
                    dArr(X, 7) = sArr(I, 7)
                    For J = 8 To 27
                        dArr(X, J) = dArr(X, J) + sArr(I, J)
                        Tong(1, J - 7) = Tong(1, J - 7) + sArr(I, J)
                    Next J
                    dArr(X, 28) = dArr(X, 28) + 1
                End If
            End If
        Next I
    Next M
    For J = 1 To 20
        dArr(R, J + 7) = Tong(1, J)
        Tong(1, J) = 0
    Next J
Next N
[A10].Resize(1000, 28).ClearContents
[A10].Resize(K, 28) = dArr
[D10].Offset(K + 1).Value = [AF4].Value
[H10].Offset(K + 1).Resize(, 20).Value = "=SUM(R10C:R[-2]C)/2"
[H10].Offset(K + 1).Resize(, 20).Value = [H10].Offset(K + 1).Resize(, 20).Value
Set Dic = Nothing
End Sub
 
Upvote 0
Bạn nhập vào ô AF4="TỔNG CỘNG:"
Thay Sub cũ bằng cái này, rồi tự kiểm tra kết quả xem có đúng không nhé.
PHP:
Public Sub TongHop()
Dim Dic As Object, Sh(), Nhom(), Tong(1 To 1, 1 To 20), N As Long, M As Long, I As Long, J As Long, K As Long, R As Long
Dim sArr(), dArr(1 To 1000, 1 To 28), Tem As String, ShName As String, STT As Long, X As Long
Set Dic = CreateObject("Scripting.Dictionary")
Sh = Range([AE6], [AE6].End(xlDown)).Value
Nhom = Range([AF6], [AF6].End(xlDown)).Value
For N = 1 To UBound(Nhom, 1)
    K = K + 1: R = K
    dArr(K, 4) = Nhom(N, 1)
    For M = 1 To UBound(Sh, 1)
        ShName = Sh(M, 1)
        sArr = Sheets(ShName).Range(Sheets(ShName).[C11], Sheets(ShName).[C65536].End(xlUp)).Offset(, -2).Resize(, 27).Value
        For I = 1 To UBound(sArr, 1)
            If UCase(sArr(I, 3)) = UCase(Nhom(N, 1)) Then
                Tem = sArr(I, 2)
                If Not Dic.exists(Tem) Then
                    K = K + 1: STT = STT + 1
                    Dic.Add Tem, K
                    dArr(K, 1) = STT
                    For J = 2 To 27
                        dArr(K, J) = sArr(I, J)
                        If J >= 8 Then Tong(1, J - 7) = Tong(1, J - 7) + sArr(I, J)
                    Next J
                    dArr(K, 28) = 1
                Else
                    X = Dic.Item(Tem)
                    dArr(X, 7) = sArr(I, 7)
                    For J = 8 To 27
                        dArr(X, J) = dArr(X, J) + sArr(I, J)
                        Tong(1, J - 7) = Tong(1, J - 7) + sArr(I, J)
                    Next J
                    dArr(X, 28) = dArr(X, 28) + 1
                End If
            End If
        Next I
    Next M
    For J = 1 To 20
        dArr(R, J + 7) = Tong(1, J)
        Tong(1, J) = 0
    Next J
Next N
[A10].Resize(1000, 28).ClearContents
[A10].Resize(K, 28) = dArr
[D10].Offset(K + 1).Value = [AF4].Value
[H10].Offset(K + 1).Resize(, 20).Value = "=SUM(R10C:R[-2]C)/2"
[H10].Offset(K + 1).Resize(, 20).Value = [H10].Offset(K + 1).Resize(, 20).Value
Set Dic = Nothing
End Sub
Dạ đúng rồi anh. Cảm ơn anh nhiều! Chúc anh ngủ ngon!
 
Upvote 0
Bạn nhập vào ô AF4="TỔNG CỘNG:"
Thay Sub cũ bằng cái này, rồi tự kiểm tra kết quả xem có đúng không nhé.
PHP:
Public Sub TongHop()
Dim Dic As Object, Sh(), Nhom(), Tong(1 To 1, 1 To 20), N As Long, M As Long, I As Long, J As Long, K As Long, R As Long
Dim sArr(), dArr(1 To 1000, 1 To 28), Tem As String, ShName As String, STT As Long, X As Long
Set Dic = CreateObject("Scripting.Dictionary")
Sh = Range([AE6], [AE6].End(xlDown)).Value
Nhom = Range([AF6], [AF6].End(xlDown)).Value
For N = 1 To UBound(Nhom, 1)
    K = K + 1: R = K
    dArr(K, 4) = Nhom(N, 1)
    For M = 1 To UBound(Sh, 1)
        ShName = Sh(M, 1)
        sArr = Sheets(ShName).Range(Sheets(ShName).[C11], Sheets(ShName).[C65536].End(xlUp)).Offset(, -2).Resize(, 27).Value
        For I = 1 To UBound(sArr, 1)
            If UCase(sArr(I, 3)) = UCase(Nhom(N, 1)) Then
                Tem = sArr(I, 2)
                If Not Dic.exists(Tem) Then
                    K = K + 1: STT = STT + 1
                    Dic.Add Tem, K
                    dArr(K, 1) = STT
                    For J = 2 To 27
                        dArr(K, J) = sArr(I, J)
                        If J >= 8 Then Tong(1, J - 7) = Tong(1, J - 7) + sArr(I, J)
                    Next J
                    dArr(K, 28) = 1
                Else
                    X = Dic.Item(Tem)
                    dArr(X, 7) = sArr(I, 7)
                    For J = 8 To 27
                        dArr(X, J) = dArr(X, J) + sArr(I, J)
                        Tong(1, J - 7) = Tong(1, J - 7) + sArr(I, J)
                    Next J
                    dArr(X, 28) = dArr(X, 28) + 1
                End If
            End If
        Next I
    Next M
    For J = 1 To 20
        dArr(R, J + 7) = Tong(1, J)
        Tong(1, J) = 0
    Next J
Next N
[A10].Resize(1000, 28).ClearContents
[A10].Resize(K, 28) = dArr
[D10].Offset(K + 1).Value = [AF4].Value
[H10].Offset(K + 1).Resize(, 20).Value = "=SUM(R10C:R[-2]C)/2"
[H10].Offset(K + 1).Resize(, 20).Value = [H10].Offset(K + 1).Resize(, 20).Value
Set Dic = Nothing
End Sub
Muôn tô đâm những dòng tổng cộng thì chỉnh code như thế nào hả anh!


Mã:
Public Sub TongHop2()    Dim Dic As Object, Sh(), Nhom(), Tong(1 To 1, 1 To 20), N As Long, M As Long, I As Long, J As Long, K As Long, R As Long
    Dim sArr(), dArr(1 To 1000, 1 To 28), Tem As String, ShName As String, STT As Long, X As Long
    Set Dic = CreateObject("Scripting.Dictionary")
    Sh = Range([AE6], [AE6].End(xlDown)).Value
    Nhom = Range([AF6], [AF6].End(xlDown)).Value
    For N = 1 To UBound(Nhom, 1)
        K = K + 1: R = K
        dArr(K, 4) = Nhom(N, 1)
        For M = 1 To UBound(Sh, 1)
            ShName = Sh(M, 1)
            sArr = Sheets(ShName).Range(Sheets(ShName).[C11], Sheets(ShName).[C65536].End(xlUp)).Offset(, -2).Resize(, 27).Value
            For I = 1 To UBound(sArr, 1)
                If UCase(sArr(I, 3)) = UCase(Nhom(N, 1)) Then
                    Tem = sArr(I, 2)
                    If Not Dic.exists(Tem) Then
                        K = K + 1: STT = STT + 1
                        Dic.Add Tem, K
                        dArr(K, 1) = STT
                        For J = 2 To 27
                            dArr(K, J) = sArr(I, J)
                            If J >= 8 Then Tong(1, J - 7) = Tong(1, J - 7) + sArr(I, J)
                        Next J
                        dArr(K, 28) = 1
                    Else
                        X = Dic.Item(Tem)
                        dArr(X, 7) = sArr(I, 7)
                        For J = 8 To 27
                            dArr(X, J) = dArr(X, J) + sArr(I, J)
                            Tong(1, J - 7) = Tong(1, J - 7) + sArr(I, J)
                        Next J
                        dArr(X, 28) = dArr(X, 28) + 1
                    End If
                End If
            Next I
        Next M
        For J = 1 To 20
            dArr(R, J + 7) = Tong(1, J)
            Tong(1, J) = 0
        Next J
    Next N
    [A10].Resize(1000, 28).ClearContents
    [A10].Resize(K, 28) = dArr
[COLOR=#ff0000]    If dArr(K, 3) = "" Then
        [A10].Resize(K, 28).Font.Bold = True
    End If[/COLOR]
    [D10].Offset(K + 1).Value = [AF4].Value
    [D10].Offset(K + 1).Resize(K, 28).Font.Bold = True
    [H10].Offset(K + 1).Resize(, 20).Value = "=SUM(R10C:R[-2]C)/2"
    [H10].Offset(K + 1).Resize(, 20).Value = [H10].Offset(K + 1).Resize(, 20).Value
    [A10].Resize(K + 2, 28).Borders.LineStyle = xlContinuous
    [A10].Resize(K + 2, 28).Borders(xlInsideVertical).Weight = 2
    [A10].Resize(K + 2, 28).Borders(xlInsideHorizontal).Weight = xlHairline
    Set Dic = Nothing
End Sub
Em có thêm vô 1 doạn code nhưng mà không có tác dụng gì hết nhờ anh kiểm tra dùm em
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom