【Excel應用】使用 VBA 批量截圖 Excel 報表
【Excel應用】截圖手酸了嗎?VBA 幫你自動批量截 Excel 報表

作為 Excel 應用系列文章的第一篇✨,本文將分享如何使用 VBA 大量自動化截圖 Excel 報表,解決每次需要手動截圖的重複性工作。
目錄:
1. VBA 批量截取 Excel 報表
2. VBA 截圖注意事項
2.1 能夠被點選的巨集
2.2 VBA 語法的儲存
我們先想像一個場景,你有一個 Excel 檔案,這個檔案中有 5 個工作表(sheet),每一個工作表分頁中有相同大小的報表,範圍從格子 A1 到格子 K25。
你接到一個任務是每週將這 5 張不同地區的銷售報表截圖貼到一個兩欄的表格中,並將表格貼到 Email 內文寄送給你的老闆。由於這是每週都需要完成的工作,聰明如你馬上就想到若以自動化的方法完成這個動作,必定能節省不少時間。於是你上網搜尋如何將 Excel 報表截圖自動化,最終你搜到了這篇文章😃。
重新檢視一下這項任務,你需要:
- 截圖 Excel 報表以圖片儲存
- 將圖片自動化插入表格
本文將著重分享第一個步驟可以怎麼實行,下一篇將會分享如何完成第二步🙆♂️。
VBA 批量截取 Excel 報表
本篇文章使用批量截圖的方法是使用 Excel 內建工具 VBA 寫出截圖程式碼並運行。 📌 如果你是第一次使用 VBA,請參考以下文章開啟開發人員工具:
完成環境設定之後,我們首先選擇「開發人員」>「Visual Baisc」,我們得到一個可以寫程式碼的介面:

我們將以下程式碼貼入 Module 儲存。以下會進行解釋,讀者們可以根據自己的需求來進行修改:
'Define the screenshot setting function
Sub ExportRange(rng As Range, Table As String)
Dim cob
rng.CopyPicture Appearance:=xlScreen, Format:=xlPicture
Set cob = rng.Parent.ChartObjects.Add(10, 10, 200, 200)
cob.Activate
Dim sPath As String
sPath = "C:\Users\Documents\Pictures\" & Table & ".png" 'Revise to the desired output path
With cob
.Height = rng.Height
.Width = rng.Width
.Chart.Paste
.Chart.Export Filename:=sPath, Filtername:="PNG"
.Delete
End With
End Sub
Sub table_NetSalesReport(typ As String)
Dim Name As String 'Define the screenshot file name variable
'TW'
Sheets("TW").Select
ActiveSheet.Range("A1:K25").Select 'Revise to the desired screenshot area
Name = typ & "_TW"
Application.Run "ExportRange", Selection, Name
'US'
Sheets("US").Select
ActiveSheet.Range("A1:K25").Select 'Revise to the desired screenshot area
Name = typ & "_US"
Application.Run "ExportRange", Selection, Name
'UK'
Sheets("UK").Select
ActiveSheet.Range("A1:K25").Select 'Revise to the desired screenshot area
Name = typ & "_UK"
Application.Run "ExportRange", Selection, Name
'EU'
Sheets("EU").Select
ActiveSheet.Range("A1:K25").Select 'Revise to the desired screenshot area
Name = typ & "_EU"
Application.Run "ExportRange", Selection, Name
'JP'
Sheets("JP").Select
ActiveSheet.Range("A1:K25").Select 'Revise to the desired screenshot area
Name = typ & "_JP"
Application.Run "ExportRange", Selection, Name
End Sub
Sub NSR_scr()
table_NetSalesReport "NetSalesReport"
End Sub
基本上所有 VBA 程式的執行(巨集)都是由開頭「Sub」以及結尾「End Sub」所組成,因此檢視上方語法可以看到有三組 Sub — End Sub ,代表有三個主要的巨集來完成截圖動作。
📌巨集也可以想像成 Python 的函式 (function)
這三個巨集各字分別代表(1)將指定的 Excel 範圍導出成圖片 (2)選擇指定範圍 (3)批量執行
- 將指定的 Excel 範圍導出成圖片
Sub ExportRange(rng As Range, Table As String)
- 首先先定義一個名為 ExportRange的巨集名稱,這個巨集接受兩個參數:名為「rng」的Range,以及名為「Table」的 String
Dim cob
rng.CopyPicture Appearance:=xlScreen, Format:=xlPicture
Set cob = rng.Parent.ChartObjects.Add(10, 10, 200, 200)
cob.Activate
- Dim cob: 接著我們定義一個名為「cob」的物件(之後會將它定義成圖片物件:ChartObjects)
- rng.CopyPicture: 代表複製 rng 這個範圍內的格子成為圖片,Appearance:=xlScreen 代表複製的是螢幕顯示的外觀(因此最後出來的圖片不包含隱藏的欄位);Format:=xlPicture 代表輸出的內容是圖片格式
- Set cob: 將 rng.Parent 上定義一個圖片物件(ChartOjects)賦值給 cob,其中 rng.Parent 代表 rng 所在的工作表;Add 則代表圖片對象的初始位置(左邊距、上邊距、寬度、高度),後面會將給定的範圍自動調整圖表大小至與 cob 同大小
- cob. Activate: 啟用 cob 函式(這行是必須的,才能做後續複製的動作)
Dim sPath As String
sPath = "C:\Users\Documents\Pictures\" & Table & ".png" 'Revise to the desired output path
- Dim sPath: 設定指定儲存圖片的路徑,到時給的「Table」將會成為該圖片輸出的名稱(如:Table.png)
With cob
.Height = rng.Height
.Width = rng.Width
.Chart.Paste
.Chart.Export Filename:=sPath, Filtername:="PNG"
.Delete
End With
- with 開始是調整擷取表格的圖片的大小,Height 和 Width 是將圖片高度與寬度調整成 rng 相同
- .Chart.Paste: 將前面複製的圖片(rng.CopyPicture)貼到 cob 中
- .Chart.Export: 將圖片導出至 sPath(前面已命名),並以PNG形式儲存
- .Delete: 由於已將圖片導出,因此這裡將剛剛建立的 cob 刪除
End Sub
- 最後給予一個「End Sub」作結
- 選擇指定範圍
第二個巨集是用來選擇一個指定工作表的指定範圍:
Sub table_NetSalesReport(typ As String)
Dim Name As String 'Define the screenshot file name variable
- 首先指定巨集名稱為 「table_NetSalesReport」,這個巨集接受名為「typ」的 String
- Dim Name: 定義名為 Name 字串,這將作為導出圖片的名稱
'TW'
Sheets("TW").Select
ActiveSheet.Range("A1:K25").Select 'Revise to the desired screenshot area
Name = typ & "_TW"
Application.Run "ExportRange", Selection, Name
接著有五組重複的語法,這邊以第一組舉例:
- Sheets(“TW”).Select: 選擇名為「TW」的工作表
- ActiveSheet.Range(“A1:K25”).Select: 選擇 A1 到 K25 範圍的表格,ActiveSheet表示啟用當前活動的工作表
- Name = typ & “_TW”: 將 typ 和後綴 “_TW” 賦值給 Name,之後輸出的圖片檔案名稱後綴就會是 “_TW”
- Application.Run “ExportRange”, Selection, Name: 開始運行前面寫好的「ExportRange」巨集,後面的 Selection 表示當前選中的表格範圍(A1到 K25,這也是 ExportRange 中的 rng),Name則表示輸出的文件名稱(也就會是 ExportRange 中的 table)
- 批量執行
設定完以上兩個巨集後,現在要使用一個巨集來進行批量截圖
Sub NSR_scr()
table_NetSalesReport "NetSalesReport"
End Sub
- 指定巨集名稱為 「NSR_scr」
- 執行 table_NetSalesReport 巨集,並丟入 “NetSalesReport”(也就是table_NetSalesReport 巨集中的 typ),因此各工作表輸出的圖片名稱會變成「NetSalesReport_TW」、「NetSalesReport_US」、「NetSalesReport_UK」、「NetSalesReport_EU」、「NetSalesReport_JP」
如此就完成了VBA的設定,這時我們先儲存這個 Module,並關閉 Visual Base 模式。回到 Excel 介面後選擇「開發人員」> 「巨集」,就能看到剛剛寫好的最後一個巨集名稱「NSR_scr」,此時點選這個巨集後並點選「執行」,即可完成批量截圖。
📍以下有幾點注意事項,如果遇到 VBA 執行上的問題時,可以參考以下注意點能否幫助你除錯
VBA 截圖注意事項
能夠被點選的巨集
閱讀到這裡的你也許會產生一個疑問:「剛剛明明寫了三個巨集,為何在打開『開發人員』>『巨集』後,卻只看到最後一個巨集呢?」。這是因為只有最後一個巨集不需要傳遞參數,如果你對於前兩個巨集還有印象,第一個巨集需要參數「rng」和「table」,第二個巨集需要參數「typ」,而最後一個巨集則不需要輸入任何參數。
Excel 在巨集選項的呈現上是設計用來方便使用者使用,因此僅呈現不需要輸入參數的巨集,這也是為什麼我們需要寫三個巨集來完成這個截圖程式。
VBA語法的儲存
在完成VBA語法的設計後,請務必記得選擇能夠儲存巨集的 Excel 檔案,其結尾為「.xlsm」,這樣才能儲存擁有巨集的 Excel 檔案。
然而你可能會想說:「這樣每次做新的報表都要存成『.xlsm』檔嗎?」,其實也不用,能否使用巨集取決於當前打開的多個 Excel 中有沒有擁有巨集功能的 Excel 檔。也就是說,你可以專門做一個 Excel 檔案來儲存巨集(存成「.xlsm」檔),而平常更新的報表依然存成「.xlsx」檔案。每當要截圖時,再打開存有巨集的 Excel 檔案,如此依然能夠完成「.xlsx」檔案的截圖。
以上就是如何使用 VBA 進行 Excel 批量截圖的方法, VBA 的語法和其他許多程式語言的邏輯不太一樣,學習也需要一番功夫,希望這篇文章對於讀者來說有幫助,下一篇會來討論如何使用 Python 串接 VBA 語法,有興趣的讀者可以期待一下✨。
如果對於其他 Excel 的其他應用有興趣,也可以參考以下文章:
메타데이터
- post_id
- ceb06c54b1d8
- slug
- excel應用-使用-vba-批量截圖-excel-報表-ceb06c54b1d8
- url
- https://medium.com/@kaojia/excel%E6%87%89%E7%94%A8-%E4%BD%BF%E7%94%A8-vba-%E6%89%B9%E9%87%8F%E6%88%AA%E5%9C%96-excel-%E5%A0%B1%E8%A1%A8-ceb06c54b1d8
- canonical_url
- https://medium.com/@kaojia/excel%E6%87%89%E7%94%A8-%E4%BD%BF%E7%94%A8-vba-%E6%89%B9%E9%87%8F%E6%88%AA%E5%9C%96-excel-%E5%A0%B1%E8%A1%A8-ceb06c54b1d8
- author_url
- https://medium.com/@kaojia
- status
- ok
- fetched_at
- 2026-06-11 11:25:07