Hihi! Giáng sinh chẳng ai cho đi chơi.. tớ giả lời hộ Cường vậy ..Đào Việt Cường nói:Dear Adam_Tran,
----------------
Bác cho em hỏi, trong VBA làm thế nào để biết được dấu ngắt trang của excel nhỉ? Nếu có dấu hiệu này thì ta có thể điều khiển được điểm cuối cùng một trang đấy bác nhỉ, chẳng hạn như là tính tổng cuối trang chẳng hạn!
Cái ông Excel nhiều khi cũng làm chúng ta ốm, cụ thể là trong trường hợp với các dấu ngắt trang.
+ Nếu bạn ở chế độ view normal - chắc đếm số dấu ngắt trang sẽ chẳng bao giờ chính xác cả.
+ Nếu bạn chưa đặt PrintArea, bạn cũng chẳng đếm được dấu ngắt trang.
Nguyên nhân thì có lẽ phải hỏi ông Microsoft - chắc là trong một số bài tiếp tớ sẽ giải thích về cơ chế hiển thị print preview trong excel.
Quay lại vấn đề của Cường. Để đặt được dấu ngắt trang chính xác, ta cần phải nói rõ cho Excel vùng in là khoảng nào, như thế thì không cần bật sang chế độ Print Preview, Excel cũng tự động xếp trang chính xác cho ta được.
Tuy nhiên kể cũng có lắm rắc rối khi thực hiện điều này:
[Cường có 5 trang, có các dòng có độ cao khác nhau, 4 trang đầu khi in ở chế độ preview thì đầy trang còn trang sau lửng lơ nửa chừng xuân. Excel sẽ đặt dấu ngắt trang ở cuối vùng in (và nó nằm ở đó đấy ạ). Dấu ngắt này sẽ không giãn xuống cuối trang đâu, vì thế nếu muốn in dòng chữ cám ơn nào đó vào cuối trang, bạn phải giãn vùng in đến sát cuối trang rồi mới thêm chữ ...]
Với cách đặt vấn đề này, tớ đề xuất một cách củ chuối như sau:
1. Thiết lập vùng in với vùng dữ liệu hiện thời (UsedRange). Ghi lại số dấu ngắt trang hiện thời.
2. Giãn vùng in 20 dòng một lần, sau mỗi lần giãn, đếm số Hpagebreak (dấu ngắt trang ngang)
3. Khi số dấu ngắt trang mới lớn hơn số dấu ngắt trang cũ thì dừng lại và sử dụng dấu ngắt trang ngay sau dấu ngắt trang cũ làm mốc (Vì có thể ta thêm 20 dòng làm phát sinh 2 trang mới thì sao... hihi.
4. Co vùng in về đúng sát vị trí của dấu ngắt trang mới liền kề dấu cũ này.
5. Đưa đoạn text chào mừng vào ô ngay trên ô dính với dấu ngắt trang cuối cùng. Thuộc tính location của dấu ngắt trang trả về đối tượng Cell ngay dưới nó mà.
Và kết thúc.
Sau đây là thủ tục
Sub test()
' Cái này chạy hơi chậm tẹo
Dim OldPageCount As Long
Dim NewPageCount As Long
Dim tSheet As Worksheet, LastPage As HPageBreak
' Tắt chế độ làm tươi màn hình - quan trọng lắm đấy không thì bạn có thể làm màn hình nhảy disco liên tục và căn bản là nó sẽ chậm đáng kể - thủ tục đã chạy chậm nay còn chạy chậm hơn
Application.ScreenUpdating = False
' Đưa chế độ view về chế độ PageBreak
ActiveWindow.View = xlPageBreakPreview
' Ví dụ trang tính của ta có tên là php chẳng hạn
Set tSheet = Worksheets("php")
' Nào gán vùng in vào vùng tính toán
tSheet.PageSetup.PrintArea = IncrementPrintArea(tSheet.UsedRange.Address)
' Đếm số dấu ngắt trang hiện thời
OldPageCount = tSheet.HPageBreaks.Count
While tSheet.HPageBreaks.Count = OldPageCount
' Giãn vùng in để tìm dấu ngắt trang mới
tSheet.PageSetup.PrintArea = IncrementPrintArea(tSheet.PageSetup.PrintArea)
Wend
Set LastPage = tSheet.HPageBreaks(tSheet.HPageBreaks.Count)
' Gán giá trị của ô cuối cùng/ trang cuối cùng
LastPage.Location.Offset(-1).Value = "Hi there!"
' Và co vùng in về đến ô này thôi
tSheet.PageSetup.PrintArea = tSheet.UsedRange.Address
Set tSheet = Nothing
' Đưa excel về trạng thái bình thường như không có gì xảy ra... hih
ActiveWindow.View = xlNormalView
Application.ScreenUpdating = True
End Sub
Private Function IncrementPrintArea(LastArea As String, Optional numRow As Long = 20) As String
Hàm này thực hiện việc tăng vùng in lên bằng vùng in cũ + 20 dòng mới
Dim i As Long
For i = Len(LastArea) To 1 Step -1
If Mid(LastArea, i, 1) = "$" Then
IncrementPrintArea = Left(LastArea, i) & Val(Mid(LastArea, i + 1)) + numRow
Exit For
End If
Next
End Function
Để thử nghiệm, bạn đặt một nút bấm vào trang tính nhé, gắn cho nó macro là Test và thử xem nào ... hihi
Chúc các bạn Giáng sinh thật vui và yêu đời - đi chơi nhớ về sớm nhé - 2 giờ thì về - đừng đi khuya quá ba mẹ rầy la.