Chào cả nhà GPE!
Mình có 1 sheet được thiết lập cùng in PrintArea = "$A$1:$H$46" và vùng này có thể thay đổi khi chèn thêm dòng nằm giữa 8 và 46.
Mình muốn khi in thì cố định chiều cao của các dòng từ 1 đến 7.
Các dòng từ 8 đến cuối bảng tính (như ví dụ này là 46) thì tự động thay đổi để in vừa trên 1 tờ giấy A4.
Ý tưởng của mình là tính chiều cao của PrintArea:
[GPECODE=vb]
With Sheet1.PageSetup
PrintAreaHeight = Sheet1.Range(.PrintArea).Height
End With
[/GPECODE]
Sau đó tính chiều cao của khổ giấy:
[GPECODE=vb]
With Sheet1.PageSetup
PaperHeight = IIf(.Orientation = xlPortrait, 297, 210) * (72 / 25.4) / (.Zoom / 100) - (.TopMargin + .BottomMargin)
End With
[/GPECODE]
Tiếp đến là so sánh PaperHeight với PrintAreaHeight để điều chỉnh chiều cao cho các dòng từ 8 đến 46.
Vấn đề ở đây là mình tính được PaperHeight < PrintAreaHeight nhưng vẫn in được toàn bộ PrintArea trên 1 trang A4. Mình nghĩ công thức tính PaperHeight ở trên có vấn đề nhưng mình tìm mãi không biết sai ở chổ nào?
Toàn bộ Code cho việc này như sau:
[GPECODE=vb]
Sub TestPrint()
Dim lngTableBe As Long, lngTableEn As Long
Dim PrintAreaBe As Long, PrintAreaEn As Long
Dim PrintAreaHeight As Double, PaperHeight As Double
Dim Delta As Double
lngTableBe = Sheet1.Range("BATDAU").Row
lngTableEn = Sheet1.Range("KETTHUC").Row - 1
Select Case Sheet1.HPageBreaks.Count
Case 0
With Sheet1.PageSetup
.FooterMargin = 0
.HeaderMargin = 0
Sheet1.Rows(lngTableBe & ":" & lngTableEn).RowHeight = 18
If .PrintArea <> "" Then
PrintAreaBe = Val(Split(Split(.PrintArea, ":")(0), "$")(2))
PrintAreaEn = Val(Split(Split(.PrintArea, ":")(1), "$")(2))
PrintAreaHeight = Sheet1.Range(.PrintArea).Height
PaperHeight = IIf(.Orientation = xlPortrait, 297, 210) * (72 / 25.4) / (.Zoom / 100) - (.TopMargin + .BottomMargin)
Delta = Round((PaperHeight - PrintAreaHeight) / (lngTableEn - lngTableBe + 1), 2)
PaperHeight = Round(PaperHeight, 2)
MsgBox "PrintArea" & vbTab & vbTab & ": " & .PrintArea & vbCrLf & _
"PrintAreaHeight" & vbTab & ": " & PrintAreaHeight & vbCrLf & _
"PaperHeight" & vbTab & ": " & PaperHeight & " (Tai sao PaperHeight < PrintAreaHeight nhung lai in duoc tren 1 trang giay?)" & vbCrLf & _
"PrintZoom" & vbTab & ": " & .Zoom & "%" & vbCrLf & _
"Delta Height" & vbTab & ": " & Delta
'Sheet1.Rows(lngTableBe & ":" & lngTableEn).RowHeight = 17 + Delta
End If
End With
Case 1
Case Else
End Select
End Sub
[/GPECODE]
Xin các cao thủ ra tay giúp đỡ.
Mình có 1 sheet được thiết lập cùng in PrintArea = "$A$1:$H$46" và vùng này có thể thay đổi khi chèn thêm dòng nằm giữa 8 và 46.
Mình muốn khi in thì cố định chiều cao của các dòng từ 1 đến 7.
Các dòng từ 8 đến cuối bảng tính (như ví dụ này là 46) thì tự động thay đổi để in vừa trên 1 tờ giấy A4.
Ý tưởng của mình là tính chiều cao của PrintArea:
[GPECODE=vb]
With Sheet1.PageSetup
PrintAreaHeight = Sheet1.Range(.PrintArea).Height
End With
[/GPECODE]
Sau đó tính chiều cao của khổ giấy:
[GPECODE=vb]
With Sheet1.PageSetup
PaperHeight = IIf(.Orientation = xlPortrait, 297, 210) * (72 / 25.4) / (.Zoom / 100) - (.TopMargin + .BottomMargin)
End With
[/GPECODE]
Tiếp đến là so sánh PaperHeight với PrintAreaHeight để điều chỉnh chiều cao cho các dòng từ 8 đến 46.
Vấn đề ở đây là mình tính được PaperHeight < PrintAreaHeight nhưng vẫn in được toàn bộ PrintArea trên 1 trang A4. Mình nghĩ công thức tính PaperHeight ở trên có vấn đề nhưng mình tìm mãi không biết sai ở chổ nào?
Toàn bộ Code cho việc này như sau:
[GPECODE=vb]
Sub TestPrint()
Dim lngTableBe As Long, lngTableEn As Long
Dim PrintAreaBe As Long, PrintAreaEn As Long
Dim PrintAreaHeight As Double, PaperHeight As Double
Dim Delta As Double
lngTableBe = Sheet1.Range("BATDAU").Row
lngTableEn = Sheet1.Range("KETTHUC").Row - 1
Select Case Sheet1.HPageBreaks.Count
Case 0
With Sheet1.PageSetup
.FooterMargin = 0
.HeaderMargin = 0
Sheet1.Rows(lngTableBe & ":" & lngTableEn).RowHeight = 18
If .PrintArea <> "" Then
PrintAreaBe = Val(Split(Split(.PrintArea, ":")(0), "$")(2))
PrintAreaEn = Val(Split(Split(.PrintArea, ":")(1), "$")(2))
PrintAreaHeight = Sheet1.Range(.PrintArea).Height
PaperHeight = IIf(.Orientation = xlPortrait, 297, 210) * (72 / 25.4) / (.Zoom / 100) - (.TopMargin + .BottomMargin)
Delta = Round((PaperHeight - PrintAreaHeight) / (lngTableEn - lngTableBe + 1), 2)
PaperHeight = Round(PaperHeight, 2)
MsgBox "PrintArea" & vbTab & vbTab & ": " & .PrintArea & vbCrLf & _
"PrintAreaHeight" & vbTab & ": " & PrintAreaHeight & vbCrLf & _
"PaperHeight" & vbTab & ": " & PaperHeight & " (Tai sao PaperHeight < PrintAreaHeight nhung lai in duoc tren 1 trang giay?)" & vbCrLf & _
"PrintZoom" & vbTab & ": " & .Zoom & "%" & vbCrLf & _
"Delta Height" & vbTab & ": " & Delta
'Sheet1.Rows(lngTableBe & ":" & lngTableEn).RowHeight = 17 + Delta
End If
End With
Case 1
Case Else
End Select
End Sub
[/GPECODE]
Xin các cao thủ ra tay giúp đỡ.
File đính kèm
Lần chỉnh sửa cuối: