2015-10-06 252 views
2

我有一個包含6個不同工作表的工作簿。該工作簿需要給用戶打印兩組不同的報告。選項1將打印工作表1,3和5,選項2將打印工作表2,4和6.每張工作表將需要不同的打印範圍和打印設置。我已經這樣接近它,並想知道這是否是最好的方法來處理它(我確信有一個更好/正確的方法)。在Excel中打印特定的工作表,使用不同的打印區域和使用VBA的打印設置

Sub printingSheets() 

Dim Sh1 As Worksheet 
Dim Sh3 As Worksheet 
Dim Sh5 As Worksheet 

With ThisWorkbook 

Set Sh1 = .Sheets(「Dataset1」) 
Set Sh3 = .Sheets(「Dataset2」) 
Set Sh5 = .Sheets(「Dataset3」) 

‘Setting the print area 

Sh1.PageSetup.PrintArea = "$A$1:$C$5" 
Sh3.PageSetup.PrintArea = "$A$1:$S$5" 
Sh5.PageSetup.PrintArea = "$A$1:$AA$7" 

‘Setting up the print setup 

Sh1.PageSetup.PaperSize = xlPaperA4 
Sh3.PageSetup.PaperSize = xlPaperA4 
Sh5.PageSetup.PaperSize = xlPaperA3 

‘Print 

Array(Sh1, Sh3, Sh5).PrintOut Copies:=1 

End Sub 

然後我會爲其他工作表寫一個單獨的宏。

感謝任何人願意幫助!

+0

你可以寫,讓普通子你傳遞工作表,然後遍歷它們,從其他地方(或子集中定義的集合)查找正確的打印區域等。但是,由於所涉及的紙張數量很少,而且打印區域和設置都是針對每個紙張單獨進行硬編碼的,所以我認爲您的方法很好。除非將來可能需要擴展? – aucuparia

+0

感謝@aucuparia是的我同意,對於標籤的數量我想我會繼續上面的代碼。感謝您給它看看! –

回答

0

我會做不同的潛艇每一個功能,並把「魔術」號在頂部,爲常數,以簡化維護

Option Explicit 

Private Const WS_NAME As String = "Dataset" 
Private Const WS_ID  As String = "1 2 3 4 5 6"   'Dataset & # 
Private Const WS_RANGE1 As String = "A1 A1 A1 A1 A1 A1"  'First print Cell 
Private Const WS_RANGE2 As String = "C5 X1 S5 X1 AA7 X1" 'Last print Cell 
Private Const WS_SIZE As String = "9 9 9 9 8 9"   'xlPaperA4=9, xlPaperA3=8 

Public Sub printWSset() 

    setPrintInfo  'main setup and config 

    printSet "1 3 5" 'easy to change, independent of Worksheet setup 

End Sub 

Public Sub printSet(ByRef wsIDs As String) 
    Dim wsID As Variant 

    If Len(wsIDs) > 0 Then 
     For Each wsID In Split(wsIDs) 
      ThisWorkbook.Worksheets(wsID).PrintOut Copies:=1 
     Next 
    End If 
End Sub 

Public Sub setPrintInfo() 
    Dim wsName As Variant, wsR1 As Variant, wsR2 As Variant, wsSz As Variant, i As Long 

    wsName = Split(WS_ID)  'split string by default char (space); array base at 0 
    wsR1 = Split(WS_RANGE1) 
    wsR2 = Split(WS_RANGE2) 
    wsSz = Split(WS_SIZE) 

    For i = 0 To UBound(wsName) 
     setInfo WS_NAME & wsName(i), wsR1(i), wsR2(i), Val(wsSz(i)) 
    Next 
End Sub 

Private Sub setInfo(ByVal x As String, r1 As Variant, r2 As Variant, sz As Long) 

    With ActiveWorkbook.Worksheets(x).PageSetup 
     .PrintArea = r1 & ":" & r2 
     .PaperSize = sz 
    End With 

End Sub 
+0

謝謝@paul bica,我真的很想讓這項工作。當我通過VBA運行它時,找回了編譯錯誤:Public Sub setPrintInfo()的ByRef參數類型不匹配。運行代碼之前我應該​​做些什麼?謝謝 –

+0

我解決了類型不匹配問題 - 將r1和r2更改爲變體,並添加了Val()以供wsSz發送。我測試過,它似乎工作,但我沒有打印機設置(我不知道'.PrintOut'和'.PaperSize = sz') –

+0

完美,謝謝你工作:) –