Cần giúp đỡ: In file excel

Shang8998

Yêu THVBA
Mình đang có đoạn code sau để in hồ sơ ra PDF, nhưng khi in thì bị tách rời ra từng file nhỏ. Nhờ mọi người giúp đỡ mình gộp các lệnh in thành 1 file PDF được ko? Thanks alot!
Mã:
Sub INHOSO()
Dim i As Long, m As Long, n As Long
m = Sheets("PL").Range("M5").Value
n = Sheets("PL").Range("M6").Value
For i = m To n
If i = m Then
Sheets("PL").Range("M3").Value = i
Sheets("BIALO").PrintOut
Sheets("PL").PrintOut
Sheets("PYC").PrintOut , from:=1, to:=1
Sheets("BBNT").PrintOut , from:=1, to:=4
Sheets("KLDAO").PrintOut , from:=1, to:=1
Sheets("PYC").PrintOut , from:=2, to:=2
Sheets("BBNT").PrintOut , from:=5, to:=6
Sheets("PYC").PrintOut , from:=3, to:=3
Sheets("BBNT").PrintOut , from:=7, to:=8
Sheets("PYC").PrintOut , from:=4, to:=4
Sheets("BBNT").PrintOut , from:=9, to:=10
Sheets("LMVUA").PrintOut
Sheets("PYC").PrintOut , from:=5, to:=5
Sheets("KLTHEP").PrintOut , from:=1, to:=1
Sheets("BTTC").PrintOut , from:=1, to:=3
Sheets("LMBTTC").PrintOut
Sheets("PYC").PrintOut , from:=6, to:=6
Sheets("BBNT").PrintOut , from:=15, to:=16
Sheets("KLBTTC").PrintOut , from:=1, to:=1
Sheets("PYC").PrintOut , from:=7, to:=7
Sheets("BBNT").PrintOut , from:=17, to:=18
Sheets("KLDAP").PrintOut , from:=1, to:=1
Sheets("PYC").PrintOut , from:=8, to:=8
Sheets("BBNT").PrintOut , from:=19, to:=20
Sheets("PYC").PrintOut , from:=9, to:=9
Sheets("BBNT").PrintOut , from:=21, to:=22
Sheets("PYC").PrintOut , from:=10, to:=10
Sheets("BBNT").PrintOut , from:=23, to:=24
Sheets("PYC").PrintOut , from:=11, to:=11
Sheets("BBNT").PrintOut , from:=25, to:=26
Sheets("BTLE").PrintOut , from:=1, to:=3
Sheets("LMLE").PrintOut
Sheets("PYC").PrintOut , from:=12, to:=12
Sheets("BBNT").PrintOut , from:=27, to:=28
Sheets("PYC").PrintOut , from:=13, to:=13
Sheets("BBNT").PrintOut , from:=29, to:=30
 

tuhocvba

Administrator
Thành viên BQT
Nên cung cấp file demo, đưa lên google driver (chế độ public) rồi dẫn link trỏ về đây bạn ơi.
 

PTHhn

Yêu THVBA như điếu đổ
Sao phải phức tạp như vậy nhỉ. Trên excel có chức năng in ra cả file rồi mà bạn.
Bạn cần đăng nhập để thấy hình ảnh
 

Shang8998

Yêu THVBA
Không phải đâu bạn. đây mình in sắp xếp các trang của các sheet theo thứ tự bạn ạ! chứ in một phát như thế thì không phải bàn nữa rồi!
 

PTHhn

Yêu THVBA như điếu đổ
Suy nghĩ đơn giản thôi bạn. Copy ra file mới các sheet mà bạn muốn in, thứ tự các sheet cần copy cũng y như thế. Rồi in cả file đó ra là được mà.
 
Shang8998
Bạn tạo ra 1 sheet mới. lấy hết các tên sheet muốn in vào 1 cột. Cột tiếp theo điền số Form cột tiếp điền To
Dùng vòng lặp muốn làm gì thì làm
Như vậy có lẽ code sẽ ngắn gọn hơn
 

PTHhn

Yêu THVBA như điếu đổ
Nếu cấu trúc sheet mà khác nhau thì đưa vào một sheet là không khả thi.
 
B

bvtvba

Guest
Copy vô file mới các sheet cần . In ra 1 file pdf đó bác .
 

tuhocvba

Administrator
Thành viên BQT
Cách nghĩ và thuật toán:
Tôi giả thiết file của bạn có nhiều sheet.
Trong đó cần in các sheet theo thứ tự chỉ định.
Bạn cần đăng nhập để thấy đính kèm


Thông thường Excel cho phép in nhiều sheet cho vào 1 file pdf. Tuy nhiên thứ tự in sẽ từ trái qua phải.
Trong hình trên, nếu như ta giữ phím Ctr và select vào sheet2, sheet4, sheet5 thì khi in ra 1 file pdf thứ tự hiển thị nội dung sẽ là sheet 2 ở đầu trang pdf, sau đó đến sheet 4, và cuối cùng là sheet 5.

Giả sử chúng ta muốn nội dung sheet2 sau đó tới sheet5, rồi tới sheet4 thì chắc chắn bạn sẽ phải di chuyển các sheet theo thứ tự này (từ trái qua phải).

Code:
Đầu tiên bạn tạo một sheet có tên là THVBA.
Bạn cần đăng nhập để thấy đính kèm

Nội dung sheet THVBA như sau:
Bạn cần đăng nhập để thấy đính kèm


Ở đây tôi liệt kê tên các sheet cần in ra 1 file pdf theo thứ tự từ trên xuống dưới. Chú ý tên sheet phải ghi thật chính xác.
Bạn chạy thủ tục Main_Print:
Mã:
Sub Main_Print()
    Dim arr
    Dim rend    As Long, i As Long
    With ThisWorkbook.Sheets("THVBA")
        rend = .Cells(.Rows.Count, 1).End(xlUp).Row
        If rend < 2 Then Exit Sub
        ReDim arr(1 To rend - 1)
        For i = 1 To rend - 1
            arr(i) = .Cells(i + 1, 1) 'Nap gia tri ten cac sheet can in
        Next i
    End With

    Call dichuyensheet(arr)
    Worksheets(arr).PrintOut Preview:=True
   
End Sub
Sub dichuyensheet(ByVal arr As Variant)
    Dim i As Long, j As Long
    If UBound(arr) - LBound(arr) + 1 = 1 Then Exit Sub
    j = LBound(arr)
    For i = j + 1 To UBound(arr, 1) Step 1
        Call Sheets(CStr(arr(i))).Move(after:=Sheets(CStr(arr(j))))
        j = j + 1
    Next i
End Sub
Kết quả: file pdf của tôi có 3 trang, trong đó nội dung sheet 5 nằm ở trang 2, hoàn toàn đúng ý đồ:
Bạn cần đăng nhập để thấy đính kèm

Sau khi chạy code thì vị trí các sheet trên file có sự thay đổi:
Bạn cần đăng nhập để thấy đính kèm


Nếu điều này gây bất tiện, thì theo ý tưởng các bạn ở trên đã nêu, chúng ta nên code tạo ra file mới là bản copy của file cũ, chỉ chứa các sheet cần in và di chuyển các sheet theo đúng thứ tự mà chúng ta muốn in. Tôi dừng ở đây, dù sao code trên cũng đã đáp ứng yêu cầu của bạn.

Ngoài ra việc liệt kê tên sheet cần chính xác, nên tôi tặng bạn thêm thủ tục này, nó sẽ ghi tên toàn bộ các sheet có trong file ra sheet THVBA.
Mã:
Sub ghitensheet()
    Dim i As Long, cnt As Long
    With ThisWorkbook.Sheets("THVBA")
        rend = .Cells(.Rows.Count, 1).End(xlUp).Row
        If rend > 1 Then
            .Range("A2:A" & rend).ClearContents
        End If
       
    cnt = 2
    For i = 1 To ThisWorkbook.Sheets.Count
        If Sheets(i).Name <> "THVBA" Then
            .Cells(cnt, 1).Value = Sheets(i).Name
            cnt = cnt + 1
        End If
    Next i
   
    End With
End Sub
Bạn chú ý: Không nên để sheet ẩn khi thực hiện lệnh in.
 
Top