2017-06-19 398 views
1

我在Excel中有一個工作表,其中包含多個頁面。我想打印選定的頁面,例如第1頁,第3頁,第4頁和第6頁。我可以在singel打印工作中做到這一點嗎?使用VBA宏打印Excel工作表中的選定頁面

在知道我可以用下面的命令打印的頁數: ActiveSheet.PrintOut From:=1, To:=1, Copies:=1, Collate:=True ActiveSheet.PrintOut From:=1, To:=3, Copies:=3, Collate:=True ActiveSheet.PrintOut From:=1, To:=4, Copies:=4, Collate:=True ActiveSheet.PrintOut From:=1, To:=6, Copies:=6, Collate:=True

不過這樣一來,我創造了很多的打印作業。因此,我期待像類似 打印輸出(第1頁,第3頁,第4頁,....)


更多信息關於我的問題: 有我的工作表一個送貨單:Excel delivery notes 他們中的一些沒有C欄中的條目。 (例如第2頁)。我寫了萬客隆它迭代的pagebreakes,檢查每一頁上的C-柱:

Option Explicit 
Sub LieferscheineDrucken() 
Dim HPB As HPageBreak 
Dim breakAdress As Integer 
Dim pageNumber As Integer 
Dim productNumber As Integer 
Dim printCondition As Boolean 
pageNumber = 1 
printCondition = False 

'Drucke Seite 1 
For productNumber = 10 To 61 
    ActiveSheet.Cells(productNumber, "C").Select 
    If ActiveSheet.Cells(productNumber, "C").Value <> "" Then 
    printCondition = True 
    End If 
Next 

If printCondition = True Then 
    ActiveSheet.PrintOut From:=1, To:=1, Copies:=1, Collate:=True 
End If 
printCondition = False 
pageNumber = pageNumber + 1 


'Drucken der restlichen Seiten 
For Each HPB In ActiveSheet.HPageBreaks 
    breakAdress = CInt(Mid(HPB.Location.Address, 4, 5)) 


    'Teste, ob Lieferschein Einträge enthält 
    For productNumber = (breakAdress + 9) To (breakAdress + 60) 
      If ActiveSheet.Cells(productNumber, "C").Value <> "" Then 
       printCondition = True 
      End If 
    Next 

    If printCondition = True Then 
     ActiveSheet.PrintOut From:=pageNumber, To:=pageNumber, Copies:=1, Collate:=True 
    End If 

    pageNumber = pageNumber + 1 
    printCondition = False 

Next 
End Sub 

,不過該宏發PrintJob的每一頁。如何通過只發送一個printjob來打印相關頁面?

感謝您的幫助!

+0

據我所知,您可以對錶單執行此操作,但不能處理頁面,因爲打印輸出中沒有處理頁面數組的屬性,而不是序列。一個技巧是將頁面移動到工作表,然後嘗試打印選中的工作表,並將其保存在數組中:'ThisWorkbook.Worksheets(PrintCollection).PrintOut'其中PrintCollection是一組工作表 – Ibo

+0

是的,我發現了幾種方法用於打印收集表格。 複製解決方案似乎非常煩人,但我會試試這個。 謝謝。 – Hannes

回答

0

代碼會是這樣的。

Sub test() 
    Dim Ws As Worksheet 
    Dim hp As HPageBreak 
    Dim vAddress() 
    Dim i As Long 

    Set Ws = ActiveSheet 
    n = Ws.HPageBreaks.Count 

    For i = 0 To n 
     ReDim Preserve vAddress(i) 
     If i = 0 Then 
     vAddress(i) = Ws.Range("a1").Address 
     Else 
     vAddress(i) = Ws.HPageBreaks(i).Location.Address 
     End If 
      Set rngDB = Ws.Range(vAddress(i)).Range("c5").Resize(21) 'Range("c5").Resize (21) is coumn C date range 
      If WorksheetFunction.CountA(rngDB) Then 
       Ws.PrintOut from:=i + 1, To:=i + 1, preview:=True 
      End If 
    Next i 

End Sub