Tổng hợp giờ theo tên từ các sheet về sheet tổng hợp (1 người xem)

Liên hệ QC

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

Thuyanhanoi

Thành viên thường trực
Tham gia
15/10/12
Bài viết
304
Được thích
154
Nghề nghiệp
Nhân viên
Tôi có 1 file dữ liệu trong đó có 12 sheet từ sheet T1 đến sheet T12. Nay tôi muốn tổng hợp dữ liệu từ tất cả các sheet này về sheet tong_hop theo tên của từng người, và tính tổng ở dòng cuối của mỗi người. Tôi đã làm thủ công ví dụ 1 trường hợp (trong file đính kèm) Mong được các bạn trên GPE giúp tôi. Tôi xin cảm ơn!.
 

File đính kèm

Tôi có 1 file dữ liệu trong đó có 12 sheet từ sheet T1 đến sheet T12. Nay tôi muốn tổng hợp dữ liệu từ tất cả các sheet này về sheet tong_hop theo tên của từng người, và tính tổng ở dòng cuối của mỗi người. Tôi đã làm thủ công ví dụ 1 trường hợp (trong file đính kèm) Mong được các bạn trên GPE giúp tôi. Tôi xin cảm ơn!.
1/ Bạn nên nhập dữ liệu vào cột Mã. Lấy dữ liệu theo cột Mã sẽ chính xác hơn.
2/ Các dòng dữ liệu dù có trùng cũng không nên để trống theo "con mắt hiểu là như trên", Khi in ra biểu mẫu bạn có thể dùng cách khác để in duy nhất 1 dòng. (Conditional Formatting, ...)
3/ Nên có 1 sheet chứa tất cả Mã, Họ tên GV, ... có tham gia dạy từ T1 đến T12.
Sau này chú ý khi tạo cơ sở dữ liệu phải theo những điều kiện này.
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi có 1 file dữ liệu trong đó có 12 sheet từ sheet T1 đến sheet T12. Nay tôi muốn tổng hợp dữ liệu từ tất cả các sheet này về sheet tong_hop theo tên của từng người, và tính tổng ở dòng cuối của mỗi người. Tôi đã làm thủ công ví dụ 1 trường hợp (trong file đính kèm) Mong được các bạn trên GPE giúp tôi. Tôi xin cảm ơn!.
Bạn xem file thử. Code chạy hơi chậm .... :D
 

File đính kèm

Upvote 0
1/ Bạn nên nhập dữ liệu vào cột Mã. Lấy dữ liệu theo cột Mã sẽ chính xác hơn.
2/ Các dòng dữ liệu dù có trùng cũng không nên để trống theo "con mắt hiểu là như trên", Khi in ra biểu mẫu bạn có thể dùng cách khác để giữ lại duy nhất 1 dòng. (Condition Formatting, ...)
3/ Nên có 1 sheet chứa tất cả mã, Họ tên GV có tham gia dạy từ T1 đến T12.
Sau này chú ý khi tạo cơ sở dữ liệu phải theo những điều kiện này.
Em cảm ơn Thầy Ba Tê đã xem và nghiên cứu bài giúp em!.
- Các tháng từ T1,....T12 là các đơn vị đã nhập sẵn số giờ của từng người và gửi qua mail cho em mỗi tháng, em tập hợp lại thành 1 file.
- Các file em nhận quan mail T1....T12 các đơn vị không ghi mã chỉ ghi hojvaf tên, họ và tên ghi có khi còn không đúng(vì thừa khoảng trắng), mỗi tháng một kiểu điều này làm em nhức đầu quá. Ở file em chỉ tạm sửa lại tên sao cho tên họ không bị sai ở các sheet. Nếu tổng hợp theo mã thì em lại nhập thủ công những mã này.
 
Upvote 0
Em cảm ơn Thầy Ba Tê đã xem và nghiên cứu bài giúp em!.
- Các tháng từ T1,....T12 là các đơn vị đã nhập sẵn số giờ của từng người và gửi qua mail cho em mỗi tháng, em tập hợp lại thành 1 file.
- Các file em nhận quan mail T1....T12 các đơn vị không ghi mã chỉ ghi hojvaf tên, họ và tên ghi có khi còn không đúng(vì thừa khoảng trắng), mỗi tháng một kiểu điều này làm em nhức đầu quá. Ở file em chỉ tạm sửa lại tên sao cho tên họ không bị sai ở các sheet. Nếu tổng hợp theo mã thì em lại nhập thủ công những mã này.
Ở file mẫu không có tháng 7 bạn à
 
Upvote 0
Upvote 0
Mình cảm ơn code của bạn. Mình xem lại, nếu có chỗ nào vướng mắc, rất mong được bạn và mọi người trợ giúp!.
Sao không cám ơn bạn mà lại đi cám ơn Code của bạn :D. Nếu như bài 5 thì phải dùng hàm Trim cho điều kiện lọc để bỏ khoảng trắng thừa rồi
 
Upvote 0
Tôi có 1 file dữ liệu trong đó có 12 sheet từ sheet T1 đến sheet T12. Nay tôi muốn tổng hợp dữ liệu từ tất cả các sheet này về sheet tong_hop theo tên của từng người, và tính tổng ở dòng cuối của mỗi người. Tôi đã làm thủ công ví dụ 1 trường hợp (trong file đính kèm) Mong được các bạn trên GPE giúp tôi. Tôi xin cảm ơn!.
Thử với code
Mã:
Public Sub Tonghop()
Dim Dic As Object, Tem As String, Arr(1 To 65535, 1 To 19), Darr()
Dim i As Long, j As Long, k As Long, nk As Long, ik As Long, n As Long
On Error Resume Next
Set Dic = CreateObject("Scripting.Dictionary")
For n = 1 To 12
  i = Sheets("T" & n).Range("E65535").End(xlUp).Row
  If i < 10 Then GoTo Tiep
  Darr = Sheets("T" & n).Range("A10:S" & i).Value
  For i = 1 To UBound(Darr)
    If Darr(i, 5) <> Empty Then
      If Darr(i, 3) <> Empty Then Tem = Darr(i, 2) & "#" & Darr(i, 3) & "#" & Darr(i, 4)
      If Not Dic.Exists(Tem) Then
        k = k + 1
        ik = (k - 1) * 100 + 1
        Dic.Add Tem, ik
        Arr(ik, 1) = k
        For j = 2 To 4
          Arr(ik, j) = Darr(i, j)
        Next j
      Else
        ik = Dic.Item(Tem) + 1
        Dic.Item(Tem) = ik
      End If
      nk = (Int(ik / 100) + 1) * 100
      For j = 5 To 19
        Arr(ik, j) = Darr(i, j)
        If j > 7 Then Arr(nk, j) = Arr(nk, j) + Darr(i, j)
      Next j
    End If
  Next i
Tiep:
Next n
ReDim Darr(1 To UBound(Arr), 1 To UBound(Arr, 2))
ik = 0
For i = 1 To k * 100 Step 100
  For nk = i To i + 98
    If Arr(nk, 5) = Empty Then Exit For
    ik = ik + 1
    For j = 1 To 19
      Darr(ik, j) = Arr(nk, j)
    Next j
  Next nk
  ik = ik + 1
  For j = 8 To 18
      Darr(ik, j) = Arr(i + 99, j)
  Next j
Next i

With Sheets("Tong_hop")
  .Range("A10:S" & .Range("R65535").End(3).Row + 1).Borders.LineStyle = xlNone
  .Range("A10:S" & .Range("R65535").End(3).Row + 1).ClearContents
  .Range("A10:S" & .Range("R65535").End(3).Row + 1).Font.Bold = False
  .Range("A10").Resize(ik, 19) = Darr
  .Range("A10:S" & .Range("R65535").End(3).Row + 1).Borders.LineStyle = xlContinuous
  .Range("A10:S" & .Range("R65535").End(3).Row + 1).Borders(xlInsideHorizontal).Weight = xlHairline
End With
End Sub
 

File đính kèm

Upvote 0
Thử với code
Mã:
Public Sub Tonghop()
Dim Dic As Object, Tem As String, Arr(1 To 65535, 1 To 19), Darr()
Dim i As Long, j As Long, k As Long, nk As Long, ik As Long, n As Long
On Error Resume Next
Set Dic = CreateObject("Scripting.Dictionary")
For n = 1 To 12
  i = Sheets("T" & n).Range("E65535").End(xlUp).Row
  If i < 10 Then GoTo Tiep
  Darr = Sheets("T" & n).Range("A10:S" & i).Value
  For i = 1 To UBound(Darr)
    If Darr(i, 5) <> Empty Then
      If Darr(i, 3) <> Empty Then Tem = Darr(i, 2) & "#" & Darr(i, 3) & "#" & Darr(i, 4)
      If Not Dic.Exists(Tem) Then
        k = k + 1
        ik = (k - 1) * 100 + 1
        Dic.Add Tem, ik
        Arr(ik, 1) = k
        For j = 2 To 4
          Arr(ik, j) = Darr(i, j)
        Next j
      Else
        ik = Dic.Item(Tem) + 1
        Dic.Item(Tem) = ik
      End If
      nk = (Int(ik / 100) + 1) * 100
      For j = 5 To 19
        Arr(ik, j) = Darr(i, j)
        If j > 7 Then Arr(nk, j) = Arr(nk, j) + Darr(i, j)
      Next j
    End If
  Next i
Tiep:
Next n
ReDim Darr(1 To UBound(Arr), 1 To UBound(Arr, 2))
ik = 0
For i = 1 To k * 100 Step 100
  For nk = i To i + 98
    If Arr(nk, 5) = Empty Then Exit For
    ik = ik + 1
    For j = 1 To 19
      Darr(ik, j) = Arr(nk, j)
    Next j
  Next nk
  ik = ik + 1
  For j = 8 To 18
      Darr(ik, j) = Arr(i + 99, j)
  Next j
Next i

With Sheets("Tong_hop")
  .Range("A10:S" & .Range("R65535").End(3).Row + 1).Borders.LineStyle = xlNone
  .Range("A10:S" & .Range("R65535").End(3).Row + 1).ClearContents
  .Range("A10:S" & .Range("R65535").End(3).Row + 1).Font.Bold = False
  .Range("A10").Resize(ik, 19) = Darr
  .Range("A10:S" & .Range("R65535").End(3).Row + 1).Borders.LineStyle = xlContinuous
  .Range("A10:S" & .Range("R65535").End(3).Row + 1).Borders(xlInsideHorizontal).Weight = xlHairline
End With
End Sub
Cách này hay quá anh ạ. Cứ như cách của em ăn xong chạy vòng vòng ... :D
 
Upvote 0
Sao không cám ơn bạn mà lại đi cám ơn Code của bạn :D. Nếu như bài 5 thì phải dùng hàm Trim cho điều kiện lọc để bỏ khoảng trắng thừa rồi
Ờ đúng đúng, Nhưng nói xa nói gần cũng là cảm ơn bạn mà!.
Bạn ơi bạn kiểm tra lại giúp mình với, Mình kiểm tra người đầu tiên (Nguyễn Quốc An) Thấy dữ liệu ở tháng T4 bị lặp lại lại 2 lần khi lấy dữ liệu về sheet Tong_hop
 
Upvote 0
Ờ đúng đúng, Nhưng nói xa nói gần cũng là cảm ơn bạn mà!.
Bạn ơi bạn kiểm tra lại giúp mình với, Mình kiểm tra người đầu tiên (Nguyễn Quốc An) Thấy dữ liệu ở tháng T4 bị lặp lại lại 2 lần khi lấy dữ liệu về sheet Tong_hop
Bạn tải lại file bài 3 xem nha. Code của anh HieuCD bài 11 rất hay đó bạn
 
Upvote 0
Thử với code
Mã:
Public Sub Tonghop()
Dim Dic As Object, Tem As String, Arr(1 To 65535, 1 To 19), Darr()
Dim i As Long, j As Long, k As Long, nk As Long, ik As Long, n As Long
On Error Resume Next
Set Dic = CreateObject("Scripting.Dictionary")
For n = 1 To 12
  i = Sheets("T" & n).Range("E65535").End(xlUp).Row
  If i < 10 Then GoTo Tiep
  Darr = Sheets("T" & n).Range("A10:S" & i).Value
  For i = 1 To UBound(Darr)
    If Darr(i, 5) <> Empty Then
      If Darr(i, 3) <> Empty Then Tem = Darr(i, 2) & "#" & Darr(i, 3) & "#" & Darr(i, 4)
      If Not Dic.Exists(Tem) Then
        k = k + 1
        ik = (k - 1) * 100 + 1
        Dic.Add Tem, ik
        Arr(ik, 1) = k
        For j = 2 To 4
          Arr(ik, j) = Darr(i, j)
        Next j
      Else
        ik = Dic.Item(Tem) + 1
        Dic.Item(Tem) = ik
      End If
      nk = (Int(ik / 100) + 1) * 100
      For j = 5 To 19
        Arr(ik, j) = Darr(i, j)
        If j > 7 Then Arr(nk, j) = Arr(nk, j) + Darr(i, j)
      Next j
    End If
  Next i
Tiep:
Next n
ReDim Darr(1 To UBound(Arr), 1 To UBound(Arr, 2))
ik = 0
For i = 1 To k * 100 Step 100
  For nk = i To i + 98
    If Arr(nk, 5) = Empty Then Exit For
    ik = ik + 1
    For j = 1 To 19
      Darr(ik, j) = Arr(nk, j)
    Next j
  Next nk
  ik = ik + 1
  For j = 8 To 18
      Darr(ik, j) = Arr(i + 99, j)
  Next j
Next i

With Sheets("Tong_hop")
  .Range("A10:S" & .Range("R65535").End(3).Row + 1).Borders.LineStyle = xlNone
  .Range("A10:S" & .Range("R65535").End(3).Row + 1).ClearContents
  .Range("A10:S" & .Range("R65535").End(3).Row + 1).Font.Bold = False
  .Range("A10").Resize(ik, 19) = Darr
  .Range("A10:S" & .Range("R65535").End(3).Row + 1).Borders.LineStyle = xlContinuous
  .Range("A10:S" & .Range("R65535").End(3).Row + 1).Borders(xlInsideHorizontal).Weight = xlHairline
End With
End Sub
Cảm ơn bạn đã giúp mình, mình kiểm tra thấy kết quả đúng rồi!. Nhưng dòng tính tổng của mỗi người bạn có thể cho đậm giúp mình để nhìn khỏi bị nhầm, minh thấy khó nhìn quá
 
Upvote 0
1/ Bạn nên nhập dữ liệu vào cột Mã. Lấy dữ liệu theo cột Mã sẽ chính xác hơn.
2/ Các dòng dữ liệu dù có trùng cũng không nên để trống theo "con mắt hiểu là như trên", Khi in ra biểu mẫu bạn có thể dùng cách khác để in duy nhất 1 dòng. (Conditional Formatting, ...)
3/ Nên có 1 sheet chứa tất cả Mã, Họ tên GV, ... có tham gia dạy từ T1 đến T12.
Sau này chú ý khi tạo cơ sở dữ liệu phải theo những điều kiện này.
- Đúng như ý của Thầy Ba Tê, việc em phải kiểm tra tên trong các tháng từ T1,...T12 có nhập giống nhau về ký tự hay không để tổng hợp cũng rất oải, có khi tự mình nhập thủ cong mã vào và tổng hợp theo mã thì tính chính xác cao hơn nhiều. Thầy cho Em một cách để giải bài này với!.
 
Upvote 0
Cảm ơn bạn đã giúp mình, mình kiểm tra thấy kết quả đúng rồi!. Nhưng dòng tính tổng của mỗi người bạn có thể cho đậm giúp mình để nhìn khỏi bị nhầm, minh thấy khó nhìn quá
Mình thêm dòng tô mầu và chữ đậm vào Code của Anh HieuCD. Bạn xem file nha
 

File đính kèm

Upvote 0
Cảm ơn bạn đã giúp mình, mình kiểm tra thấy kết quả đúng rồi!. Nhưng dòng tính tổng của mỗi người bạn có thể cho đậm giúp mình để nhìn khỏi bị nhầm, minh thấy khó nhìn quá
bạn chỉnh lại code
Mã:
Public Sub Tonghop()
Dim Dic As Object, Tem As String, Arr(1 To 65535, 1 To 19), Darr()
Dim i As Long, j As Long, k As Long, nk As Long, ik As Long, n As Long

With Sheets("Tong_hop")
  .Range("A10:S" & .Range("R65535").End(3).Row + 1).Font.Bold = False
  .Range("A10:S" & .Range("R65535").End(3).Row + 1).Borders.LineStyle = xlNone
  .Range("A10:S" & .Range("R65535").End(3).Row + 1).ClearContents
End With

Set Dic = CreateObject("Scripting.Dictionary")
For n = 1 To 12
  If IsNotSheetName("T" & n) Then GoTo Tiep
  i = Sheets("T" & n).Range("E65535").End(xlUp).Row
  If i < 10 Then GoTo Tiep
  Darr = Sheets("T" & n).Range("A10:S" & i).Value
  For i = 1 To UBound(Darr)
    If Darr(i, 5) <> Empty Then
      If Darr(i, 3) <> Empty Then Tem = Darr(i, 2) & "#" & Darr(i, 3) & "#" & Darr(i, 4)
      If Not Dic.Exists(Tem) Then
        k = k + 1
        ik = (k - 1) * 100 + 1
        Dic.Add Tem, ik
        Arr(ik, 1) = k
        For j = 2 To 4
          Arr(ik, j) = Darr(i, j)
        Next j
      Else
        ik = Dic.Item(Tem) + 1
        Dic.Item(Tem) = ik
      End If
      nk = (Int(ik / 100) + 1) * 100
      For j = 5 To 19
        Arr(ik, j) = Darr(i, j)
        If j > 7 Then Arr(nk, j) = Arr(nk, j) + Darr(i, j)
      Next j
    End If
  Next i
Tiep:
Next n

ReDim Darr(1 To UBound(Arr), 1 To UBound(Arr, 2))
ik = 0
For i = 1 To k * 100 Step 100
  For nk = i To i + 98
    If Arr(nk, 5) = Empty Then Exit For
    ik = ik + 1
    For j = 1 To 19
      Darr(ik, j) = Arr(nk, j)
    Next j
  Next nk
  ik = ik + 1
  For j = 8 To 18
      Darr(ik, j) = Arr(i + 99, j)
  Next j
  Sheets("Tong_hop").Range("A9:S9").Offset(ik).Font.Bold = True
Next i

With Sheets("Tong_hop")
  .Range("A10").Resize(ik, 19) = Darr
  .Range("A10:S" & .Range("R65535").End(3).Row + 1).Borders.LineStyle = xlContinuous
  .Range("A10:S" & .Range("R65535").End(3).Row + 1).Borders(xlInsideHorizontal).Weight = xlHairline
End With
End Sub

Private Function IsNotSheetName(ShName As String) As Boolean
  Dim Tmp As String
  On Error Resume Next
  Tmp = Sheets(ShName).Name
  If Err.Number <> 0 Then
    IsNotSheetName = True
    Err.Clear
  End If
End Function
 
Upvote 0
- Đúng như ý của Thầy Ba Tê, việc em phải kiểm tra tên trong các tháng từ T1,...T12 có nhập giống nhau về ký tự hay không để tổng hợp cũng rất oải, có khi tự mình nhập thủ cong mã vào và tổng hợp theo mã thì tính chính xác cao hơn nhiều. Thầy cho Em một cách để giải bài này với!.
Thì như đã nói, phải có 1 sheet danh sách GV, có cột Mã, Họ Tên, v.v..., bắt họ nhập đúng mã, (tên nó nhập sao "kệ cha" nó,, mình kiểm soát được), khi mình nhận file, cứ đúng mã thì "phan" vào.
Họ tên khác nhau dấu cách, Hoa thường, vị trí bỏ dấu,... một đống chuyện có thể gây sai sót, Thủy hoặc Thuỷ cũng chết như thường.
Chuyện kẻ khung, format màu mè ... bạn tự làm được mà.
Tôi chỉ làm kiểu chuẩn, khi có mã thì mình bàn tiếp nhé.
 
Upvote 0
Tôi có 1 file dữ liệu trong đó có 12 sheet từ sheet T1 đến sheet T12. Nay tôi muốn tổng hợp dữ liệu từ tất cả các sheet này về sheet tong_hop theo tên của từng người, và tính tổng ở dòng cuối của mỗi người. Tôi đã làm thủ công ví dụ 1 trường hợp (trong file đính kèm) Mong được các bạn trên GPE giúp tôi. Tôi xin cảm ơn!.
Góp vui với mấy anh đoạn code xử lý trên range:
PHP:
Public Sub Tonghop()
Application.ScreenUpdating = False
Dim num1 As Long, num2 As Long, num3 As Long, en As Long, st As Long
Dim text As String, cosh As Worksheet, rng As Range
[B10:S60000].ClearContents
For Each cosh In Sheets
    If cosh.Name <> "Tong_hop" Then cosh.[B10:S1000].Copy Sheets("tong_hop").Range("B" & [E60000].End(xlUp).Row + 1)
Next cosh
lr = [E60000].End(xlUp).Row - 9
For num1 = 1 To lr
    If [c9].Offset(num1, 0) = Empty Then
        [c9:D9].Offset(num1, 0).Value = [c9:D9].Offset(num1 - 1, 0).Value
    End If
Next num1
[S10].Formula = "=C10&D10"
Range("S10:S" & lr + 9).FillDown
Range("B10:S" & lr + 9).Sort [S10]: Range("S10:S" & lr + 9).ClearContents
For num1 = 1 To lr + 1
    If text = [c9].Offset(num1 + num3, 0) & [d9].Offset(num1 + num3, 0) Then
        [c9:D9].Offset(num1 + num3, 0) = Empty
    Else
        text = [c9].Offset(num1 + num3, 0) & [d9].Offset(num1 + num3, 0)
        If num1 > 1 Then
            Rows(num1 + num3 + 9).EntireRow.Insert: Rows(num1 + num3 + 9).Font.Bold = True
            num3 = num3 + 1
        End If
        st = en: en = num1 + 9 + num3
        If num1 > 1 Then
            [c9].Offset(num1 + num3 - 1, 6).Formula = "=sum(I" & st & ":I" & en - 2 & ")"
            [c9].Offset(num1 + num3 - 1, 6).Resize(, 10).FillRight
        End If
    End If
Next num1
[B10:S60000].Borders.LineStyle = xlNone
Range("B10:S" & lr + 9 + num3).Borders.LineStyle = xlContinuous
Range("B10:S" & lr + 9 + num3).Borders(xlInsideHorizontal).Weight = xlHairline
Application.DisplayAlerts = True
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom