← Back to list

【Excel應用】使用 VBA 批量截圖 Excel 報表

Kao Jia · 2024-03-16 17:13 · 10 claps · 10.4 min read
#excel #excelvba #screenshots #批量截圖 #報表截圖
Open on Medium ↗

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

作為 Excel 應用系列文章的第一篇✨,本文將分享如何使用 VBA 大量自動化截圖 Excel 報表,解決每次需要手動截圖的重複性工作。

目錄:
1. VBA 批量截取 Excel 報表
2. VBA 截圖注意事項
   2.1 能夠被點選的巨集 
   2.2 VBA 語法的儲存

我們先想像一個場景,你有一個 Excel 檔案,這個檔案中有 5 個工作表(sheet),每一個工作表分頁中有相同大小的報表,範圍從格子 A1 到格子 K25。

你接到一個任務是每週將這 5 張不同地區的銷售報表截圖貼到一個兩欄的表格中,並將表格貼到 Email 內文寄送給你的老闆。由於這是每週都需要完成的工作,聰明如你馬上就想到若以自動化的方法完成這個動作,必定能節省不少時間。於是你上網搜尋如何將 Excel 報表截圖自動化,最終你搜到了這篇文章😃。

重新檢視一下這項任務,你需要:

  1. 截圖 Excel 報表以圖片儲存
  2. 將圖片自動化插入表格

本文將著重分享第一個步驟可以怎麼實行,下一篇將會分享如何完成第二步🙆‍♂️。

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)批量執行

  1. 將指定的 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」作結
  1. 選擇指定範圍

第二個巨集是用來選擇一個指定工作表的指定範圍:

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)
  1. 批量執行

設定完以上兩個巨集後,現在要使用一個巨集來進行批量截圖

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 的其他應用有興趣,也可以參考以下文章:

  1. 【資料分析】使用Python 自動化操作Excel資料 — xlwings套件

메타데이터
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