Tổng hợp nhiều sheet vào 1 sheet có điều kiện (2 người xem)

Liên hệ QC

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

thufpts

Thành viên hoạt động
Tham gia
6/8/12
Bài viết
157
Được thích
6
Giới tính
Nam
Nghề nghiệp
Bốc vác
Chào các bác
em đang có vấn đề này đau đầu quá, em có 1 file bao gồm nhiều sheet được đặt tên theo người phụ trách
bây giờ em muốn tổng hợp tất cả các sheet đó vào 1 sheet Summary ở đây chỉ có môt điểm khác biệt là
chỉ những sheet được chọn mới được copy về sheet Summary, về phần này em mong các bác có thể để giúp một dòng code nào đó để khi muốn thêm sheet hoặc thay đổi tên sheet em có thể mở code tự edit.

Cái sheet Summary nó sảy ra 2 trường hợp đó là có thể để chung cùng file với các sheet cần copy, thứ 2 là tách rời tức là sẽ có 2 file 1 file chứa các sheet cần tổng hợp, file thứ 2 chứa sheet summary là kết quả trả về của các sheet cần copy, khi cần tổng hợp file chứa sheet summary sẽ link đến file chứa các sheet cần copy để tổng hợp dữ liệu.

Em đã lên mạng tìm hiểu và copy được đoạn code về để chạy nhưng khả năng có hạn không thể ra dc kết quả như ý, còn bị mất cả dòng tiêu đề, rất mong các bác giúp đỡ
 

File đính kèm

Muốn người khác giúp thì hãy tập mô tả vấn đề. Người khác không hiểu thì giúp bằng niềm tin ả?
1. Lấy dữ liệu nguồn vào Summary. Từ mỗi sheet nguồn lấy hết các dòng, không có điều kiên gì? Đừng bắt người khác phải dò, kiểm tra kỹ để hiểu ý của mình một khi mình có thể mô tả bằng một câu.
2. Cách ghi vào Summary.
- Khi tổng hợp thì trước tiên xóa kết quả cũ của lần tổng hợp cũ, và dữ liệu của những sheet nguồn ghi ở những dòng liên tiếp?
- Khi tổng hợp thì không xóa kết quả cũ của lần tổng hợp trước, và dữ liệu của những sheet nguồn ghi ở những dòng liên tiếp, sau kết quả cũ của lần tổng hợp trước?

Vân vân và mây mây.

Tôi có thể đoán được ý của bạn. Nhưng ở đây tôi nói về nguyên tắc. Hãy mô tả và đừng bắt người khác phải đoán.

Những bài kiểu tổng hợp dữ liệu thì nên có cấu trúc y như nhau và vị trí y như nhau. Không thể trong Ngoan, Dung, Huyen tiêu đề ở dòng 1 nhưng trong Nga lại ở dòng 2. Tùy tiện thì chỉ làm khó mình.

Tạm thời dùng code của bạn, tôi sửa phần xóa dữ liệu cũ.

Mở tập tin -> phải chuột trên tên Summary trên sheet tabs ở dưới cùng -> View code -> dán code sau
Mã:
Private Sub Worksheet_Activate()
  Dim Sh As Worksheet
  Application.ScreenUpdating = False
  Range("A2").Resize(500000, 500).ClearContents
  For Each Sh In Worksheets
    If Sh.Name <> "Summart" Then
       Sh.Range("A2").CurrentRegion.Offset(1).Copy
       Range("A65536").End(xlUp).Offset(1).PasteSpecial 3
    End If
  Next Sh
  Application.CutCopyMode = False
End Sub

-> xóa Module1.

Code phải đặt trong module của sheet Summary. Không thể đặt trong Module1 được.
 
Lần chỉnh sửa cuối:
Muốn người khác giúp thì hãy tập mô tả vấn đề. Người khác không hiểu thì giúp bằng niềm tin ả?
1. Lấy dữ liệu nguồn vào Summary. Từ mỗi sheet nguồn lấy hết các dòng, không có điều kiên gì? Đừng bắt người khác phải dò, kiểm tra kỹ để hiểu ý của mình một khi mình có thể mô tả bằng một câu.
2. Cách ghi vào Summary.
- Khi tổng hợp thì trước tiên xóa kết quả cũ của lần tổng hợp cũ, và dữ liệu của những sheet nguồn ghi ở những dòng liên tiếp?
- Khi tổng hợp thì không xóa kết quả cũ của lần tổng hợp trước, và dữ liệu của những sheet nguồn ghi ở những dòng liên tiếp, sau kết quả cũ của lần tổng hợp trước?

Vân vân và mây mây.

Tôi có thể đoán được ý của bạn. Nhưng ở đây tôi nói về nguyên tắc. Hãy mô tả và đừng bắt người khác phải đoán.

Những bài kiểu tổng hợp dữ liệu thì nên có cấu trúc y như nhau và vị trí y như nhau. Không thể trong Ngoan, Dung, Huyen tiêu đề ở dòng 1 nhưng trong Nga lại ở dòng 2. Tùy tiện thì chỉ làm khó mình.

Tạm thời dùng code của bạn, tôi sửa phần xóa dữ liệu cũ.

Mở tập tin -> phải chuột trên tên Summary trên sheet tabs ở dưới cùng -> View code -> dán code sau
Mã:
Private Sub Worksheet_Activate()
  Dim Sh As Worksheet
  Application.ScreenUpdating = False
  Range("A2").Resize(500000, 500).ClearContents
  For Each Sh In Worksheets
    If Sh.Name <> "Summart" Then
       Sh.Range("A2").CurrentRegion.Offset(1).Copy
       Range("A65536").End(xlUp).Offset(1).PasteSpecial 3
    End If
  Next Sh
  Application.CutCopyMode = False
End Sub

-> xóa Module1.

Code phải đặt trong module của sheet Summary. Không thể đặt trong Module1 được.
Code của bác ok không vấn đề gì, ý em là nếu chỉ tổng hợp đơn thuần các sheet vào 1 sheet thì em có thể copy code và sửa được mỗi lần copy xoá hết dữ liệu cũ, điều này thì bác nói đúng em chưa giải thích rõ, code cũ của em có vấn đề vì nếu 1 trong các sheet có dòng trống thì copy sẽ bị sai và thứ tự bị đảo loạn hết.
Nhưng vấn đề của em không dừng lại ở đó em cũng có nêu bài toán là làm thế nào để tuỳ chọn được những sheet cần tổng hợp
Ví dụ em chỉ muốn tổng hợp 2 sheet ngoan và nga thì code sẽ bỏ qua các sheet khác chỉ lấy ngoan và nga, tức là số sheet cần lấy sẽ ko cố định mà nó phụ thuộc vào nhu cầu cần lấy để bỏ qua dự liệu không cần thiết
Rất mong bác giúp đỡ
 
Code của bác ok không vấn đề gì, ý em là nếu chỉ tổng hợp đơn thuần các sheet vào 1 sheet thì em có thể copy code và sửa được mỗi lần copy xoá hết dữ liệu cũ, điều này thì bác nói đúng em chưa giải thích rõ, code cũ của em có vấn đề vì nếu 1 trong các sheet có dòng trống thì copy sẽ bị sai và thứ tự bị đảo loạn hết.
Nhưng vấn đề của em không dừng lại ở đó em cũng có nêu bài toán là làm thế nào để tuỳ chọn được những sheet cần tổng hợp
Ví dụ em chỉ muốn tổng hợp 2 sheet ngoan và nga thì code sẽ bỏ qua các sheet khác chỉ lấy ngoan và nga, tức là số sheet cần lấy sẽ ko cố định mà nó phụ thuộc vào nhu cầu cần lấy để bỏ qua dự liệu không cần thiết
Rất mong bác giúp đỡ
Đọc lại bài đầu và bài này thì thấy yêu cầu của 2 bài khác nhau. Trước đó là Summary nằm cùng hoặc nằm ở tập tin khác. Lần này chưa biết có còn yêu cầu nằm cùng hay không nhưng đẻ ra yêu cầu là không lấy hết các sheet nguồn mà là chọn.
Hãy nói cụ thể, chi tiết một lần cuối:

- Summary và các sheet nguồn nằm cùng tập tin hay ở 2 tập tin?
- Nếu là chọn sheet nguồn thì ghi chúng ở đâu? Hiện InputBox để ghi? Hay thế nào?
-
-
-
-
Vân vân.
 

Đọc lại bài đầu và bài này thì thấy yêu cầu của 2 bài khác nhau. Trước đó là Summary nằm cùng hoặc nằm ở tập tin khác. Lần này chưa biết có còn yêu cầu nằm cùng hay không nhưng đẻ ra yêu cầu là không lấy hết các sheet nguồn mà là chọn.
Hãy nói cụ thể, chi tiết một lần cuối:

- Summary và các sheet nguồn nằm cùng tập tin hay ở 2 tập tin?
- Nếu là chọn sheet nguồn thì ghi chúng ở đâu? Hiện InputBox để ghi? Hay thế nào?
-
-
-
-
Vân vân.
Để đơn giản hơn em diễn tả như sau
- sheet nguồn và sheet sum nằm khác file
- Tuỳ chọn đến các sheet nguồn thì bác fix trong code thôi ko cần inputbox để ghi, trường hợp cần thay đổi sheet thì em vào trong code sửa tên sheet hoặc thêm sheet, bác viết làm sao để khi em mở code ra là em biết chỗ cần đổi tên hoặc thêm sheet là được
Em ko am hiểu về code nên diễn tả có phần không rõ ràng mong bác thông cảm
 
Em ko am hiểu về code nên diễn tả có phần không rõ ràng mong bác thông cảm
Thì ở bài này bạn vẫn "không am hiểu về code" nhưng bạn vẫn diễn tả được đấy sao?

1. Sub tonghop trong Module1

2. Tiêu đề trong các sheet phải y như nhau kể cả theo thứ tự. Và phải ở dòng 1 bắt đầu từ cột A.

3. tập tin nguồn có tên là nguon_tonghop.xlsb. Nếu tên khác thì sửa dòng
Mã:
Const nguon As String = "nguon_tonghop.xlsb"
cho thích hợp. Tập tin nguồn và tập tin Summary phải cùng một thư mục.

4. Các sheet cần sao chép được liệt kê ở dòng
Mã:
sheetnames = Array("ngoan", "nga")
Thêm hoặc xóa tùy ý.

5. Trước khi chạy code tập tin nguồn có thể đang mở hoặc không. Nếu chưa mở thì code sẽ mở tập tin nguồn và sau khi sao chép sẽ đóng nó.
 

File đính kèm

Thì ở bài này bạn vẫn "không am hiểu về code" nhưng bạn vẫn diễn tả được đấy sao?

1. Sub tonghop trong Module1

2. Tiêu đề trong các sheet phải y như nhau kể cả theo thứ tự. Và phải ở dòng 1 bắt đầu từ cột A.

3. tập tin nguồn có tên là nguon_tonghop.xlsb. Nếu tên khác thì sửa dòng
Mã:
Const nguon As String = "nguon_tonghop.xlsb"
cho thích hợp. Tập tin nguồn và tập tin Summary phải cùng một thư mục.

4. Các sheet cần sao chép được liệt kê ở dòng
Mã:
sheetnames = Array("ngoan", "nga")
Thêm hoặc xóa tùy ý.

5. Trước khi chạy code tập tin nguồn có thể đang mở hoặc không. Nếu chưa mở thì code sẽ mở tập tin nguồn và sau khi sao chép sẽ đóng nó.
cám ơn bác rất nhiều, code đã chạy bình thường, nhưng đến khi một trong các sheet nguồn bị filter thì số dòng bị filter sẽ không được lấy sang sheet summary, bác có cách nào xử lý giúp em
em đã thử sử dụng thêm 1 số dòng code nhưng bị báo lỗi không chạy được

Sheets("Nga").Rows.Hidden = False
Sheets("Nga").Columns.Hidden = False
Sheets("Nga").AutoFilterMode = False
 
cám ơn bác rất nhiều, code đã chạy bình thường, nhưng đến khi một trong các sheet nguồn bị filter thì số dòng bị filter sẽ không được lấy sang sheet summary, bác có cách nào xử lý giúp em
1.
Thay cụm
Mã:
On Error GoTo 0
lastRow = sh.Cells(Rows.Count, "C").End(xlUp).Row

bằng cụm, tức thêm dòng ở giữa

Mã:
On Error GoTo 0
sh.AutoFilterMode = False
lastRow = sh.Cells(Rows.Count, "C").End(xlUp).Row

2.
Thay
Mã:
If DoClose Then wb.Close

bằng, tức thêm TRUE

Mã:
If DoClose Then wb.Close True
 
Web KT

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

Back
Top Bottom