Nhờ các Anh Chị tạo giúp cách in các sheet theo danh mục tự tạo

Liên hệ QC

huyxc

Thành viên mới
Tham gia
1/11/09
Bài viết
20
Được thích
2
Mục đích là muốn in theo sự sắp xếp các sheet nào in trước sheet nào in sau bằng danh mục in

*IN các sheet liệt kê cột B của sheet danhmuc

1. Mình tạo các sheet cần in số lượng sheet sau này sẽ nhiều chẳng hạn ( phần định dạng in từng sheet tự thủ công làm )
2. Điền tên các sheet cần in vào cột B của sheet danhmuc ( thủ công không cần can thiệp thêm )
3. Bấn nút in nhận dạng các sheet nào cần in và in theo thứ tự liệt kê cột B của sheet danhmuc
 

File đính kèm

  • in các sheet có tên trong danh mục điền tay.xls
    51 KB · Đọc: 9
Mục đích là muốn in theo sự sắp xếp các sheet nào in trước sheet nào in sau bằng danh mục in

*IN các sheet liệt kê cột B của sheet danhmuc

1. Mình tạo các sheet cần in số lượng sheet sau này sẽ nhiều chẳng hạn ( phần định dạng in từng sheet tự thủ công làm )
2. Điền tên các sheet cần in vào cột B của sheet danhmuc ( thủ công không cần can thiệp thêm )
3. Bấn nút in nhận dạng các sheet nào cần in và in theo thứ tự liệt kê cột B của sheet danhmuc
Thử code củ chuối này xem có ra kết quả đúng ý không.
 

File đính kèm

  • in các sheet có tên trong danh mục điền tay.xlsm
    30.4 KB · Đọc: 8
Thử code củ chuối này xem có ra kết quả đúng ý

Thử code củ chuối này xem có ra kết quả đúng ý không.
Trước tiên mình cảm ơn bạn đã giúp đỡ.
Cho mình hỏi thêm cho nó hoàn thiện là sao nó in nó chỉ in Sheet dammuc
Nó không in các sheet mà MsgBox Ws.Name hiện ra ạ
rất mong bạn xem lại giúp ạ

.....
Sub PrintSheet()
Dim i&, Lr&
Dim Ws As Worksheet, Sh As Worksheet
Set Sh = Sheets("danhmuc")
Lr = Sh.Cells(Rows.Count, 2).End(xlUp).Row

If Lr = 1 Then Exit Sub
For i = 2 To Lr
For Each Ws In Worksheets
If Ws.Name <> "danhmuc" And Ws.Name = Sh.Range("B" & i) Then
MsgBox Ws.Name
' no khong in khi MsgBox Ws.Name goi len

ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False
End If
Next Ws
Next i

End Sub
 
Trước tiên mình cảm ơn bạn đã giúp đỡ.
Cho mình hỏi thêm cho nó hoàn thiện là sao nó in nó chỉ in Sheet dammuc
Nó không in các sheet mà MsgBox Ws.Name hiện ra ạ
rất mong bạn xem lại giúp ạ

.....
Sub PrintSheet()
Dim i&, Lr&
Dim Ws As Worksheet, Sh As Worksheet
Set Sh = Sheets("danhmuc")
Lr = Sh.Cells(Rows.Count, 2).End(xlUp).Row

If Lr = 1 Then Exit Sub
For i = 2 To Lr
For Each Ws In Worksheets
If Ws.Name <> "danhmuc" And Ws.Name = Sh.Range("B" & i) Then
MsgBox Ws.Name
' no khong in khi MsgBox Ws.Name goi len

ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False
End If
Next Ws
Next i

End Sub
1/Bạn xóa bỏ dòng bạn đã tô đậm đi thì sẽ không hiện tên sheet lên nữa.
2/Bạn thay ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False
thành
Ws.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False.
và chạy thử. Do tôi không có các file giống bạn nên không thử được
 
*IN các sheet liệt kê cột B của sheet danhmuc
Đảm bảo phải dữ liệu có trong cột B chắc chắn phải có tên sheet
Mã:
Sub ABC()
    Dim i&, iR&
    iR = Sheets("danhmuc").Range("B" & Rows.Count).End(3).Row
    For i = 2 To iR
        Sheets(Sheets("danhmuc").Range("B" & i).Value).PrintOut
    Next
End Sub
 
Đảm bảo phải dữ liệu có trong cột B chắc chắn phải có tên sheet
...
iR theo code của bạn là biến chỉ dùng 1 lần. Nếu có thể, để nó là trị quách
For i = 2 To Sheets("danhmuc").Range("B" & Rows.Count).End(3).Row
Sheets(Sheets("danhmuc").Range("B" & i).Value).PrintOut
Next

Nhưng vì bên trong bạn dùng từng ô nhỏ nên tôi sẽ làm vầy:
With Sheets("danhmuc")
For Each cll in Sheets("danhmuc").Range("B2:B" & Sheets("danhmuc").Range("B" & Rows.Count).End(3).Row)
Sheets(cll.Value).PrintOut
End With
Con toán tính Range chỉ xảy ra 1 lần. Sau đó là con toán truy cập tửng phần tử của Range. Hiệu quả hơn.
 
iR theo code của bạn là biến chỉ dùng 1 lần. Nếu có thể, để nó là trị quách
For i = 2 To Sheets("danhmuc").Range("B" & Rows.Count).End(3).Row
Sheets(Sheets("danhmuc").Range("B" & i).Value).PrintOut
Next

Nhưng vì bên trong bạn dùng từng ô nhỏ nên tôi sẽ làm vầy:
With Sheets("danhmuc")
For Each cll in Sheets("danhmuc").Range("B2:B" & Sheets("danhmuc").Range("B" & Rows.Count).End(3).Row)
Sheets(cll.Value).PrintOut
End With
Con toán tính Range chỉ xảy ra 1 lần. Sau đó là con toán truy cập tửng phần tử của Range. Hiệu quả hơn.
Cám ơn chú. Nhiều khi cháu cứ như kiểu bị cảm giác đánh lừa ấy. Cảm nhận cứ như kiểu For each nó chậm hơn For next. Thành ra bị bập phải vấn đề chú nói ở trên
 
Cám ơn chú. Nhiều khi cháu cứ như kiểu bị cảm giác đánh lừa ấy. Cảm nhận cứ như kiểu For each nó chậm hơn For next. Thành ra bị bập phải vấn đề chú nói ở trên
Có một lần tôi đọc ở đâu đó, For Each của loại ngôn ngữ như C# thì chậm, nhưng của VBA thì nhanh.
Tìm không ra bài ấy, cho nên tôi chỉ nói vậy chứ không muốn thuyết phục ai hết.
 
Cám ơn chú. Nhiều khi cháu cứ như kiểu bị cảm giác đánh lừa ấy. Cảm nhận cứ như kiểu For each nó chậm hơn For next. Thành ra bị bập phải vấn đề chú nói ở trên
Thực ra chuyện nhanh chậm nó chỉ ở mức đáng kể khi array hoặc collection lớn, cực lớn. Cỡ có khi phải hàng trăm nghìn phần tử. Còn bình thường thì sự nhanh chậm nó chỉ ở cỡ khi trên bàn nhậu không còn đề tài nào để bàn thì người ta mới lôi ra thôi. Tuy nhiên tôi chưa thấy một tài liệu nào nói huỵch toẹt ra là For Each duyệt collection theo thứ tự nào. Kiểu như trong Windows API có rất nhiều hàm người ta biết được cách dùng là thế này thế này nhưng Microsoft không bao giờ công bố các hàm đó trong các tài liệu của mình. Đó là các undocumented functions. Tức dùng chả bao giờ thấy sai nhưng Microsoft không bao giờ đảm bảo là sẽ chịu trách nhiệm, kiểu mình tự dùng thì tự chịu hậu quả nếu sai. Với For Each không duyệt theo thứ tự mong muốn được. Trong khi đó duyệt bằng For i = ... thì có thể duyệt từ cuối về đầu.
Hồi xưa bộ nhớ chỉ vài KB, người ta dùng biến tiết kiệm từng BAI. Bây giờ RAM cực lớn, bộ vi xử lý cực nhanh mà ngồi bàn khai báo BYTE, Integer hay Long tôi lại thấy buồn cười. Viết mấy code thể loại "ngồi chơi nhiều hơn chạy" mà tính nhanh chậm cỡ phần nghìn phần triệu giây thì tôi không ham. Cái bất di bất dịch trong mọi thời đại là "đơn giản, dễ hiểu, dễ bảo trì". Cái này thì thời đại nào cũng quí.
 
1/Bạn xóa bỏ dòng bạn đã tô đậm đi thì sẽ không hiện tên sheet lên nữa.
2/Bạn thay ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False
thành
Ws.PrintOut Copies:=1, Collate:=True, IgnorePrintAreas:=False.
và chạy thử. Do tôi không có các file giống bạn nên không thử được
Cảm ơn tất cả mọi người đã giúp đỡ. mình post 2 file hoàn thiện để các bạn sau ai cần thì lấy học .
Cảm ơn
 

File đính kèm

  • in các sheet có tên trong danh mục điền tay cach 2.xlsm
    29.6 KB · Đọc: 3
  • in các sheet có tên trong danh mục điền tay cach 1.xlsm
    28.4 KB · Đọc: 4
Web KT
Back
Top Bottom