Code tổng hợp dữ liệu từ nhiều sheet theo tên và sắp xếp theo top

Liên hệ QC

lucifer.pham

Thành viên mới
Tham gia
20/12/20
Bài viết
5
Được thích
1
Chào mọi người. em có một bản thống kê cần tổng hợp dữ liệu từ nhiều sheet vào một sheet theo tên và cần sắp xếp theo top. Em đã thử code để tổng hợp nhưng khi sắp xếp theo top thì thứ tự theo hàng của các sheet thay đổi nên trong lần chạy code tiếp theo số lượng mục này lại bay vào mục khác. Mong được mọi người giúp đỡ.Form như file đính kèm ạ.
 

File đính kèm

  • thongke.xlsx
    12.4 KB · Đọc: 16
đã thử code để tổng hợp nhưng khi sắp xếp theo top thì thứ tự theo hàng của các sheet thay đổi nên trong lần chạy code tiếp theo số lượng mục này lại bay vào mục khác.
Bạn đang dùng code nào? Nếu vậy thì bạn đợi cho code chạy hết qua tất cả các sheets tổng hợp xong rồi mới sort
 
Upvote 0
Chào mọi người. em có một bản thống kê cần tổng hợp dữ liệu từ nhiều sheet vào một sheet theo tên và cần sắp xếp theo top. Em đã thử code để tổng hợp nhưng khi sắp xếp theo top thì thứ tự theo hàng của các sheet thay đổi nên trong lần chạy code tiếp theo số lượng mục này lại bay vào mục khác. Mong được mọi người giúp đỡ.Form như file đính kèm ạ.
Mọi người chào em, em vui lòng sửa tiêu đề cho phù hợp Nội quy nhé.
III. Quy định về tiêu đề bài viết: Tiêu đề bài viết phải sử dụng bằng tiếng Việt có dấu đầy đủ
3. Tiêu đề cần được ghi rõ nghĩa, không được đặt những tiêu đề như: "Chỉ cho tôi với", "Help", "Quan trọng đây!!!????", "Vào đây coi này", "Hay lắm", "Giúp mình với", "Admin ơi", v.v...
 
Upvote 0
Chào mọi người. em có một bản thống kê cần tổng hợp dữ liệu từ nhiều sheet vào một sheet theo tên và cần sắp xếp theo top. Em đã thử code để tổng hợp nhưng khi sắp xếp theo top thì thứ tự theo hàng của các sheet thay đổi nên trong lần chạy code tiếp theo số lượng mục này lại bay vào mục khác. Mong được mọi người giúp đỡ.Form như file đính kèm ạ.
Line1 có dòng input là thế nào? tổng hợp có đem qua không?
 
Upvote 0
Bạn đang dùng code nào? Nếu vậy thì bạn đợi cho code chạy hết qua tất cả các sheets tổng hợp xong rồi mới sort
Hihi. Em là gà mờ nên chỉ dùng code tổng hợp theo hàng theo cột. Nên sau lần sort đầu vị trí hàng thay đổi nên lần tổng hợp tiếp theo sai kết quả luôn.
Bài đã được tự động gộp:

Mọi người chào em, em vui lòng sửa tiêu đề cho phù hợp Nội quy nhé.
III. Quy định về tiêu đề bài viết: Tiêu đề bài viết phải sử dụng bằng tiếng Việt có dấu đầy đủ
3. Tiêu đề cần được ghi rõ nghĩa, không được đặt những tiêu đề như: "Chỉ cho tôi với", "Help", "Quan trọng đây!!!????", "Vào đây coi này", "Hay lắm", "Giúp mình với", "Admin ơi", v.v...
Ok admin. Em sẽ sửa
Bài đã được tự động gộp:

Line1 có dòng input là thế nào? tổng hợp có đem qua không?
Dạ có. Nó là đầu vào để em tính % nên tổng luôn ạ.
 
Upvote 0
Mã:
Option Explicit

Sub Thong_Ke()
Dim Ws As Worksheet
Dim i&, R&, C%, Names$, K&, Times$, Col&, j&
Dim Dic As Object
Dim DL(), KQ()
Set Dic = CreateObject("Scripting.dictionary")
Application.ScreenUpdating = False
'-------------------------------------------------------------------------------------------------------
With Sheet1
    C = .Range("XFD3").End(xlToLeft).Column - 1
    DL = .Range("B3", .Range("B" & Rows.Count).End(xlUp)).Resize(, C).Value
    R = UBound(DL)
    ReDim KQ(1 To R - 1, 1 To C - 2)
            For i = 2 To UBound(DL)
                   Names = Trim(DL(i, 1))
               If Not Dic.exists(Names) Then Dic.Add Names, i - 1
            Next
            For i = 3 To UBound(DL, 2)
                    Times = Trim(DL(1, i))
               If Not Dic.exists(Times) Then Dic.Add Times, i - 2
            Next
End With
For Each Ws In ActiveWorkbook.Worksheets
    If Ws.Name <> "tonghop" Then
        With Ws
                C = .Range("XFD3").End(xlToLeft).Column - 1
          If C > 1 Then
                DL = .Range("B3", .Range("B" & Rows.Count).End(xlUp)).Resize(, C).Value
                 For i = 2 To UBound(DL)
                                Names = Trim(DL(i, 1))
                        If Dic.exists(Names) Then
                                For j = 2 To C
                                        Times = Trim(DL(1, j))
                                    If Dic.exists(Times) Then
                                            Col = Dic.Item(Times)
                                            K = Dic.Item(Names)
                                            KQ(K, Col) = KQ(K, Col) + DL(i, j)
                                    End If
                                Next
                        End If
                Next
           End If
        End With
    End If
Next
Set Dic = Nothing
Sheet1.Range("D4").Resize(UBound(KQ), UBound(KQ, 2)).ClearContents
Sheet1.Range("D4").Resize(UBound(KQ), UBound(KQ, 2)) = KQ
Sheet1.Range("A3").Resize(UBound(DL), UBound(DL, 2) + 1).Borders.LineStyle = 1
Sheet1.Range("A3").Resize(UBound(KQ), UBound(KQ, 2)).Sort Key1:=Sheet1.Range("c3"), Order1:=xlDescending, Header:=xlYes
Application.ScreenUpdating = True
End Sub
Bạn thử code này xem
 
Upvote 0
Mọi người chào em, em vui lòng sửa tiêu đề cho phù hợp Nội quy nhé.
III. Quy định về tiêu đề bài viết: Tiêu đề bài viết phải sử dụng bằng tiếng Việt có dấu đầy đủ
3. Tiêu đề cần được ghi rõ nghĩa, không được đặt những tiêu đề như: "Chỉ cho tôi với", "Help", "Quan trọng đây!!!????", "Vào đây coi này", "Hay lắm", "Giúp mình với", "Admin ơi", v.v...
Mã:
Option Explicit

Sub Thong_Ke()
Dim Ws As Worksheet
Dim i&, R&, C%, Names$, K&, Times$, Col&, j&
Dim Dic As Object
Dim DL(), KQ()
Set Dic = CreateObject("Scripting.dictionary")
Application.ScreenUpdating = False
'-------------------------------------------------------------------------------------------------------
With Sheet1
    C = .Range("XFD3").End(xlToLeft).Column - 1
    DL = .Range("B3", .Range("B" & Rows.Count).End(xlUp)).Resize(, C).Value
    R = UBound(DL)
    ReDim KQ(1 To R - 1, 1 To C - 2)
            For i = 2 To UBound(DL)
                   Names = Trim(DL(i, 1))
               If Not Dic.exists(Names) Then Dic.Add Names, i - 1
            Next
            For i = 3 To UBound(DL, 2)
                    Times = Trim(DL(1, i))
               If Not Dic.exists(Times) Then Dic.Add Times, i - 2
            Next
End With
For Each Ws In ActiveWorkbook.Worksheets
    If Ws.Name <> "tonghop" Then
        With Ws
                C = .Range("XFD3").End(xlToLeft).Column - 1
          If C > 1 Then
                DL = .Range("B3", .Range("B" & Rows.Count).End(xlUp)).Resize(, C).Value
                 For i = 2 To UBound(DL)
                                Names = Trim(DL(i, 1))
                        If Dic.exists(Names) Then
                                For j = 2 To C
                                        Times = Trim(DL(1, j))
                                    If Dic.exists(Times) Then
                                            Col = Dic.Item(Times)
                                            K = Dic.Item(Names)
                                            KQ(K, Col) = KQ(K, Col) + DL(i, j)
                                    End If
                                Next
                        End If
                Next
           End If
        End With
    End If
Next
Set Dic = Nothing
Sheet1.Range("D4").Resize(UBound(KQ), UBound(KQ, 2)).ClearContents
Sheet1.Range("D4").Resize(UBound(KQ), UBound(KQ, 2)) = KQ
Sheet1.Range("A3").Resize(UBound(DL), UBound(DL, 2) + 1).Borders.LineStyle = 1
Sheet1.Range("A3").Resize(UBound(KQ), UBound(KQ, 2)).Sort Key1:=Sheet1.Range("c3"), Order1:=xlDescending, Header:=xlYes
Application.ScreenUpdating = True
End Sub
Bạn thử code này xem
Cảm ơn anh nhé. Em test thử chạy ok. Nhưng mà em chèn thêm 2 cột với
Mã:
Option Explicit

Sub Thong_Ke()
Dim Ws As Worksheet
Dim i&, R&, C%, Names$, K&, Times$, Col&, j&
Dim Dic As Object
Dim DL(), KQ()
Set Dic = CreateObject("Scripting.dictionary")
Application.ScreenUpdating = False
'-------------------------------------------------------------------------------------------------------
With Sheet1
    C = .Range("XFD3").End(xlToLeft).Column - 1
    DL = .Range("B3", .Range("B" & Rows.Count).End(xlUp)).Resize(, C).Value
    R = UBound(DL)
    ReDim KQ(1 To R - 1, 1 To C - 2)
            For i = 2 To UBound(DL)
                   Names = Trim(DL(i, 1))
               If Not Dic.exists(Names) Then Dic.Add Names, i - 1
            Next
            For i = 3 To UBound(DL, 2)
                    Times = Trim(DL(1, i))
               If Not Dic.exists(Times) Then Dic.Add Times, i - 2
            Next
End With
For Each Ws In ActiveWorkbook.Worksheets
    If Ws.Name <> "tonghop" Then
        With Ws
                C = .Range("XFD3").End(xlToLeft).Column - 1
          If C > 1 Then
                DL = .Range("B3", .Range("B" & Rows.Count).End(xlUp)).Resize(, C).Value
                 For i = 2 To UBound(DL)
                                Names = Trim(DL(i, 1))
                        If Dic.exists(Names) Then
                                For j = 2 To C
                                        Times = Trim(DL(1, j))
                                    If Dic.exists(Times) Then
                                            Col = Dic.Item(Times)
                                            K = Dic.Item(Names)
                                            KQ(K, Col) = KQ(K, Col) + DL(i, j)
                                    End If
                                Next
                        End If
                Next
           End If
        End With
    End If
Next
Set Dic = Nothing
Sheet1.Range("D4").Resize(UBound(KQ), UBound(KQ, 2)).ClearContents
Sheet1.Range("D4").Resize(UBound(KQ), UBound(KQ, 2)) = KQ
Sheet1.Range("A3").Resize(UBound(DL), UBound(DL, 2) + 1).Borders.LineStyle = 1
Sheet1.Range("A3").Resize(UBound(KQ), UBound(KQ, 2)).Sort Key1:=Sheet1.Range("c3"), Order1:=xlDescending, Header:=xlYes
Application.ScreenUpdating = True
End Sub
Bạn thử code này xem
cảm ơn cụ nhé. Em chạy ok rùi. Cơ mà em thêm 2 cột tỷ lệ vào giữa tổng và bên số liệu. Sửa lại code 1 chút thì dòng
KQ(K, Col)= KQ(K, Col)
Mã:
Option Explicit

Sub Thong_Ke()
Dim Ws As Worksheet
Dim i&, R&, C%, Names$, K&, Times$, Col&, j&
Dim Dic As Object
Dim DL(), KQ()
Set Dic = CreateObject("Scripting.dictionary")
Application.ScreenUpdating = False
'-------------------------------------------------------------------------------------------------------
With Sheet1
    C = .Range("XFD3").End(xlToLeft).Column - 1
    DL = .Range("B3", .Range("B" & Rows.Count).End(xlUp)).Resize(, C).Value
    R = UBound(DL)
    ReDim KQ(1 To R - 1, 1 To C - 2)
            For i = 2 To UBound(DL)
                   Names = Trim(DL(i, 1))
               If Not Dic.exists(Names) Then Dic.Add Names, i - 1
            Next
            For i = 3 To UBound(DL, 2)
                    Times = Trim(DL(1, i))
               If Not Dic.exists(Times) Then Dic.Add Times, i - 2
            Next
End With
For Each Ws In ActiveWorkbook.Worksheets
    If Ws.Name <> "tonghop" Then
        With Ws
                C = .Range("XFD3").End(xlToLeft).Column - 1
          If C > 1 Then
                DL = .Range("B3", .Range("B" & Rows.Count).End(xlUp)).Resize(, C).Value
                 For i = 2 To UBound(DL)
                                Names = Trim(DL(i, 1))
                        If Dic.exists(Names) Then
                                For j = 2 To C
                                        Times = Trim(DL(1, j))
                                    If Dic.exists(Times) Then
                                            Col = Dic.Item(Times)
                                            K = Dic.Item(Names)
                                            KQ(K, Col) = KQ(K, Col) + DL(i, j)
                                    End If
                                Next
                        End If
                Next
           End If
        End With
    End If
Next
Set Dic = Nothing
Sheet1.Range("D4").Resize(UBound(KQ), UBound(KQ, 2)).ClearContents
Sheet1.Range("D4").Resize(UBound(KQ), UBound(KQ, 2)) = KQ
Sheet1.Range("A3").Resize(UBound(DL), UBound(DL, 2) + 1).Borders.LineStyle = 1
Sheet1.Range("A3").Resize(UBound(KQ), UBound(KQ, 2)).Sort Key1:=Sheet1.Range("c3"), Order1:=xlDescending, Header:=xlYes
Application.ScreenUpdating = True
End Sub
Bạn thử code này xem
cảm ơn cụ nhé. Code chạy ok. Cơ mà em thêm hai cột bên trái cái total. Sửa lại code mà bị fail. 2 cột đấy em để % của name so với tổng. Cụ giúp em được không.
 
Upvote 0
thêm hai cột bên trái cái total
Thêm mỗi code ở sheets tonghop hay tất cả cá sheets điều thêm? và nếu thêm vào tất cả cá sheets thì có lấy hai code đó không? Với hỏi thêm là cái danh sách name và ngày ở sheets tổng hợp (điều kiện để lọc) là có sẵn ở đó rồi chỉ cần tổng hợp theo danh sách đó,hay là chưa có sẵn mà chạy qua các sheets tổng hợp về (vì hiện tại tôi đang hiểu là nó đã có sẵn ở đó và lấy kết quả theo điều kiện định sẵn ở đó) .Nếu là chưa có thì code sẽ phải sửa lại.Bạn cho xin cái file miêu tả kết quả mong muốn làm bằng tay đước không?
 
Lần chỉnh sửa cuối:
Upvote 0
Thêm mỗi code ở sheets tonghop hay tất cả cá sheets điều thêm? và nếu thêm vào tất cả cá sheets thì có lấy hai code đó không? Với hỏi thêm là cái danh sách name và ngày ở sheets tổng hợp (điều kiện để lọc) là có sẵn ở đó rồi chỉ cần tổng hợp theo danh sách đó,hay là chưa có sẵn mà chạy qua các sheets tổng hợp về (vì hiện tại tôi đang hiểu là nó đã có sẵn ở đó và lấy kết quả theo điều kiện định sẵn ở đó) .Nếu là chưa có thì code sẽ phải sửa lại.Bạn cho xin cái file miêu tả kết quả mong muốn làm bằng tay đước không?
1608609643144.png
Đây ạ. báo lỗi dòng này ạ. chi tiết em đã sửa và form chuẩn ở file đính kèm ạ. cụ giúp nhé. em cứ bị tắc não
 

File đính kèm

  • thongke1.xlsm
    30.8 KB · Đọc: 22
Upvote 0
View attachment 251614
Đây ạ. báo lỗi dòng này ạ. chi tiết em đã sửa và form chuẩn ở file đính kèm ạ. cụ giúp nhé. em cứ bị tắc não
Mã:
Option Explicit

Sub Thong_Ke()
Dim Ws As Worksheet
Dim i&, R&, C%, Names$, K&, Times$, Col&, j&
Dim Dic As Object
Dim DL(), KQ()
Dim t As Integer
Set Dic = CreateObject("Scripting.dictionary")
Application.ScreenUpdating = False
'-------------------------------------------------------------------------------------------------------
With Sheet1
    C = .Range("XFD16").End(xlToLeft).Column - 1
    DL = .Range("B16", .Range("B" & Rows.Count).End(xlUp)).Resize(, C).Value
    R = UBound(DL)
    ReDim KQ(1 To R - 1, 1 To C - 4)
            For i = 2 To UBound(DL)
                   Names = Trim(DL(i, 1))
               If Not Dic.exists(Names) Then Dic.Add Names, i - 1
            Next
            For i = 5 To UBound(DL, 2)
                    Times = Trim(DL(1, i))
               If Not Dic.exists(Times) Then Dic.Add Times, i - 4
            Next
End With
For Each Ws In ActiveWorkbook.Worksheets
    If Ws.Name <> "tonghop" Then
        With Ws
                C = .Range("XFD16").End(xlToLeft).Column - 1
          If C > 1 Then
                DL = .Range("B16", .Range("B" & Rows.Count).End(xlUp)).Resize(, C).Value
                 For i = 2 To UBound(DL)
                                Names = Trim(DL(i, 1))
                        If Dic.exists(Names) Then
                                For j = 5 To C
                                        Times = Trim(DL(1, j))
                                    If Dic.exists(Times) Then
                                            Col = Dic.Item(Times)
                                            K = Dic.Item(Names)
                                            KQ(K, Col) = KQ(K, Col) + DL(i, j)
                                    End If
                                Next
                        End If
                Next
           End If
        End With
    End If
Next
Set Dic = Nothing
Sheet1.Range("F17").Resize(UBound(KQ), UBound(KQ, 2)) = KQ
Sheet1.Range("A16").Resize(UBound(DL), UBound(DL, 2) + 1).Sort Key1:=Sheet1.Range("A16"), Order1:=xlDescending, Header:=xlYes
Application.ScreenUpdating = True
End Sub
Phần lọc sửa lại như thế này còn các phần thêm thắt khác của bạn thì tôi chưa xem.và phần sort nếu muốn sort từ lớn tới bé hay bé tới lơn gì thì bạn tự sửa trong code Order1:=xlDescending và cái hàm đêm thứ tự trong file của bạn
 
Upvote 0
Mã:
Option Explicit

Sub Thong_Ke()
Dim Ws As Worksheet
Dim i&, R&, C%, Names$, K&, Times$, Col&, j&
Dim Dic As Object
Dim DL(), KQ()
Dim t As Integer
Set Dic = CreateObject("Scripting.dictionary")
Application.ScreenUpdating = False
'-------------------------------------------------------------------------------------------------------
With Sheet1
    C = .Range("XFD16").End(xlToLeft).Column - 1
    DL = .Range("B16", .Range("B" & Rows.Count).End(xlUp)).Resize(, C).Value
    R = UBound(DL)
    ReDim KQ(1 To R - 1, 1 To C - 4)
            For i = 2 To UBound(DL)
                   Names = Trim(DL(i, 1))
               If Not Dic.exists(Names) Then Dic.Add Names, i - 1
            Next
            For i = 5 To UBound(DL, 2)
                    Times = Trim(DL(1, i))
               If Not Dic.exists(Times) Then Dic.Add Times, i - 4
            Next
End With
For Each Ws In ActiveWorkbook.Worksheets
    If Ws.Name <> "tonghop" Then
        With Ws
                C = .Range("XFD16").End(xlToLeft).Column - 1
          If C > 1 Then
                DL = .Range("B16", .Range("B" & Rows.Count).End(xlUp)).Resize(, C).Value
                 For i = 2 To UBound(DL)
                                Names = Trim(DL(i, 1))
                        If Dic.exists(Names) Then
                                For j = 5 To C
                                        Times = Trim(DL(1, j))
                                    If Dic.exists(Times) Then
                                            Col = Dic.Item(Times)
                                            K = Dic.Item(Names)
                                            KQ(K, Col) = KQ(K, Col) + DL(i, j)
                                    End If
                                Next
                        End If
                Next
           End If
        End With
    End If
Next
Set Dic = Nothing
Sheet1.Range("F17").Resize(UBound(KQ), UBound(KQ, 2)) = KQ
Sheet1.Range("A16").Resize(UBound(DL), UBound(DL, 2) + 1).Sort Key1:=Sheet1.Range("A16"), Order1:=xlDescending, Header:=xlYes
Application.ScreenUpdating = True
End Sub
Phần lọc sửa lại như thế này còn các phần thêm thắt khác của bạn thì tôi chưa xem.và phần sort nếu muốn sort từ lớn tới bé hay bé tới lơn gì thì bạn tự sửa trong code Order1:=xlDescending và cái hàm đêm thứ tự trong file của bạn
Cảm ơn cụ đã giúp nhiệt tình nhé. Code chạy rất ổn và đúng ý. Nhờ cụ mà em thông não được khá nhiều vấn đề. Em phải chịu khó nâng cấp bản thân mới được. Mong 1 ngày giỏi như cụ.
 
Upvote 0
Web KT

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

Back
Top Bottom