Tổng hợp diễn giải của các sheet con vào sheet tổng (1 người xem)

Liên hệ QC

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

Phanhanhdai

Thành viên tiêu biểu
Tham gia
16/3/08
Bài viết
733
Được thích
1,876
Nghề nghiệp
Thiết kế công trình
Em có một workbook trong đó bao gồm một sheet tổng và các sheet con. Bây giờ em muốn tổng hợp dữ liệu các sheet con vào sheet tổng (được sẵp xếp dữ liệu theo các ngày) trong đó có diễn giải số liệu của sheet cần lấy để dễ kiểm tra. Em chưa biết cách tổng hợp. Rất mong sự góp ý chỉ bảo của các bác
 

File đính kèm

Em có một workbook trong đó bao gồm một sheet tổng và các sheet con. Bây giờ em muốn tổng hợp dữ liệu các sheet con vào sheet tổng (được sẵp xếp dữ liệu theo các ngày) trong đó có diễn giải số liệu của sheet cần lấy để dễ kiểm tra. Em chưa biết cách tổng hợp. Rất mong sự góp ý chỉ bảo của các bác
Chưa biết có đúng ý bạn? vì bạn cho ví dụng không minh bạch.
 

File đính kèm

Bạn xem thử xem có đúng ý bạn không?
 

File đính kèm

Dạ đúng ý em rồi đấy ah. Nhưng nếu như tại Sheet tổng hợp nó nhảy tự động thì tốt quá nhỉ. Còn nếu bình thường em vấn copy thủ công từng sheet con sang sheet tổng hợp
 
Dạ đúng ý em rồi đấy ah. Nhưng nếu như tại Sheet tổng hợp nó nhảy tự động thì tốt quá nhỉ. Còn nếu bình thường em vấn copy thủ công từng sheet con sang sheet tổng hợp
Là nhảy điệu gì nhỉ? Nếu tên sheet là "TongHop" thì ta thêm câu
for i = 1 to ...
if sheetname<>"Tonghop" then
...
endif
 
Mới làm xong code này! Bạn xem có vừa ý không nha!
Sau khi nhập liệu ở các sheet xong, bạn chỉ cần chọn vào sheet TONGHOP là dử liệu mới sẽ tự động cập nhật!
Code như sau:
PHP:
Option Explicit
Private Sub Worksheet_Activate()
  Dim Rng As Range, TD As Range
  Dim Er1 As Integer, Er2 As Integer, i As Integer
  Dim Luu As Variant
  Dim Sh As Worksheet
  Application.ScreenUpdating = False
  With Sheet1
    Er1 = .[C65536].End(xlUp).Row
    If Er1 <= 4 Then Er1 = 5
    .Range("A5:C" & Er1).ClearContents: .[C4].Cut: .[B4].Insert Shift:=xlToRight
  End With
  For Each Sh In ThisWorkbook.Worksheets
    Er2 = Sheet1.[A65536].End(xlUp).Row + 1
    If Er2 <= 4 Then Er2 = 5
    If Sh.Name <> Sheet1.Name Then
      With Sh
        Set TD = .[A4].Resize(1, .[A4].End(xlToRight).Column)
        Luu = TD.Value: TD.ClearContents
        Set Rng = .[A5].CurrentRegion
        Rng.Copy Destination:=Sheet1.Cells(Er2, 1)
        TD.Value = Luu
        Sheet1.Cells(Er2, 3).Resize(Rng.Rows.Count, 1).Value = .Name
      End With
    End If
  Next Sh
  With Sheet1
    .Range("C4:C" & .[C65536].End(xlUp).Row).Cut: .[B4].Insert Shift:=xlToRight
  End With
  Set Rng = Nothing: Set TD = Nothing
  Application.ScreenUpdating = True
End Sub
Mời xem file!
Lưu ý: Tốt nhất bạn không nên đặt tên sheet là tiếng Việt có dấu (sẽ rất nhiều bất lợi cho bạn sau này)
Với ThuNghi: Theo như tác giã mô tả trong file thì tôi thấy bạn ấy chỉ muốn copy toàn bộ dử liệu các sheet vào chung 1 sheet chứ đâu có nói SUMIF gì đâu nhỉ?
 

File đính kèm

Lần chỉnh sửa cuối:
Sao em thêm dữ liệu vào công ty B chẳng hạn mà nó không cập nhật anh nhỉ. (Mặc dù em đã ấn Alt+F8) nhưng không thấy có Macro nào hiện ra
 
Dạ đúng ý em rồi đấy ah. Nhưng nếu như tại Sheet tổng hợp nó nhảy tự động thì tốt quá nhỉ. Còn nếu bình thường em vấn copy thủ công từng sheet con sang sheet tổng hợp

Gắn vào sự kiện ActiveSheet hay hơn vì khi ta mở ra xem thì nó "nhảy" còn bình thường nó "nhảy" âm thầm có ích gì?
Để thấy Macro bạn phải insert Module và nhập mã các bạn hướng dẫn vào đó, còn ndu thì code trực tiếp của sư kiện rồi là gì còn Macro nào nữa mà tìm
 
Lần chỉnh sửa cuối:
Sao em thêm dữ liệu vào công ty B chẳng hạn mà nó không cập nhật anh nhỉ. (Mặc dù em đã ấn Alt+F8) nhưng không thấy có Macro nào hiện ra
Khởi cần Alt + F8 gì cả... Chỉ cần bạn chọn vào sheet TONGHOP là dử liệu lập tức được cập nhật thôi...
Tôi không biết bạn đã thêm thông tin như thế nào? Có thể đưa lên xem thử không?
 
Khởi cần Alt + F8 gì cả... Chỉ cần bạn chọn vào sheet TONGHOP là dử liệu lập tức được cập nhật thôi...
Tôi không biết bạn đã thêm thông tin như thế nào? Có thể đưa lên xem thử không?
Thật tuyệt vời, máy của em sáng nó bị trục trặc nên không được. Em xin hỏi ngoài phương pháp dùng VBA anh còn có thể làm bằng phương pháp công thức trực tiếp từ Excel không ah? (Dùng Name chẳng hạn)
 
Nhờ giải thích ý nghĩa từng dòng trong đoạn Code

Mới làm xong code này! Bạn xem có vừa ý không nha!
Sau khi nhập liệu ở các sheet xong, bạn chỉ cần chọn vào sheet TONGHOP là dử liệu mới sẽ tự động cập nhật!
Code như sau:
PHP:
Option Explicit
Private Sub Worksheet_Activate()
  Dim Rng As Range, TD As Range
  Dim Er1 As Integer, Er2 As Integer, i As Integer
  Dim Luu As Variant
  Dim Sh As Worksheet
  Application.ScreenUpdating = False
  With Sheet1
    Er1 = .[C65536].End(xlUp).Row
    If Er1 <= 4 Then Er1 = 5
    .Range("A5:C" & Er1).ClearContents: .[C4].Cut: .[B4].Insert Shift:=xlToRight
  End With
  For Each Sh In ThisWorkbook.Worksheets
    Er2 = Sheet1.[A65536].End(xlUp).Row + 1
    If Er2 <= 4 Then Er2 = 5
    If Sh.Name <> Sheet1.Name Then
      With Sh
        Set TD = .[A4].Resize(1, .[A4].End(xlToRight).Column)
        Luu = TD.Value: TD.ClearContents
        Set Rng = .[A5].CurrentRegion
        Rng.Copy Destination:=Sheet1.Cells(Er2, 1)
        TD.Value = Luu
        Sheet1.Cells(Er2, 3).Resize(Rng.Rows.Count, 1).Value = .Name
      End With
    End If
  Next Sh
  With Sheet1
    .Range("C4:C" & .[C65536].End(xlUp).Row).Cut: .[B4].Insert Shift:=xlToRight
  End With
  Set Rng = Nothing: Set TD = Nothing
  Application.ScreenUpdating = True
End Sub
Mời xem file!
Lưu ý: Tốt nhất bạn không nên đặt tên sheet là tiếng Việt có dấu (sẽ rất nhiều bất lợi cho bạn sau này)
Với ThuNghi: Theo như tác giã mô tả trong file thì tôi thấy bạn ấy chỉ muốn copy toàn bộ dử liệu các sheet vào chung 1 sheet chứ đâu có nói SUMIF gì đâu nhỉ?
Em đã đọc bài viết của bác rồi em thấy rằng đây một hướng xử lý rất tốt. Em rất muốn học cách của bác để ứng dụng vào bài của em (công việc xử lý của em rất phức tạp mà nếu có xử lý được bằng công thức bình thường thì có lẽ file sẽ rất nặng). Em lại vừa bước vào tập tành VBA nên chưa biết nhiều (em cũng đã mua quyển sách của anh Phan Tự Hướng). Mong bác giải thích đại ý các câu giùm em để em "bắt chước". Thực sự mong bác bớt chút thời gian giúp em
 
Làm xong rồi mà giờ nhìn lại code của chính mình vẩn thấy "tối mù"... chả biết đường nào mà lần!
File đính kèm nó nằm chổ nào? Bạn cho đường link đi (tôi chẳng nhớ nổi)
Nói tóm gọn trước: Thông thường khi giãi quyết 1 bài toán thì đương nhiên trong đầu tôi phải có cái "hướng" để làm (gọi là thuật toán)
Cái hướng ấy đi theo trình tự nào đó qua từng bước... Vậy tôi sẽ giãi quyết từng bước nhỏ trước... khi thành công sẽ "ráp" lại dần dần... Cuối cùng thành 1 giãi pháp hoàn chỉnh
Các bước trong code trên có thể tóm tắt như sau:
1> Xóa trắng vùng đích trước
2> Quét qua các sheet (trừ sheet đích)
3> Xác định vùng cần lấy dử liệu của từng sheet và copy nó
4> Cùng lúc xác định luôn cell cuối cùng của sheet đích
5> Dán dử liệu đã copy vào cell cuối này
6> Cứ thế tiếp tục cho đến sheet cuối cùng

Đại khái là vậy (còn những thứ lặt vặt khác)
Ai chà... giờ biểu giãi thích từng câu chắc... đói luôn (tôi không chuyên về món này)
 
Làm xong rồi mà giờ nhìn lại code của chính mình vẩn thấy "tối mù"... chả biết đường nào mà lần!
File đính kèm nó nằm chổ nào? Bạn cho đường link đi (tôi chẳng nhớ nổi)
Rất mong bác giải thích giúp em. Đại khái thôi cũng được
 

File đính kèm

Mã:
Option Explicit
Private Sub Worksheet_Activate()
  Dim Rng As Range, TD As Range
  Dim Er1 As Integer, Er2 As Integer, i As Integer
  Dim Luu As Variant
  Dim Sh As Worksheet   '[B][COLOR=Blue]1>---> Mấy cái Dim này chắc khỏi cần nói nhỉ?[/COLOR][/B]
  Application.ScreenUpdating = False [COLOR=Blue][B]'2>---> Thêm vào đầu code cho màn hình khỏi cà giật[/B][/COLOR]
  With Sheet1
    Er1 = .[C65536].End(xlUp).Row [B][COLOR=Blue] '3>---> Tại sheet1, Lấy cột C làm chuẩn, xác định xem dòng cuối cùng có dử liệu là dòng mấy[/COLOR][/B]
    If Er1 <= 4 Then Er1 = 5  [COLOR=Blue][B]'4>---> Để làm cho Er1 luôn có giá trị nhỏ nhất là 5[/B][/COLOR]
    .Range("A5:C" & Er1).ClearContents: .[C4].Cut: .[B4].Insert Shift:=xlToRight '[COLOR=Blue][B]5>---> Xóa hết vùng dử liệu từ cột A đến cột C, từ dòng 5 đến dòng Er1... tiếp theo đảo trật tự giữa C4 và B4[/B][/COLOR]
  End With 
  For Each Sh In ThisWorkbook.Worksheets '[B][COLOR=Blue]6>---> Quét qua các sheet[/COLOR][/B]
    Er2 = Sheet1.[A65536].End(xlUp).Row + 1 '[COLOR=Blue][B]7>---> Cùng lúc xem thử dòng cuối ở sheet 1 là dòng mấy[/B][/COLOR]
    If Er2 <= 4 Then Er2 = 5  '[B][COLOR=Blue]8>---> Giống mục 4[/COLOR][/B]
    If Sh.Name <> Sheet1.Name Then '[COLOR=Blue][B]9>---> Điều kiện này nói rằng: quét hết các sheet, trừ sheet1[/B][/COLOR]
      With Sh
        Set TD = .[A4].Resize(1, .[A4].End(xlToRight).Column) '[B][COLOR=Blue]10---> Xác định vùng tiêu đề ở mổi sheet[/COLOR][/B]
        Luu = TD.Value: TD.ClearContents '[COLOR=Blue][B]11>---> Lưu lại vùng tiêu đề này vào 1 biến tạm sau đó xóa luôn tiêu đề[/B][/COLOR]
        Set Rng = .[A5].CurrentRegion '[COLOR=Blue][B]12---> Xác định vùng dử liệu sau khi đã xóa tiêu đề[/B][/COLOR]
        Rng.Copy Destination:=Sheet1.Cells(Er2, 1) '[B][COLOR=Blue]13---> Copy vùng dử liệu vừa xác định, paste vào dòng cuối cùng có dử liệu tại sheet 1, cột A[/COLOR][/B]
        TD.Value = Luu '[COLOR=Blue][B]14>---> Copy và paste xong thì trả tiêu đề đã xóa về vị trí ban đầu[/B][/COLOR]
        Sheet1.Cells(Er2, 3).Resize(Rng.Rows.Count, 1).Value = .Name  '[COLOR=Blue][B]15>---> Mục 13 làm xong ta được 2 cột, giờ gán thêm cột thứ 3 chính là tên sheet mà ta vừa quét qua[/B][/COLOR]
      End With
    End If
  Next Sh '[B][COLOR=Blue]16>----> Tiếp tục quét đến khi nào hết các sheet thì thôi[/COLOR][/B]
  With Sheet1
    .Range("C4:C" & .[C65536].End(xlUp).Row).Cut: .[B4].Insert Shift:=xlToRight '[COLOR=Blue][B]17>---> Đảo trật tự 2 cột B và C với nhau cho giống với yêu cầu của bạn[/B][/COLOR]
  End With
  Set Rng = Nothing: Set TD = Nothing   '[B][COLOR=Blue]18>---> Xã xì... trét[/COLOR][/B]
  Application.ScreenUpdating = True       [COLOR=Blue]'[B]19>---> Ẹc... Ẹc.... Ở mục 2 ta đã làm cái gì đó, giờ trả mọi thứ về chổ củ[/B][/COLOR]
End Sub
Xỉu.............
 
Em đang cần trau dồi kiến thức về Name, cách của anh duongdv mỗi Sheet con đặt 1 Name
PHP:
ctya='Công ty A'!$A$5:$B$25
PHP:
ctyb='Công ty B'!$A$4:$B$26

trong trường hợp này thì ổn nhưng nếu có khoảng 20 Sheet con cần tổng hợp thì rất mệt, có cách nào mà Name dùng chung cho tất cả các Sheet không (dĩ nhiên là các Sheet con phải thống nhất về cấu trúc bảng dữ liệu rồi)? Em đang hình dung ra cái vụ Indirect, nhưng chưa cụ thể được, mong các thày chỉ bảo cho
 
Lần chỉnh sửa cuối:
Em đang cần trau dồi kiến thức về Name, cách của anh duongdv mỗi Sheet con đặt 1 Name
PHP:
ctya='Công ty A'!$A$5:$B$25
PHP:
ctyb='Công ty B'!$A$4:$B$26

trong trường hợp này thì ổn nhưng nếu có khoảng 20 Sheet con cần tổng hợp thì rất mệt, có cách nào mà Name dùng chung cho tất cả các Sheet không (dĩ nhiên là các Sheet con phải đồng nhất về mặt dữ liệu rồi)? Em đang hình dung ra cái vụ Indirect, nhưng chưa cụ thể được, mong các thày chỉ bảo cho

Nếu dữ liệu trong Name là giống nhau, vậy thì cần 1 name ở 1 sheet là đủ rồi, các công thức lấy name này mà sử dụng thôi, đâu cần 1 name 1 sheet chứ!
 
Em đang cần trau dồi kiến thức về Name, cách của anh duongdv mỗi Sheet con đặt 1 Name
PHP:
ctya='Công ty A'!$A$5:$B$25
PHP:
ctyb='Công ty B'!$A$4:$B$26

trong trường hợp này thì ổn nhưng nếu có khoảng 20 Sheet con cần tổng hợp thì rất mệt, có cách nào mà Name dùng chung cho tất cả các Sheet không (dĩ nhiên là các Sheet con phải thống nhất về cấu trúc bảng dữ liệu rồi)? Em đang hình dung ra cái vụ Indirect, nhưng chưa cụ thể được, mong các thày chỉ bảo cho
Hình dung đúng hướng rồi đấy!
Name chung là vầy:
Cty = INDIRECT("A5:B25")
Không quan tâm tên sheet là gì ----> Đứng tại sheet nào thì nó vẫn tham chiếu vùng A5:B25
 

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

Back
Top Bottom