Tự động lấy danh sách vào sheet tổng hợp

Liên hệ QC

vonguyen3745

Thành viên hoạt động
Tham gia
18/7/09
Bài viết
145
Được thích
5
Chào các bạn. Mình đã đọc nhiều chủ đề liên quan đến vấn đề này rồi nhưng khi mình áp dụng vào file của mình đều không được ( các bác đừng bực mình nhé, tui không biết gì về VBA mà --=0--=0) vậy mình mạo muội gửi file này lên nhờ các đại ca giúp cho.
Các Bác viết code cho em trong trường hợp tổng quát nhất ( nghĩa là số lượng sheet có thể thay đổi, vùng tiêu đề có thể thay đổi )
và khi coppy dữ liệu từ các sheet thì coppy luôn cả định dạng vào sheet tổng nhé.
Xin chân thành cảm ơn các Bác.
em không đưa file lên diễn đàn được mong các bác chịu khó tải về tại đây:http://www.mediafire.com/?71kevy555aqbswz
 
Lần chỉnh sửa cuối:
Ý của Bạn muốn tổng hợp như thế nào? Ghi rõ yêu cầu trong file rồi gửi lên chứ gởi file mà ko có yêu cầu gì trong đó khó mà biết được? Ghi càng chi tiết thì Bạn càng sớm có kết quả tốt và chính xác.
 
Upvote 0
tôi đã nói rõ rồi mà, tôi muốn viết code để lấy danh sách từ các sheet vào một sheet tổng. tôi đã gửi trong file đính kèm rồi mà.Mong các bạn sớm giúp tôi.
 
Upvote 0
tôi đã nói rõ rồi mà, tôi muốn viết code để lấy danh sách từ các sheet vào một sheet tổng. tôi đã gửi trong file đính kèm rồi mà.Mong các bạn sớm giúp tôi.
Thử code vầy xem:
PHP:
Sub CollectData(RngAddress As String, Target As Range)
  Dim Sh As Worksheet, Main As Worksheet, TmpRng As Range, Title As Range
  On Error Resume Next
  Application.ScreenUpdating = False
  Set Main = Target.Parent
  With Main.Range(RngAddress)
    .Parent.Range(Target.Resize(.Rows.Count, .Columns.Count), _
    Target.Resize(.Rows.Count, .Columns.Count).End(xlDown)).Clear
  End With
  For Each Sh In ThisWorkbook.Worksheets
    If Sh.Name <> Main.Name Then
      If Title Is Nothing Then
        Set Title = Sh.Range(RngAddress).Resize(1)
        Title.Copy Target
      End If
      Set TmpRng = Intersect(Sh.Range(RngAddress), Sh.Range(RngAddress).Offset(1))
      TmpRng.Copy
      Target(1, 1).Offset(1).PasteSpecial 3
      Target(1, 1).Offset(1).PasteSpecial 4
      Set Target = Main.Cells(65536, Target(1, 1).Column).End(xlUp)
    End If
  Next
  Target.Select
  Application.CutCopyMode = False
  Application.ScreenUpdating = True
End Sub
PHP:
Sub Main()
  CollectData "A5:J1000", Sheets("Sum").Range("A5")
End Sub
Chỉ cần quan tâm đến đoạn code thứ 2 (Sub Main)! Khi bạn muốn tổng hợp, chỉ cần xác định:
- Địa chỉ cell ở các sheet con ---> Có thể áng chừng cho dư ra cũng được ---> Ở trên tôi cho vùng này là A5:J1000
- Cell đầu tiên sẽ đặt dữ liệu copy ---> Ở trên tôi cho nó là cell A5 tại sheet Sum
Vậy là chạy code và xem kết quả ---> Đương nhiên code sẽ lấy tất cả dữ liệu ở các sheet, ngoài trừ sheet chứa cell Target
 

File đính kèm

Upvote 0
Chào các bạn. Mình đã đọc nhiều chủ đề liên quan đến vấn đề này rồi nhưng khi mình áp dụng vào file của mình đều không được ( các bác đừng bực mình nhé, tui không biết gì về VBA mà --=0--=0) vậy mình mạo muội gửi file này lên nhờ các đại ca giúp cho.
Các Bác viết code cho em trong trường hợp tổng quát nhất ( nghĩa là số lượng sheet có thể thay đổi, vùng tiêu đề có thể thay đổi )
và khi coppy dữ liệu từ các sheet thì coppy luôn cả định dạng vào sheet tổng nhé.
Xin chân thành cảm ơn các Bác.
em không đưa file lên diễn đàn được mong các bác chịu khó tải về tại đây:http://www.mediafire.com/?71kevy555aqbswz

Quả thật tôi cũng không rõ ý của bạn như thế nào ? viết đại theo suy đoán của mình. Bạn xem thử có đúng ý không nha.

PHP:
Sub Tong_hop()
Application.ScreenUpdating = False
On Error Resume Next
Sheets("TongHop").[b6:k1000].Clear
For Each sh In Worksheets
    If sh.Name <> "TongHop" Then
        tmp = sh.Cells.Find("1", , , 2).Address
        sh.Range(tmp).Resize(100, 10).Copy Sheets("TongHop").[b65536].End(3)(2)
        tmp = ""
    End If
Next
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Lở cell nào đó (chẳng hạn là A2) mà chứa số 1 thì chắc... tiêu quá anh ơi! ---> Code này hơi nguy hiểm
Ẹc... Ẹc...

Các code mình viết chỉ nhằm cho một tình huống cụ thể nào đó, mình viết mình dùng thì OK - sai đâu sửa đó. Còn người khác thì... ăn may vậy.
nhân tiện cho mình hỏi .Parent trong code của Ndu có nghĩa là gì vậy ?

P/s "Hướng dẫn sử dụng trước khi dùng" Code trên tôi xác định đầu bảng dữ liệu là số 1 vì vậy cần lưu ý: phải đánh số thứ tự bắt đầu là 1 và phía trên, phía trước bảng không được có số 1
 
Lần chỉnh sửa cuối:
Upvote 0
bác ndu giải thích cho em cái code cái.
mới tập tành VB nên gà quá coi không hiểu lắm
 
Upvote 0
Cảm ơn các Bác, Bác đều viết đúng ý em rồi.
Các Bác Pro quá. Các bác có tài liệu gì về viết code cho em xin ít để em hoc hỏi dần.
tiện thể các bác cho em hỏi:
tmp = sh.Cells.Find("1", , , 2).Address nghĩa là gì vậy, em thấy Bác ndu bảo nguy hiểm mè em không hiểu gì hết à.--=0--=0
 
Lần chỉnh sửa cuối:
Upvote 0
HELP ME!
code của Bac Trung chinh khi em kéo danh sách trong 1 sheet của em lên 150 dòng thì nó chỉ tổng hợp 100 dòng thôi, em muốn có khoảng 500 dòng trên một sheet ( sheet thành phần nhé, không phải sheet tổng đâu) thì phải sửa code ở chỗ nào hả bác?
có phải chỗ này không bác:
[b6:k1000]
Resize(100, 10)
 
Upvote 0
tmp = sh.Cells.Find("1", , , 2).Address nghĩa là gì vậy, em thấy Bác ndu bảo nguy hiểm mè em không hiểu gì hết à.
Code của anh Trung Chinh định vị vùng dữ liệu dựa vào việc tìm số 1 (giống Ctrl + F ấy)
Chính thế mà nếu dữ liệu của bạn có số 1 ở cell nào đó phía trên (chẳng hạn là cell A2) thì code sẽ sai hoàn toàn
Tương tự thế, nếu trong sheet dữ liệu không có cột số thứ tự thì code cũng sai luôn
-------------------------
nhân tiện cho mình hỏi .Parent trong code của Ndu có nghĩa là gì vậy ?
Cái này em giải thích nhiều lần rồi mà anh
Parent là CHA ME
Target.Parent là cha mẹ của cell Target, tức sheet chứa cell Target
Hoặc ví dụ khác:
ActiveSheet.Parent.Name chính là tên của Workbook (cấp cao hơn của sheet là Workbook)
------------------------
HELP ME!
code của Bac Trung chinh khi em kéo danh sách trong 1 sheet của em lên 150 dòng thì nó chỉ tổng hợp 100 dòng thôi, em muốn có khoảng 500 dòng trên một sheet ( sheet thành phần nhé, không phải sheet tổng đâu) thì phải sửa code ở chỗ nào hả bác?
có phải chỗ này không bác:
[b6:k1000]
Resize(100, 10)
Thử sửa Resize(100, 10) thành Resize(1000, 10) xem thế nào
 
Lần chỉnh sửa cuối:
Upvote 0
Theo code của Bác Trung Chinh thì không phụ thuộc vào phần tiêu đề của em gồm mấy dòng nhỉ, miễn sao có số thứ tự là được phải không Bác ndu, Trung Chinh.
 
Upvote 0
Theo code của Bác Trung Chinh thì không phụ thuộc vào phần tiêu đề của em gồm mấy dòng nhỉ, miễn sao có số thứ tự là được phải không Bác ndu, Trung Chinh.
Chính xác là vậy! Ngoài ra còn 1 lưu ý quan trọng khác:
- Dòng tiêu đề bạn phải tự copy bằng tay, code không làm việc này
- Chỉ cột STT mới được nhập số
- Nếu có cell nào đó cũng có chứa số 1 thì.. hên xui --> Có thể code sẽ sai (nhất là khi số 1 ấy nằm trên dòng với cột STT)
---------
Bạn có thể thí nghiệm để tìm ra những ưu điểm và nhược điểm của code
 
Upvote 0
Vậy nếu ngoài cột số thứ tự ra, các cột khác không được phép có số 1 hả Bác, thế thì chết em mất, em có cột điểm của học sinh mà học sinh của em nó được 1 điểm thì "toi" rồi nhỉ.
 
Upvote 0
Vậy nếu ngoài cột số thứ tự ra, các cột khác không được phép có số 1 hả Bác, thế thì chết em mất, em có cột điểm của học sinh mà học sinh của em nó được 1 điểm thì "toi" rồi nhỉ.
Không hằn là thế!
- Tùy theo Find Method tìm được số 1 tại cell nào trước
- Chỉ số 1 nằm 1 mình mới chịu ảnh hưởng của code
- Nếu cột điểm có cell nào đó chứa số 1 nằm 1 mình, đồng thời lại nằm trước cột STT hoặc trên dòng với cột STT thì mới đáng lo
-------------
Ví dụ thế này nhé:
- Cột STT được nhập từ cell C5 trở xuống
- Vậy tại cột A và B hoặc các cell từ dòng 1 đến dòng 4 bạn không được có bất cứ số 1 nào nằm 1 mình
- Thế thì code sẽ không có vấn đề
 
Upvote 0
à ra thế, bây giờ thì em đã hiểu. Chân thành cảm ơn Bác ndu.
 
Upvote 0
Xin nhắc lại Bạn cần đặc biệt chú ý:
1. Phải có cột STT và phải đánh số thứ tự bắt đầu là 1.
2. Phía trên cột STT và phía trước cột STT không được có số 1.
Vd: cột STT là cột B và học sinh đầu tiên nằm tại dòng 6 (tức số 1 nằm tại B6) thì Từ B1 đến B5 không được có số 1; cột A không được có số 1. Trường hợp cột STT là cột A (không có cột thừa phía trước) thì đương nhiên A1 đến A6 không được có số 1.

Và sửa lại code như sau (thêm số 2 màu đỏ để quy định cách dò tìm theo cột)

Mã:
Sub Tong_hop()
Application.ScreenUpdating = False
On Error Resume Next
Sheets("TongHop").[b6:k1000].Clear
For Each sh In Worksheets
    If sh.Name <> "TongHop" Then
        tmp = sh.Cells.Find("1", , , 2,[B][COLOR="red"][SIZE="4"]2[/SIZE][/COLOR][/B]).Address
        sh.Range(tmp).Resize(100, 10).Copy Sheets("TongHop").[b65536].End(3)(2)
        tmp = ""
    End If
Next
End Sub
 
Upvote 0
Thử code vầy xem:
PHP:
Sub CollectData(RngAddress As String, Target As Range)
  Dim Sh As Worksheet, Main As Worksheet, TmpRng As Range, Title As Range
  On Error Resume Next
  Application.ScreenUpdating = False
  Set Main = Target.Parent
  With Main.Range(RngAddress)
    .Parent.Range(Target.Resize(.Rows.Count, .Columns.Count), _
    Target.Resize(.Rows.Count, .Columns.Count).End(xlDown)).Clear
  End With
  For Each Sh In ThisWorkbook.Worksheets
    If Sh.Name <> Main.Name Then
      If Title Is Nothing Then
        Set Title = Sh.Range(RngAddress).Resize(1)
        Title.Copy Target
      End If
      Set TmpRng = Intersect(Sh.Range(RngAddress), Sh.Range(RngAddress).Offset(1))
      TmpRng.Copy
      Target(1, 1).Offset(1).PasteSpecial 3
      Target(1, 1).Offset(1).PasteSpecial 4
      Set Target = Main.Cells(65536, Target(1, 1).Column).End(xlUp)
    End If
  Next
  Target.Select
  Application.CutCopyMode = False
  Application.ScreenUpdating = True
End Sub
PHP:
Sub Main()
  CollectData "A5:J1000", Sheets("Sum").Range("A5")
End Sub
Chỉ cần quan tâm đến đoạn code thứ 2 (Sub Main)! Khi bạn muốn tổng hợp, chỉ cần xác định:
- Địa chỉ cell ở các sheet con ---> Có thể áng chừng cho dư ra cũng được ---> Ở trên tôi cho vùng này là A5:J1000
- Cell đầu tiên sẽ đặt dữ liệu copy ---> Ở trên tôi cho nó là cell A5 tại sheet Sum
Vậy là chạy code và xem kết quả ---> Đương nhiên code sẽ lấy tất cả dữ liệu ở các sheet, ngoài trừ sheet chứa cell Target

Bác ndu giải thích từng dòng code bác viết cho em nghe với
tự mầy mò để hiểu cái code bác viết khó quá
Từ cái đoạn code " Set Main = Target.Parent " trở xuống
em gà mà các bác coi đừng cười
icon9.gif
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom