VBA列印多張工作表是常見需求,本文先介紹Excel如何操作,說明錄製巨集的方法可能沒辦法完成此項任務,進而設計1行程式碼,執行合併工作表預覽列印。
目錄
Toggle一、Excel多工作表資料
範例資料是在活頁簿中有4個工作表,分別是「二月」、「二月」、「三月」、「第一季」,工作表內是相對應的資料,在此為了簡便其見,只有單純大大的文字。

二、預覽列印工具
VBA自動化在本質上是讓程式去操作Excel,所以勢必要先瞭解Excel如何操作,才能夠比較適當有效率的設計程式。而在Excel是以工作表為對象進行列印設置和執行,前往上方功能區的「頁面配置」,指令群組「版面設定」面板的右下角有個代表更多選項的箭頭框框,點一下進入完整的「版面設定」視窗,這裡是許多設定選項,右下方有個很實用的「預覽列印」。

三、Excel錄製巨集
Excel有個很強大的錄製巨集工具,它會把所進行的種種操作錄製起來,然後不但可以再一鍵播放重複執行,而且還能進入VBA編輯器瞭解相對應的程式代碼。
利用這個指令錄製上個步驟介紹的預覽列印,會發現到它的程式代碼非常多,但其實沒有進行任何的設定,這是錄製巨集的特性,就跟現場實際錄音常見的狀況,雖然會錄到操作,同時也會有許多背景雜音一同被錄製進去。
稍微看一下裡面的兩行代碼,一個可能是比較沒辦法直接知道它的作用:「Application.PrintCommunication」,另一個很顯然是對應到上個步驟種種的版面設定選項。

四、VBA列印工作表
在VBA的自訂表單有個概念是設計階段和執行階段,它是指可以在編輯器裡面針對某個對象事先做好屬性設置,或者在程式執行階段以具體的程式碼去進行設定。
有了這個概念之後,應該能瞭解為何上個步驟錄製的巨集有一些顯得多餘的代碼,因為它把大概把所有對象設定、也就是版面設定的工作直接在執行階段去操作,然而其實從第二步驟的操作並沒有任何的版面設定,或者可以說保留了原來的預設值,沒有做任何變動。
接著再回到VBA自動化的基本原則:先熟悉Excel操作,再設計VBA程式,而只要有使用過Excel列印的話,就會知道它的過程類似程式對象的設計階段,會在每一次列印的時候去引用先前所設定的版面設計,或者說它會把先前的版面設定儲存起來成為預設值。
在上述的概念基礎上要開始設計程式,這時首先考慮是要在設計階段還是執行階段進行版面設定。實務狀況通常都是工作表資料都已經架構好了,包括列印的版面設定,而且原則上不會去更改版面設定,每次都只是預覽或者直接列印。
因此雖然可以參考所錄製的巨集代碼設計VBA程式,可是顯然是在Excel操作會比較簡單方便,在Excel設定好了之後,VBA只剩下單純的預覽列印,也就是這裡看到的程式碼:「ActiveSheet.PrintPreview」,非常簡單只有一行。

五、Excel工作表群組
Excel列印是以單一工作表作為對象,不過在實務常常有需要合併列印多個工作表,可以先按住Ctrl鍵不放,依序選取多個工作表,例如這裡已經選取了「一月」、「二月」、「三月」3張工作表,這時在工作表的索引標籤名稱上滑鼠右鍵,可以看到目前已經是將這三個工作表群組起來的狀態。

六、多工作表列印
沿續上個步驟,在多工作表同時選取的狀態操作預覽列印,在左上角有個「資料組」代表是有多工作表同時列印,在預覽畫面左下角有頁數指標:「2/3」,目前是第2頁,總共有3頁。

七、VBA多工作表列印
VBA列印多工作表的程式也不會很複雜,同樣是先前第四步驟基本的語法架構,使用Array函數串連三張工作表﹐組成一組陣列資料進行列印。
關於VBA陣列的基礎概念,可以參考贊贊小屋相關文章:

八、合併列印預覽
執行上個步驟的程式,雖然預覽畫面有些不太一樣,功能都是合併列印多張工作表,同樣可以「下一頁」、「上一頁」進行切換。

Excel錄製巨集的侷限性
這篇文章介紹VBA如何用程式自動化操作Excel,範例是合併列印多張工作表,在過程中有三個比較主要的心得:
其一,Excel錄製巨集雖然方便,可是同時會把一些沒有預期的東西也錄製進去。
其二,可以透過錄製的巨集去看Excel操作的原始碼,可是兩者之間的對應性並非一對一,也就是有可能設計不同的VBA程式實現同樣特定的Excel操作。
其三,更重要的是,想要實現某些較為複雜的操作,以本篇文章範例而言,很有可能沒有辦法單純透過錄製巨集的方式達成,而是要使用例如陣列的方式輔助實現。
微軟說明頁面:Sheets.PrintPreview 方法 (Excel)。
想要更多完整的學習資源嗎?歡迎前往贊贊小屋VBA教學中心!