Em có 1 file Excel, trong đó sheets("DSHS") có dữ liệu ở 3 trang bảng tính:
Danh sách của em ở trang 1 và 2
Thống kê ở trang 3
Em đã chọn phần Print Titles để chọn in tiêu đề trên nhưng nó xuất hiện ở tắt cả các trang in.
Mọi người hướng dẫn em phần giới hạn các trang cho phần in có chung tiêu đề trên
VD: Ở file trên của em: Tiêu đề trên chỉ có ở trang 1 và 2; sang trang 3 thì không còn tiêu đề trên nữa.
Em có gửi file, mong mọi người hướng dẫn em với ạ. Em xin cảm ơn !
1/ Cần nắm tính chất, bản chất:
- Trên một bảng tính chỉ có thể thiết lập 1 và chỉ 1 vùng in (không thể tồn tại đồng thời 2 vùng in riêng biệt trên 1 sheet);
- Print Titles áp dụng cho cả vùng in đã được thiết lập trên bảng tính đó.
=> Vụ giới hạn ở trên yêu cầu thì Excel bó tay.
2/ Cách:
Cách 1:
- In xong trang 1 và 2 thì hủy Print Titles. Tiếp đó, chọn vùng còn lại chưa in rồi thực hiện in.
Cách 2:
- In bình thường cả 3 trang rồi vác kéo/ dao cắt xẹt khúc đầu ở tờ trang 3 đi.
1/ Cần nắm tính chất, bản chất:
- Trên một bảng tính chỉ có thể thiết lập 1 và chỉ 1 vùng in (không thể tồn tại đồng thời 2 vùng in riêng biệt trên 1 sheet);
- Print Titles áp dụng cho cả vùng in đã được thiết lập trên bảng tính đó.
=> Vụ giới hạn ở trên yêu cầu thì Excel bó tay.
2/ Cách:
Cách 1:
- In xong trang 1 và 2 thì hủy Print Titles. Tiếp đó, chọn vùng còn lại chưa in rồi thực hiện in.
Cách 2:
- In bình thường cả 3 trang rồi vác kéo/ dao cắt xẹt khúc đầu ở tờ trang 3 đi.
Xin phép các bác em quay lại chủ đề này.
Về việc tuỳ chọn in Print Titles giữa các trang trong cùng 1 sheet thì em cũng đang gặp khó khăn với vấn đề này.
1. Nếu chỉ bỏ Print Titles tại trang cuối thì là dùng mã vba, có thể xử lý được, các bước là
- Chọn hàng đặt Print Titles
- Tìm tổng số trang trong sheet 'tst'
- Set từ trang 1 đến (tst -1) là có tiêu đề và in
- Set trang 'tst' tiêu đề = "" và in (trang cuối)
Đoạn mã code đó là - nguồn
Bash:
Sub Print_Titles_with_Row_Selection()
Dim mPages As Long, I As Integer, mRange As Range
On Error Resume Next
mPages = ActiveSheet.PageSetup.Pages.Count
Set mRange = Application.InputBox("Select Title Rows to Repeat:", "Print Titles Except Last Page", , , , , , Type:=8)
If mRange Is Nothing Then Exit Sub
On Error Resume Next
If mPages > 0 Then
With ActiveSheet.PageSetup
.PrintTitleRows = mRange.AddressLocal
ActiveSheet.PrintOut from:=1, To:=mPages - 1
.PrintTitleRows = ""
ActiveSheet.PrintOut from:=mPages, To:=mPages
End With
End If
End Sub
2. Bài toán khó khăn hơn em đang gặp phải dựa vào cách tương tự trên nhưng cho tuỳ chọn một số trang trong sheet không in Print Titles.
Ví dụ có 48 trang thì chọn các trang 3,6,9,12,15,18,22,25,43 là không in Print Titles
Em có mày mò ra được đoạn mã này thì mới một số trang ngắn thì mã chạy ổn, nhưng với số lượng trang lớn thì lại bị sai.
Ví dụ file em đính kèm sau đây thì các trang không in tiêu đề mong muốn là: 3,6,9,12,15,18,22,25,42. Nhưng khi chạy lệnh thì bị sai như trang 2, 4, 5 cũng không in ra tiêu đề. Có thể là khi set tiêu đề cho toàn bộ trang thì tổng số trang là 48 và khi set tiêu đề ="" thì tổng số trang lại giảm đi.
Vậy em xin góp ý của các bác để xử lý vấn đề này ạ!
Em cảm ơn các bác!
Mã code trong file đính kèm:
Bash:
Sub In_chon_PrintTitles()
Dim mPages As Long, i As Integer, mRange As Range
Dim arrPages() As String
Dim strPages As String
Dim intPage As Integer
Dim pr As Variant
Dim sbi As Integer
On Error Resume Next
mPages = ActiveSheet.PageSetup.Pages.Count
Set mRange = Application.InputBox("Ch" & ChrW(7885) & "n hàng làm Print Title", "BuilderTV - hoangtuan.net", , , , , , Type:=8)
If mRange Is Nothing Then Exit Sub
strPages = InputBox("Các trang không in 'Print Titles'. Vd: 2,5,7...", "BuilderTV - hoangtuan.net")
If strPages = "" Then Exit Sub
arrPages = Split(strPages, ",")
pr = Application.Dialogs(xlDialogPrinterSetup).Show
If pr = False Then Exit Sub
sbi = InputBox("So ban in/ Copies:", "BuilderTV - hoangtuan.net", 1)
'If sbi = "" Then Exit Sub
'msgBox Join(arrPages, ","), vbInformation, "Thông báo"
ActiveSheet.PageSetup.PrintTitleRows = mRange.AddressLocal
On Error Resume Next
Application.ScreenUpdating = False
If mPages > 0 Then
With ActiveSheet.PageSetup
For i = 1 To mPages
If IsInArray(CStr(i), arrPages) Then
.PrintTitleRows = ""
Else
.PrintTitleRows = mRange.AddressLocal
End If
'ActiveSheet.PrintOut ActivePrinter:=pr, Copies:=CInt(sbi), from:=i, To:=i
ActiveSheet.PrintOut from:=i, To:=i
Next i
End With
End If
Application.ScreenUpdating = True
End Sub
Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1)
End Function
Với bố cục kiểu này thì theo cảm giác của tớ thì không thể in hàng loạt được.
Tớ cũng từng in cái này, nhưng phải thủ công từng hạng mục thôi, có gọi cho mấy đồng chí G8 bảo cập nhật cách in từng hạng mục đi, mà mấy đồng chí ấy bảo không làm được.
Lập trình ra cả bộ G8 mà còn tịt thì khả năng không hàng loạt được đâu.
1/ Cần nắm tính chất, bản chất:
- Trên một bảng tính chỉ có thể thiết lập 1 và chỉ 1 vùng in (không thể tồn tại đồng thời 2 vùng in riêng biệt trên 1 sheet);
- Print Titles áp dụng cho cả vùng in đã được thiết lập trên bảng tính đó.
=> Vụ giới hạn ở trên yêu cầu thì Excel bó tay.
2/ Cách:
Cách 1:
- In xong trang 1 và 2 thì hủy Print Titles. Tiếp đó, chọn vùng còn lại chưa in rồi thực hiện in.
Cách 2:
- In bình thường cả 3 trang rồi vác kéo/ dao cắt xẹt khúc đầu ở tờ trang 3 đi.
Với bố cục kiểu này thì theo cảm giác của tớ thì không thể in hàng loạt được.
Tớ cũng từng in cái này, nhưng phải thủ công từng hạng mục thôi, có gọi cho mấy đồng chí G8 bảo cập nhật cách in từng hạng mục đi, mà mấy đồng chí ấy bảo không làm được.
Lập trình ra cả bộ G8 mà còn tịt thì khả năng không hàng loạt được đâu.
Dạ vẫn dùng marco như file em gửi phía trên. Em có sửa phần convert tất cả sang ngắt trang thủ công - để cố định số trang in. Sửa tiếp phần hàm tìm 1 số xem có nằm trong chuỗi không. Em có đóng gói lại file addin bác có thể tham khảo tại đây ạ!