2017-11-27 6 views
0

사용자가 작성한 양식에서 명령 단추를 클릭하면 다음 코드가 실행됩니다. 양식에는 5 페이지가 있지만 10 페이지 중 9 번은 첫 페이지와 다섯 페이지에만 정보가 있습니다. 페이지 2-4는 추가 항목이지만 데이터가 없으면 인쇄하지 않아도됩니다. 현재 코드를 사용하여 인쇄 할 때 다섯 페이지가 모두 인쇄됩니다.Excel에서 VBA를 사용하여 값이 있고 비어있는 페이지를 인쇄합니다.

인쇄 할 적절한 인쇄 영역을 얻으려면 코드에 도움이 필요합니다. 코드의 마지막 줄이 문제인지 또는 인쇄 영역이 계산되는 방법인지 확실하지 않습니다. 설정 범위에서 범위 변수를 설정해야합니까 아니면 인쇄 명령에서 전체 범위를 사용하여 인쇄 영역을 인쇄 할 수 있습니까?

제공되는 도움을 주셔서 감사합니다. 여기에 내가 실행하려고하는 하위가 있습니다.

Private Sub PrintEstimate1_Click() 
' Prints the estimate upon clicking once 
    Dim ws As Worksheet 
Set ws = ActiveSheet 

Dim page1 As Range 
Dim page2 As Range 
Dim page3 As Range 
Dim page4 As Range 
Dim page5 As Range 

Set page1 = ws.Range("A2:I58") 
Set page2 = ws.Range("A59:I116") 
Set page3 = ws.Range("A117:I174") 
Set page4 = ws.Range("A175:I232") 
Set page5 = ws.Range("A233:I289") 

Dim setup As PageSetup 
Set setup = ws.PageSetup 

If ws.Range("A63").Value = vbNullString Then 
    setup.PrintArea = Union(page1, page5).Address 
ElseIf ws.Range("A121").Value = vbNullString Then 
    setup.PrintArea = Union(page1, page2, page5).Address 
ElseIf ws.Range("A179").Value = vbNullString Then 
    setup.PrintArea = Union(page1, page2, page3, page5).Address 
Else 
    setup.PrintArea = Union(page1, page2, page3, page4, page5).Address 
End If 

msg = "Would you like to send to default printer?" 
msg = msg & vbNewLine 
config = vbYesNoCancel + vbQuestion + vbDefaultButton1 
Title = "Printer Selection" 
ans = MsgBox(msg, config, Title) 

' Dialog Box to decide whether to quick print or make changes to printer setup. 
If ans = vbYes Then Worksheets("PE Form").Range("A1:I288").PrintOut Copies:=1, Collate:=True 
'I am not sure if it is this line above that is giving me the problem or not. 
If ans = vbNo Then Application.Dialogs(xlDialogPrint).Show 
If ans = vbCancel Then 
End If 

End Sub 
+0

A63, A121 및 A179가 실제로 비어 있는지 확인하십시오. 모든 5 페이지가 인쇄되면 해당 테스트가 실패했다고 가정합니다. 그 세포들은 하나의 공간을 가질 수 있습니까? 단계별로 실행하면'ElseIf' 명령문의'If'가 실행되거나'Else' 만 실행합니까? – MoondogsMaDawg

+0

예, 셀이 비어 있는지 확인했습니다. 내가 그걸 밟았을 때, A63이 비어있는 첫 번째 IF를 잡아서 인쇄 영역을 Page1과 Page5로 설정했지만, 인쇄 할 때 5 페이지 모두를 인쇄했습니다. – Decoy26

+1

'ans = vbYes Then Worksheets ("PE Form"). 범위 ("A1 : I288"). PrintOut' 여기에 범위를 하드 코드했습니다. 나는 이것이 당신의 인쇄 영역 설정을 무시할 것이라고 생각합니다. '만약 ans = vbYes이면 워크 시트 ("PE Form") .PrintOut' (테스트 안 함). – MoondogsMaDawg

답변

0

MoondogsMaDawg 덕분 및 페이지 나누기에 대한 몇 가지 연구는 내가 의도 한대로 작동 할 것으로 보인다 다음 수정 된 코드가 있습니다.

Private Sub PrintEstimate1_Click() 
' Prints the estimate upon clicking once 
    Dim ws As Worksheet 
Set ws = ActiveSheet 
ws.ResetAllPageBreaks 
ws.PageSetup.PrintArea = "" 

Dim setup As PageSetup 
Set setup = ws.PageSetup 

Dim page1 As Range 
Dim page2 As Range 
Dim page3 As Range 
Dim page4 As Range 
Dim page5 As Range 

Set page1 = ws.Range("A1:I58") 
Set page2 = ws.Range("A59:I116") 
Set page3 = ws.Range("A117:I174") 
Set page4 = ws.Range("A175:I232") 
Set page5 = ws.Range("A233:I289") 

ws.Rows(59).EntireRow.PageBreak = xlPageBreakManual 
ws.Rows(117).EntireRow.PageBreak = xlPageBreakManual 
ws.Rows(175).EntireRow.PageBreak = xlPageBreakManual 
ws.Rows(233).EntireRow.PageBreak = xlPageBreakManual 
ws.Columns("J").EntireColumn.PageBreak = xlPageBreakManual 

If ws.Range("A63").Value = vbNullString Then 
    setup.PrintArea = Union(page1, page5).Address 
ElseIf ws.Range("A121").Value = vbNullString Then 
    setup.PrintArea = Union(page1, page2, page5).Address 
ElseIf ws.Range("A179").Value = vbNullString Then 
    setup.PrintArea = Union(page1, page2, page3, page5).Address 
Else 
    setup.PrintArea = Union(page1, page2, page3, page4, page5).Address 
End If 

msg = "Would you like to send to default printer?" 
msg = msg & vbNewLine 
config = vbYesNoCancel + vbQuestion + vbDefaultButton1 
Title = "Printer Selection" 
ans = MsgBox(msg, config, Title) 

' Dialog Box to decide whether to quick print or make changes to printer setup. 
If ans = vbYes Then Worksheets("PE Form").PrintOut Copies:=1, Collate:=True 
If ans = vbNo Then Application.Dialogs(xlDialogPrint).Show 
If ans = vbCancel Then 
End If 

End Sub