Lọc, paste một nội dung cho nhiều vùng trong cùng một Sheet

  • Thread starter Thread starter khoa_pr
  • Ngày gửi Ngày gửi
Liên hệ QC

khoa_pr

Thành viên hoạt động
Tham gia
16/6/09
Bài viết
141
Được thích
13
Nhờ các bạn trên diễn đàn giúp đỡ mà mình đã tách được Danh sách tổng hợp ra nhiều sheet khác nhau theo diều kiện. tuy nhiên vấn đề nảy sinh như sau mong mọi người giúp đỡ:
1- Sau khi nhấn nút Tachlop DS tong hop, DS được lọc theo các lớp qua các Sheet Lop, đánh lại STT, kẻ Border.
2- Vấn đề mới: Ở các Sheet Lop toi chia mỗi lớp ra 3 vùng : HKI (A4:J33), HKII(A40:J70),
CN(A80:A110). Địa chỉ mỗi vùng có thể lớn hơn 30 rows, nhung mỗi vùng phải cách nhau ít nhất 5 rows trống. Tôi muốn nhờ mọi người giúp đỡ : cũng với đoạn code đã viết trong file đính kèm, xin bổ sung thêm code để khi nhấn nút Tachlop nó sẽ lọc DS theo lóp và paste qua 3 vùng trên trong cùng một Sheet "Lop-..", sau mỗi vùng cũng đánh lại STT và kẻ Boder.
Tôi đã thử dùng vòng lặp For each . . .next nhưng không được.
Xin cảm ơn
 

File đính kèm

Làm cho bạn thì không khó, nhưng thấy cấu trúc bảng biểu như vậy thì bạn tự định dạng sẳn luôn đi rồi chỉ việc gán giá trị vào từng sheet thôi.
 
Upvote 0
Cho hỏi thêm, 1 lớp Max có bao nhiêu người?

Có 2 cách:

Hoặc là theo sĩ số lớp, có bao nhiêu người thì dùng bấy nhiêu hàng, sau đó cách 6 hàng rồi chuyển tiếp học kỳ 2,rồi lại cách thêm 1 hàng cho cả năm

Hoặc định dạng sẳn cố định là 36 người (làm thừa ra tí 40 người đi), căn cứ vào số đầu tiên rồi chuyển vào từng sheet thôi.

Chờ bạn cho ý kiến!
 
Lần chỉnh sửa cuối:
Upvote 0
Không quan tâm một lớp có bao nhiêu học sinh
3 vùng cách nhau một số hàng cố định (muốn nhiều hơn hay ít đi thì chỉnh trong code
Bạn chép em này thay cho em kia
Mã:
Public Sub TachTach()
    Dim Vung, Ws 'Dinh nghia bien
    Application.ScreenUpdating = False
        Set Vung = Sheets("DS tong hop").Range(Sheets("DS tong hop").[a3], Sheets("DS tong hop").[a1000].End(xlUp)) 'Vung chuan "DS tong hop" la A3:A1000
        Sheets("DS tong hop").Columns("D:F").EntireColumn.Hidden = True 'An cac cot D:F truoc khi loc
            For Each Ws In Worksheets       'Vong lap qua cac sheet
                If Ws.Name <> "DS tong hop" Then    'Neu ten cac sheet khong phai la DS tong hop thi
                Ws.[a4:j1000].Clear
                    Ws.[f1].ClearContents  'Xoa vung A4:J1000 tren cac sheet khac DS tong hop va xoa noi dung cell F1
                        If Ws.[d1] <> vbNullString Then         'Neu cell D1 tren cac sheet khong rong thi
                            With Vung.Resize(, 6)               'voi tu vung chuan (A3:A1000)dich chuyen qua den cot 6
                                .AutoFilter 6, Ws.[d1]          'AutoFilter cot 6, dua tren noi dung cell D1 tren cac sheet Lop
                                .Offset(1).SpecialCells(12).Copy Ws.[a4]    'Copy nhung gi hien ra sau khi loc va paste qua cot 1 (A) tu dong 4
                                .AutoFilter                     ' lap lai AutoFiler
                            End With
                                Ws.Range(Ws.[a4], Ws.[a100].End(xlUp)) = [row(A:A)] 'Danh lai STT cot A tu A4
                                Ws.Range(Ws.[a4], Ws.[a100].End(xlUp)).Resize(, 10).Borders.Weight = xlThin 'Ke Border tu A4 sang den cot 10 (J)
                                Ws.[f1] = Ws.[a100].End(xlUp).Row - 3       'Cell si so (F1) = A1:nguoi cuoi cung - 3 dong tu A1:A3
                                With Ws.Range(Ws.[a4], Ws.[a100].End(xlUp)).Resize(, 10)
                                    .Copy Ws.[a1000].End(xlUp)(8)
                                    .Copy Ws.[a1000].End(xlUp)(8)
                                End With
                        End If
                End If
            Next Ws
        Sheets("DS tong hop").Cells.EntireColumn.Hidden = False         ' Bo an cac cot D:F
    Application.ScreenUpdating = True
End Sub
Thân
 
Upvote 0
chào minhthien321 và concogia
- Sĩ số học sinh không bao giờ cố định được nhưng nó dao động trong khoản từ 35 - 55 học sinh trên một lớp, mỗi lớp phải hai trang giấy. Do đó HKI phải đủ 2 trang, HKII và Cả năm cũng phải đủ hai trang, tức là HKI bắt đầu từ trang số 1, HKII bắt đầu trang 3, Cả năm bắt đầu trang 5 và kết thúc ở trang 6.
- Xin chân thành cám on bạn concogia đã luôn nhiệt tình giúp đỡ. Như đã trình bày ở trên thì code của bạn lần này nó không cố định mà hể Sỉ số HS ít thì vùng HKII và Cả năm nó cũng dồn về vùng HKI, nhưng mình muốn code hơi thông minh khi in ra trên giấy A4 (lề Top=Bottm=Left=Right=0.25), dù sĩ số ít nhưng luôn cố định vùng: HKI luôn từ trang 1 đến trang 2 (A4:J91), HKII luôn từ trang 3 đến trang 4(A92:J183):, Cả năm trang 5-6(A184:J275). Minh đang thiết kế: Tạo 1 CombBox để khi chon HKI thì ẩn vùng HKII và Cả năm, chọn HKII thì Ẩn HKI và Ca năm, khi chọn Cả năm thì ẩn HKI và HKII.
Mong dược các bạn giúp hoàn thiện code của concogia. Minh gởi lại File

Sao chả ai giúp mình tiếp tục hoàn thành code hết vậy, chả lẽ các Cao thủ đi quy ẩn hết rồi sao ?
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Sao chả ai giúp mình tiếp tục hoàn thành code hết vậy, chả lẽ các Cao thủ đi quy ẩn hết rồi sao ?
Này bạn ơi sao lại nói vậy.Đây mình làm cho bạn rồi đây xem thử có được không? Chúc bạn thành công nhé!
 

File đính kèm

Upvote 0
Chân thanh cam on ban phan ngoc lan. Code ban viết đúng với ý đồ của mình, tuy nhiên hơi khó hiểu, mình sẽ nghiên cứu và trao đổi sau.
 
Upvote 0
mỗi lớp phải hai trang giấy. Do đó HKI phải đủ 2 trang, HKII và Cả năm cũng phải đủ hai trang, tức là HKI bắt đầu từ trang số 1, HKII bắt đầu trang 3, Cả năm bắt đầu trang 5 và kết thúc ở trang 6.
khi in ra trên giấy A4 (lề Top=Bottm=Left=Right=0.25), HKI luôn từ trang 1 đến trang 2 (A4:J91), HKII luôn từ trang 3 đến trang 4(A92:J183):, Cả năm trang 5-6(A184:J275)...

Làm tạm đến đây đã (...ngày mai bác ngủ bù).
Mã:
Sub TachLop()
    Application.ScreenUpdating = False
    On Error Resume Next
    For Each Sh In Worksheets
        If Sh.Name <> "DS tong hop" Then
           Sh.[b4].Resize(45, 10).Clear
           Sh.[b89].Resize(45, 10).Clear
           Sh.[b180].Resize(45, 10).Clear
        End If
    Next
    
    With Sheets("DS tong hop")
        .[h:h].Clear
        For Each Lop In Range(.[g3], .[g65000].End(3))
            If Lop(2) <> Lop Then Lop(2, 2) = "x"
        Next
        For Each Ds In Range(.[h4], .[h65000].End(3))
            If Ds > 0 And Ds.End(4).Row < 65000 Then
                .Range(Ds, Ds.End(4)(0)).Offset(, -6).Resize(, 5).Copy Sheets("Lop-" & Ds(1, 0)).[b4]
            End If
        Next
        .[h:h].Clear
    End With
    For Each Sh In Worksheets
        If Sh.Name <> "DS tong hop" Then
           With Range(Sh.[b4], Sh.[b4].End(4)).Resize(, 10)
                .Borders.LineStyle = 1
                .Copy Sh.[b89]
                .Copy Sh.[b180]
           End With
        End If
    Next
End Sub
 

File đính kèm

Upvote 0
Chào Trungchinhs
Thật tuyệt vời vì code của bạn trungchinhs dễ hiểu hơn khi dùng cấu trúc For Each . . .Next và thuộc tính Resize. Tuy nhiên có thắc mmắc sau mong các bạn giải thích tí xíu:
1- chổ kẻ Border, vì người thì dùng thế này, người thì dung thế khác, đại khái như sau :
Bạn Trungchinhs dùng .Border.LineStyle=1 nghĩa là sao?
Bạn concogia dùng .Borders.Weight = xlThin nghĩa là sao?
có người dùng .Border.LineStyle=xlcontinou . . .
2- Tại sao bạn không để cột STT là cột A mà đưa qua cột B. Điều này có ý nghĩa gì?
3- Sheet "DS tong hop" cột H đâu có dữ liệu tại sao code cua bạn lại có [h:h].Clear nghĩa là sao. . .
Nếu được bạn có thể ghi thêm chú thích vào các đoạn code được không
Mong bạn giải thích giúp. Cám ơn nhiều
 
Lần chỉnh sửa cuối:
Upvote 0
Sao không ai giúp mình trả lời một số thắc mắc hết vậy, thật buồn quá?
 
Upvote 0
Chào Trungchinhs
Thật tuyệt vời vì code của bạn trungchinhs dễ hiểu hơn khi dùng cấu trúc For Each . . .Next và thuộc tính Resize. Tuy nhiên có thắc mmắc sau mong các bạn giải thích tí xíu:
1- chổ kẻ Border, vì người thì dùng thế này, người thì dung thế khác, đại khái như sau :
Bạn Trungchinhs dùng .Border.LineStyle=1 nghĩa là sao?
Bạn concogia dùng .Borders.Weight = xlThin nghĩa là sao?
có người dùng .Border.LineStyle=xlcontinou . . .
2- Tại sao bạn không để cột STT là cột A mà đưa qua cột B. Điều này có ý nghĩa gì?
3- Sheet "DS tong hop" cột H đâu có dữ liệu tại sao code cua bạn lại có [h:h].Clear nghĩa là sao. . .
Nếu được bạn có thể ghi thêm chú thích vào các đoạn code được không
Mong bạn giải thích giúp. Cám ơn nhiều
Mình thấy code mình viết bạn ghi chú được hết mà, sao kỳ "zị" ???
Câu 1:theo mình, bạn nên dùng chức năng ghi Macro, bạn đóng khung đại một vùng nào đó, mở code ra xem nó ghi cái gì, cho code chạy "cà tưng" từng bước (nhấn F8 ) có thể sẽ hiểu ngay thôi
Câu 2: tại sao không để cột Số thứ tự ở cột A mà đem qua cột B thì chỉ có bạn TrungChinh và .......Trời mới biết tại sao, cái bảng dữ liệu của bạn, bạn muốn thiết kế thế nào là tùy ý bạn mà. Híc
Câu 3: trong quá trình chạy code thì cột H có chứa dữ liệu đấy bạn ạ (những ký tự "x"), đúng là có dư một đoạn này :".[h:h].Clear", chắc để an toàn thôi đó mà.
Thân
 
Lần chỉnh sửa cuối:
Upvote 0
Chào concogia
Code bạn viết tương đối dễ hiểu bạn ạ, vì nó sử dụng AutoFilter, mình muốn bạn giúp theo cách viết của bạn, tuy nhien khi số lượng Hs tăng lên thì copy xuống vùng HKII va CN sẽ bị thay đổi địa chỉ, nhưng mình muốn nó cố định theo từng vùng cơ.
 
Upvote 0
Chào Trungchinhs
Thật tuyệt vời vì code của bạn trungchinhs dễ hiểu hơn khi dùng cấu trúc For Each . . .Next và thuộc tính Resize. Tuy nhiên có thắc mmắc sau mong các bạn giải thích tí xíu:
1- chổ kẻ Border, vì người thì dùng thế này, người thì dung thế khác, đại khái như sau :
Bạn Trungchinhs dùng .Border.LineStyle=1 nghĩa là sao?
Bạn concogia dùng .Borders.Weight = xlThin nghĩa là sao?
có người dùng .Border.LineStyle=xlcontinou . . .
2- Tại sao bạn không để cột STT là cột A mà đưa qua cột B. Điều này có ý nghĩa gì?
3- Sheet "DS tong hop" cột H đâu có dữ liệu tại sao code cua bạn lại có [h:h].Clear nghĩa là sao. . .
Nếu được bạn có thể ghi thêm chú thích vào các đoạn code được không
Mong bạn giải thích giúp. Cám ơn nhiều

1- .Border.LineStyle=1 có nghĩa là đường kẻ kiểu 1 (đường kẻ nét mảnh liền). Đường kẻ có 13 kiểu trong đó kiểu 0 là không có đường kẻ. Để biết các kiểu đường kẻ khác bạn xem file đính kèm.
Mã:
Sub Macro1()
On Error Resume Next
    [c:d].Clear
    For Each cls In Range([b1], [b65000].End(3)).SpecialCells(2)
        cls(1, 2).Resize(2, 2).Borders.LineStyle = cls
    Next
End Sub

.Borders.Weight = xlThin tạm hiểu là đường kẻ nét mảnh (khác với nét đậm)
.Border.LineStyle=xlcontinou
tạm hiểu là đường kẻ nét liền (khác với nét đứt)

Trong trường hợp ta kẻ bảng với nét đơn liền thì 3 câu lệnh này là như nhau. Còn tại sao tôi viết .Border.LineStyle=1 bởi 2 lý do sau: một là tôi không biết tiếng Anh và gõ rất chậm nên nhập số 1 cho nó nhanh; hai là khi muốn xóa đường kẻ tôi chỉ copy câu lệnh trên và đổi số 1 thành số 0 là OK.

2- Tại sao không để STT tại cột A: bởi vì tôi thấy nó bất tiện khi muốn dùng thêm cột phụ trước cột STT và đặc biệt là không nhìn được đường kẻ bên trái bảng, nhiều khi in ra mới thấy lỗi thì đã mất khá nhiều giấy mực và tốn thời gian để in lại vì vậy tôi khuyên các bạn hãy tạo thói quen tốt là không bao giờ nhập dữ liệu vào cột A và dòng 1.

3- Trong bài trên Tôi sử dụng cột H làm cột phụ để đánh dấu vị trí chia lớp bằng chữ "x" vì vậy trước khi chạy code phải xóa sạch cột H để đánh dấu lại theo dữ liệu và sau khi làm việc xong thì dọn dẹp những gì ta bày ra để cho bảng tính sạch sẽ như ban đầu.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Chào Trungchinhs
code cua bạn mình vẫn chua hieu hết nên không thể nào áp dụng được, mong ban giai thích giúp
With Sheets("DS tong hop")
.[h:h].Clear
For Each Lop In Range(.[g3], .[g65000].End(3)) 'Lop chua dinh nghia hay chi can nam trong vong lap la ko can dinh nghia
If Lop(2) <> Lop Then Lop(2, 2) = "x" 'Lop(2) va Lop(2,2) nghia la sao? noi ro hon la sheet nao:DS tong hop hay Lop-61, 62,...
Next
For Each Ds In Range(.[h4], .[h65000].End(3)) 'Ds la bien cua Sheet nao
If Ds > 0 And Ds.End(4).Row < 65000 Then
.Range(Ds, Ds.End(4)(0)).Offset(, -6).Resize(, 5).Copy Sheets("Lop-" & Ds(1, 0)).[b4] '(Ds(1,0)).[b4] minh khong hieu cho nay
End If
Next
.[h:h].Clear
End With
For Each Sh In Worksheets
If Sh.Name <> "DS tong hop" Then
With Range(Sh.[b4], Sh.[b4].End(4)).Resize(, 10)
.Borders.LineStyle = 1
.Copy Sh.[b89]
.Copy Sh.[b180]
End With
End If 'Ket thuc no van khong danh lai STT ma chi copy qua thoi
Dốt thì hỏi, mong bạn giai thích giúp. Cám ơn bạn nhiều.
 
Upvote 0
Chào Trungchinhs
code cua bạn mình vẫn chua hieu hết nên không thể nào áp dụng được, mong ban giai thích giúp
With Sheets("DS tong hop")
.[h:h].Clear
For Each Lop In Range(.[g3], .[g65000].End(3)) 'Lop chua dinh nghia hay chi can nam trong vong lap la ko can dinh nghia
If Lop(2) <> Lop Then Lop(2, 2) = "x" 'Lop(2) va Lop(2,2) nghia la sao? noi ro hon la sheet nao:DS tong hop hay Lop-61, 62,...
Next
For Each Ds In Range(.[h4], .[h65000].End(3)) 'Ds la bien cua Sheet nao
If Ds > 0 And Ds.End(4).Row < 65000 Then
.Range(Ds, Ds.End(4)(0)).Offset(, -6).Resize(, 5).Copy Sheets("Lop-" & Ds(1, 0)).[b4] '(Ds(1,0)).[b4] minh khong hieu cho nay
End If
Next
.[h:h].Clear
End With
For Each Sh In Worksheets
If Sh.Name <> "DS tong hop" Then
With Range(Sh.[b4], Sh.[b4].End(4)).Resize(, 10)
.Borders.LineStyle = 1
.Copy Sh.[b89]
.Copy Sh.[b180]
End With
End If 'Ket thuc no van khong danh lai STT ma chi copy qua thoi
Dốt thì hỏi, mong bạn giai thích giúp. Cám ơn bạn nhiều.

Do trước đây tôi không xem tiếp bài này nên không biết bạn có bài hỏi. Hôm nay vô tình xem lại mới thấy nên bạn thông cảm nha !
Các câu hỏi của bạn có 5 ý sau:

1- Về khai báo biến LopDs là do tôi thấy không khai báo mà máy vẫn hiểu nên lười không khai báo (điều này có thể là không tốt, bạn không nên bắt trước).

2- Biến LopDs chính là Cells, tôi viết vậy là để phân biệt vòng lặp này quét tìm Lớp, vòng lặp kia quét tìm Danh sách (thông thường mọi người hay viết biến của Cells là Cls hoặc Clls)

3- Lop(2) nghĩa là Cells(2) ví dụ: tại 2 dòng nào đó bạn ghi Lop-61 và Lop-62 thì khi quét đến Cells có giá trị Lop-61 thì Cells đó gọi là Cells(1) còn Cells tiếp theo có giá trị Lop-62 gọi là Cells(2). Cách viết khác của Cells(2) là Cells.Offset(1) và Cells(2,2) là Cells.Offset(1,1).

4- Biến LopDs đều nằmtrong Sheets("DS tong hop"). Ví dụ trong câu lệnh For Each Lop In Range(.[g3], .[g65000].End(3)) thì dấu chấm nằm trước dấu ngoặc vuông chính là câu lệnh With Sheets("DS tong hop") đã viết ở trên.

5- Trong Code không có câu lệnh đánh lại số thứ tự mà chỉ Copy thôi.
 
Upvote 0
Web KT

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

Back
Top Bottom