Gộp 3 sheet vào 1 sheet! (1 người xem)

Liên hệ QC

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

CFAdream

Thành viên mới
Tham gia
24/9/09
Bài viết
4
Được thích
0
Xin chào các cao thủ excel!
Mình có bài toán này mãi không giải được, cũng đã tìm các chủ đề để xem nhưng vẫn chưa ra. Nếu chỉ cần dùng lệnh trong excel thì mong các bạn chỉ giúp còn nếu cần đến VBA thì các bạn cũng hướng dẫn, mình quyết tâm thể hiện tinh thần cầu thị, và nếu không áp dụng được thì sẽ mua sách VBA về đọc cho ra thì thôi các bác ạ.
Làm thế nào để gộp 3 sheet (sheet 1,2,3) vào 1 sheet (là sheet 4 trong file đính kèm) theo trật tự mình đã trình bày?
Nếu mà câu hỏi này đã có ở chủ đề nào cũng mong các bạn thông cảm và cho mình đường link nhé!
Ngoài ra mình cũng muốn hỏi xem làm thế nào để copy một cột (X) vào một cột (Y) ở sheet khác sau khi cột Y đã được filter mà không bị paste xuyên cả vào những ô đã ẩn?
Cảm ơn các bạn!
 

File đính kèm

Mình dùng code sau, bạn mở file đính kèm, nhớ Enables Macro --> Nhấn nút

Mình chưa kiểm tra kết quả, bạn dò lại thử và cho ý kiến.

PHP:
Sub TongHop()
    Dim Wsh As Worksheet, ActWsh As Worksheet
    Application.ScreenUpdating = False
    Set ActWsh = ActiveSheet
    Range("A2:L65536").ClearContents
    For Each Wsh In ThisWorkbook.Sheets
        If Wsh.Name <> ActWsh.Name Then
            Wsh.Activate
            Range("A2", [L65536].End(xlUp)).Copy _
            ActWsh.Range("A" & ActWsh.[A65536].End(xlUp).Row + 1)
        End If
    Next Wsh
    ActWsh.Activate
    Range("A2", [L65536].End(xlUp)).Sort [A2], xlAscending, , , , , , xlNo
    Application.ScreenUpdating = True
End Sub

Nếu bạn thay đổi số liệu ở các Sheet khác --> Sang Sheet4 và nhấn nút lại.
 

File đính kèm

Lần chỉnh sửa cuối:
Macro của bạn đây, xin mời (Xem thêm trong file đính kèm)

PHP:
Option Explicit
Sub TgHop()
 Dim Sh As Worksheet, Sht As Worksheet
 Dim Rng As Range, sRng As Range, Clls As Range
 Dim MyAdd As String:         Dim eRw As Long, jJ As Long
 
 Set Sht = Sheets("TH")
 Set Rng = Sht.Range(Sht.[b1], Sht.[B65500].End(xlUp))
 For Each Sh In Worksheets
   If Sh.Name <> Sht.Name Then
      eRw = Sh.[B65500].End(xlUp).Row
      For jJ = 2 To eRw
         Set sRng = Rng.Find(Sh.Cells(jJ, "B").Value, , xlFormulas, xlWhole)
         If Not sRng Is Nothing Then
            MyAdd = sRng.Address
            Do
               If sRng.Offset(, -1).Value = Sh.Cells(jJ, "A").Value Then
                  sRng.Offset(, 1).Resize(, 10).Value = Sh.Cells(jJ, "C").Resize(, 10).Value
               End If
               Set sRng = Rng.FindNext(sRng)
            Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
         End If
      Next jJ
   End If
 Next Sh
End Sub
 

File đính kèm

PHP:
Option Explicit
Sub TgHop()
 Dim Sh As Worksheet, Sht As Worksheet
 Dim Rng As Range, sRng As Range, Clls As Range
 Dim MyAdd As String:         Dim eRw As Long, jJ As Long
 
 Set Sht = Sheets("TH")
 Set Rng = Sht.Range(Sht.[b1], Sht.[B65500].End(xlUp))
 For Each Sh In Worksheets
   If Sh.Name <> Sht.Name Then
      eRw = Sh.[B65500].End(xlUp).Row
      For jJ = 2 To eRw
         Set sRng = Rng.Find(Sh.Cells(jJ, "B").Value, , xlFormulas, xlWhole)
         If Not sRng Is Nothing Then
            MyAdd = sRng.Address
            Do
               If sRng.Offset(, -1).Value = Sh.Cells(jJ, "A").Value Then
                  sRng.Offset(, 1).Resize(, 10).Value = Sh.Cells(jJ, "C").Resize(, 10).Value
               End If
               Set sRng = Rng.FindNext(sRng)
            Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
         End If
      Next jJ
   End If
 Next Sh
End Sub

Có yêu cầu gì trước khi chạy code không bạn, không biết sao mình test thử không được nhỉ +-+-+-++-+-+-++-+-+-+
 
Mình dùng code sau, bạn mở file đính kèm, nhớ Enables Macro --> Nhấn nút

Mình chưa kiểm tra kết quả, bạn dò lại thử và cho ý kiến.

PHP:
Sub TongHop()
    Dim Wsh As Worksheet, ActWsh As Worksheet
    Application.ScreenUpdating = False
    Set ActWsh = ActiveSheet
    Range("A2:L65536").ClearContents
    For Each Wsh In ThisWorkbook.Sheets
        If Wsh.Name <> ActWsh.Name Then
            Wsh.Activate
            Range("A2", [L65536].End(xlUp)).Copy _
            ActWsh.Range("A" & ActWsh.[A65536].End(xlUp).Row + 1)
        End If
    Next Wsh
    ActWsh.Activate
    Range("A2", [L65536].End(xlUp)).Sort [A2], xlAscending, , , , , , xlNo
    Application.ScreenUpdating = True
End Sub
Nếu bạn thay đổi số liệu ở các Sheet khác --> Sang Sheet4 và nhấn nút lại.



Theo mình hiểu thì tác giả câu hỏi không định hỏi thế vì người lao động (1,2,3..) có thể chỉ là số thứ tự hoặc tên khác nhau, khi đó xếp theo kiểu 1,1,1,2,2,2.. có vẻ không nhiều ý nghĩa lắm.

Hay tác giả câu hỏi muốn tổng hợp theo từng năm một (giữ nguyên format, hết năm 2007 rồi đến 2008...), tức là ấn 1 nút "tổng hợp" thay vì manually copy-paste ^^.
 
Mình dùng code sau, bạn mở file đính kèm, nhớ Enables Macro --> Nhấn nút

Mình chưa kiểm tra kết quả, bạn dò lại thử và cho ý kiến.

PHP:
Sub TongHop()
    Dim Wsh As Worksheet, ActWsh As Worksheet
    Application.ScreenUpdating = False
    Set ActWsh = ActiveSheet
    Range("A2:L65536").ClearContents
    For Each Wsh In ThisWorkbook.Sheets
        If Wsh.Name <> ActWsh.Name Then
            Wsh.Activate
            Range("A2", [L65536].End(xlUp)).Copy _
            ActWsh.Range("A" & ActWsh.[A65536].End(xlUp).Row + 1)
        End If
    Next Wsh
    ActWsh.Activate
    Range("A2", [L65536].End(xlUp)).Sort [A2], xlAscending, , , , , , xlNo
    Application.ScreenUpdating = True
End Sub

Nếu bạn thay đổi số liệu ở các Sheet khác --> Sang Sheet4 và nhấn nút lại.
- Duyệt qua các sheet bạn nên hạn chế mấy dòng lệnh dạng Wsh.Activate --> Vì nó sẽ làm chậm quá trình
- Thay vì copy, ta có thể gán Value cho sheet Tổng hợp luôn
Kiểu vầy đây:
PHP:
Sub TongHop()
  Dim Sh As Worksheet
  Sheets("TH").Range("A2:L65536").ClearContents
  For Each Sh In ThisWorkbook.Sheets
    If Sh.Name <> "TH" Then
      With Sh.Range("A2").CurrentRegion.Offset(1)
        Sheets("TH").Range("A65536").End(xlUp).Offset(1).Resize(.Rows.Count, .Columns.Count) = .Value
      End With
    End If
  Next Wsh
End Sub
Đương nhiên trước đó ta phải đặt tên cho sheet cần tổng hợp là TH
Tôi nghĩ làm theo kiểu này cho tốc độ nhanh hơn!
Bài toán này chỉ là gộp các sheet... nếu có tính tổng ta dùng PivotTable hoặc Consolidate lại càng dể hơn
 
Theo mình hiểu thì tác giả câu hỏi không định hỏi thế vì người lao động (1,2,3..) có thể chỉ là số thứ tự hoặc tên khác nhau, khi đó xếp theo kiểu 1,1,1,2,2,2.. có vẻ không nhiều ý nghĩa lắm.

Hay tác giả câu hỏi muốn tổng hợp theo từng năm một (giữ nguyên format, hết năm 2007 rồi đến 2008...), tức là ấn 1 nút "tổng hợp" thay vì manually copy-paste ^^.
Tớ cảm ơn tất cả các bạn đã cho lời giải. Nhưng tối nay tớ mới check lại được. Cảm ơn nhiều nhé!
Còn để 111,222 là số id của từng lao động theo 3 năm 200720082009
Tớ chuyển sang file tổng hợp để sau đó nhập vào stata nên nó có dạng này mà!
 
PHP:
Option Explicit
Sub TgHop()
 Dim Sh As Worksheet, Sht As Worksheet
 Dim Rng As Range, sRng As Range, Clls As Range
 Dim MyAdd As String:         Dim eRw As Long, jJ As Long
 
 Set Sht = Sheets("TH")
 Set Rng = Sht.Range(Sht.[b1], Sht.[B65500].End(xlUp))
 For Each Sh In Worksheets
   If Sh.Name <> Sht.Name Then
      eRw = Sh.[B65500].End(xlUp).Row
      For jJ = 2 To eRw
         Set sRng = Rng.Find(Sh.Cells(jJ, "B").Value, , xlFormulas, xlWhole)
         If Not sRng Is Nothing Then
            MyAdd = sRng.Address
            Do
               If sRng.Offset(, -1).Value = Sh.Cells(jJ, "A").Value Then
                  sRng.Offset(, 1).Resize(, 10).Value = Sh.Cells(jJ, "C").Resize(, 10).Value
               End If
               Set sRng = Rng.FindNext(sRng)
            Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
         End If
      Next jJ
   End If
 Next Sh
End Sub
Tớ chạy được rồi, ngon lành//**/! Nhưng nói thật là tớ chẳng hiểu j--=0. Thế nên chắc phải học một khóa VBA thui. Chúc cả nhà một tuần làm việc hiệu quả nhé!
 
http://www.giaiphapexcel.com/forum/...-cập-nhật-số-liệu-tự-động&p=530577#post530577
Tình hình là em muốn là 1 cái excel. mà trong đó số liệu mình cập nhật hàng tháng. mỗi sheet vl như hòa thắng, thống nhất... mình nhập số liệu vào đó hằng tháng. em muốn sau khi mình nhập số liệu vào các sheet kia thỳ số liệu sẽ được tự động chuyển qua sheet1. dữ liệu bên sheet 1 là tổng hợp số liệu của các sheet kia!$@!! mỗi hàng bên sheet1 sẽ là số liệu của mỗi sheet kia, cái này là theo tên các sheet tương ứng. số liệu ở mỗi cột bên sheet 1 tương tự theo tên sẽ là các hàng bên các sheet khác. các bác có thể vào gúip em 1 tý được không ah. em nghĩ mãi mà vẫn chưa biết làm như thế nào cả.. hic. link bài viết em để bên trên vì không biết trả lời mà đính kèm file như thế nào cả
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom