使用VBA快速操作 工作表的建立合併分解

 


進入本篇文章之前,可以先思考一下,平常我們在使用Excel的時候,都是怎麼樣建立工作表,以及合併工作表的呢? 說起來,簡單的操作並不複雜,但是如果您的工作需要經常在活頁簿內,將工作表分解,建立成好幾個活頁簿,又或者是活頁簿內的工作表,要回併合成一個檔案的時候,這可能就是個很花費時間的作業。

舉例來說,一家公司底下有好幾個分店,總公司的人員提供一個Excel檔案,裡面有1個工作表,每個月的營收,各分店都要製作Excel資料並寄回總公司,接下來再由總公司的人員將所有的個別檔案合併到一個活頁簿,給上級主管審閱。遇到狀況的時候又要把活頁簿裡的工作表拆成好幾個檔案,再各自寄給各分店人員。不斷的合併分解活頁簿的工作表,如果檔案多到100個,想必負責人員可能光是做這些合併分解檔案,就什麼事都不用做了。當然假設這個檔案是獨立於ERP系統之外,需要個別製作的資料。

實際的工作,可能遠比舉例的內容更加複雜,如果您需要經常大量操作工作表建立合併分解時,不妨可以參考這個範例,希望能給您一個思考的方向。


目錄

{tocify} $title={目錄} 


前言

話說這個是我有一天在網路上所看到的問題,內容跟前面所舉的例子有點差不多,需要進行工作表的建立合併和活頁簿的工作表分解。雖然平常不會需要大量的工作表處理,但看到有這樣的需求,還是會想要試看看,可以怎麼做。

但說真的,一個活頁簿內有大量的工作表,不管是檔案龐大,更別說裡面如果設定函數、計算,甚至各式各樣的設定,都有可能讓檔案容量過於肥大,操作檔案時,如果電腦配備不好,還有可能發生當機之類的。

以下說明使用Excel 2019 ,版本不同或許有點差異,

但基本上製作的方法差不多是一樣的。

程式最終製作的成果會如下圖。


開始製作程式: 階段1 程式說明


Point!

1. 使用手動操作工作表

2. 使用VBA操作工作表程式範例預覽


在這個階段,主要說明一般的工作表操作,包含建立、複製、移動、刪除等功能。
另外最後說明整個程式寫完後,會以怎麼樣的方式呈現。

本次的撰寫的程式大概準備像以下的一個清單,
接著就會依照店名一個一個建立工作表


如何手動建立工作表?

一般要建立工作表最簡單的方式,就是在下方工作表的右側,有一個+號,
按下這個 + 號,就可以馬上建立一個新的工作表

    

如何手動複製工作表?

另外也可以使用shift + 滑鼠左鍵拖拉
舉例來說,選擇工作表1,接著使用shift + 滑鼠左鍵,就可以建立一個複製工作表1的內容

 


另外也可以使用滑鼠右鍵,在彈出視窗內選擇移動或複製,


在這邊要注意的是,如果要複製選擇的工作表,需要點選打勾V以下的建立副本,
如果只是要移動工作表,則不需要在建立副本打勾V。
移動的位置可以自由選擇或選擇移動到最後。





  

如何移動工作表到另外的活頁簿?

   活頁簿的下拉式選單往下拉,可以選擇要移動到或複製到哪個活頁簿。



透過以上的方式,就可以進行簡單的工作表操作。

關於階段1可參考以下連結影片



開始製作程式: 階段2  製作批次工作表


Point!

1. 撰寫程式前的準備

2. 製作批次工作表

3. 效果確認


在這個階段,影片會先說明撰寫程式前,應該注意的那些準備,

重要的是如果想要使用VBA,記得檔名要存為Excel 啟用巨集的活頁簿。

副檔名為 .xlsm ,不然會無法使用巨集。


之後會再進行程式碼的撰寫,最後再進行程式效果的確認。


程式碼

Sub MakeWorksheet()

 ' 異常處理
 On Error GoTo ErrorMsg

 ' 宣告變數
 ' count 為儲存格計算用宣告為整數
 Dim count As Integer
    
 ' lastRow為資料的最後一行,宣告為整數
 Dim lastRow As Integer

 ' 關閉畫面更新
 Application.ScreenUpdating = False

 ' 取得最後一列(Row)的數字
 lastRow = Worksheets(1).Range("A1").End(xlDown).Row
    
 ' For...Next 迴圈, 從A2到最後一列(Row)
 For count = 2 To lastRow
    
    ' 在每個新的工作表後, 新增工作表 並設定名稱
    Worksheets.Add(After:=Worksheets(count - 1)).Name = Worksheets(1).Range("A" & count).Value
 Next
    
 ' 開啟畫面更新
 Application.ScreenUpdating = True
    
 ' 選擇第1個工作表
 Worksheets(1).Select

 '提示完成
 MsgBox "Finish"

 Exit Sub
   
ErrorMsg:
    MsgBox "發生錯誤,請聯絡開發者! " & Chr(10) & "錯誤碼 : " & Err.Number & "  錯誤說明 : " & Err.Description

End Sub

關於階段2可參考以下連結影片



開始製作程式: 階段3  批次刪除工作表


Point!

1. 批次刪除工作表

2. 效果確認


在這個階段,主要說明如何撰寫批次刪除工作表的方式。

這個部分的重點在於,刪除工作表的迴圈,是從最後一個工作表刪到工作表1,如果是從工作表1開始刪除,程式較不容易撰寫以及容易出錯。

當然如果您想要嘗試另外的方法也是可以的喔。

最後再進行程式撰寫後的效果確認。


程式碼

Sub DeleteWorksheet()

 ' 異常處理
 On Error GoTo ErrorMsg

 ' 宣告變數
 ' i 為儲存格計算用宣告為整數,
 '並設定初期值為活頁簿的工作表數量
 Dim i As Integer: i = Worksheets.count

 ' 巨集執行時隱藏提示和警告訊息
 Application.DisplayAlerts = False
    
 ' 關閉畫面更新
 Application.ScreenUpdating = False

 ' Do Until ...Loop 刪除工作表直到工作表1
 Do Until i = 1
    
     ' 刪除工作表
     Worksheets(i).Delete
        
     i = i - 1
 Loop

 ' 巨集執行時開啟提示和警告訊息
 Application.DisplayAlerts = True
   
 ' 開啟畫面更新
 Application.ScreenUpdating = True

 ' 選擇第1個工作表
 Worksheets(1).Select

 '提示完成
 MsgBox "Finish"

Exit Sub

ErrorMsg:
    MsgBox "發生錯誤,請聯絡開發者! " & Chr(10) & "錯誤碼 : " & Err.Number & "  錯誤說明 : " & Err.Description

End Sub

關於階段3可參考以下連結影片


開始製作程式: 階段4  批次工作表轉個別檔案


Point!

1. 批次工作表轉個別檔案

2. 效果確認


在這個階段,主要說明如何撰寫批次工作表轉個別檔案的方式。

這個部分的重點在於將每個工作表,一個一個轉為個別檔案。其實就是把手動的方式的操作順序改為VBA程式撰寫,雖然程式的部分較為複雜,可能需要比較多的時間去理解。

最後再進行程式撰寫後的效果確認。



程式碼

Sub WorkSheetToIndividualFile()

  ' 異常處理
  On Error GoTo ErrorMsg

  ' 宣告變數
  ' i 為儲存格計算用宣告為整數,
  '並設定初期值為活頁簿的工作表數量
  Dim i As Integer: i = Worksheets.count
    
  ' lastRow為資料的最後一行,宣告為整數
  Dim lastRow As Integer
    
  ' dataRange為自由型態, 儲存陣列值使用
  Dim dataRange As Variant
    
  ' 取得最後一列(Row)的數字
  lastRow = Range("A1").End(xlDown).Row
    
  ' 將執行程式中的活頁簿A2到A11的值指定給dataRange
  dataRange = ThisWorkbook.Worksheets(1).Range("A2:A" & lastRow).Value

  ' 關閉畫面更新
  Application.ScreenUpdating = False

  ' Do Until ...Loop 刪除工作表直到工作表1
  Do Until i = 1
        
     ' 新增活頁簿
     Workbooks.Add
        
     ' 目前作用中的活頁簿另存新檔到執行程式的活頁簿路徑下, 名稱為陣列中的值, 副檔名為 xlsx
     ActiveWorkbook.SaveAs filename:=ThisWorkbook.path & "\" & dataRange(i - 1, 1) & ".xlsx"
        
     ' 執行程式的活頁簿的指定工作表, 移動到目前作用中的活頁簿的工作表1之前
     ThisWorkbook.Worksheets(i).Move Before:=ActiveWorkbook.Worksheets(1)
       
     ' 關閉檔案並存檔
     ActiveWorkbook.Close saveChanges:=True
        
     i = i - 1
   Loop

  ' 開啟畫面更新
  Application.ScreenUpdating = True

  '提示完成
  MsgBox "Finish"

  Exit Sub
   
ErrorMsg:
    MsgBox "發生錯誤,請聯絡開發者! " & Chr(10) & "錯誤碼 : " & Err.Number & "  錯誤說明 : " & Err.Description

End Sub


關於階段4可參考以下連結影片



開始製作程式: 階段5  檔案合併回活頁簿


Point!

1. 個別檔案合併回活頁簿

2. 效果確認


在這個階段,主要說明如何撰寫個別檔案合併回活頁簿的方式。

這個部分的重點在於,將每一個檔案的工作表合併到活頁簿。但要注意的是,範例程式的設計為,針對每個工作表1,合併到一個檔案中,也就是階段4的延續,跟實際上可能每個檔案都有不同數量的活頁簿的設計不太相同。如果想要一樣的效果,可能就要再追加需要的程式碼,才能符合不同的需求。

最後再進行程式撰寫後的效果確認。


程式碼

Sub MergeSheetsToOne()

  ' 異常處理
  On Error GoTo ErrorMsg
    
  ' 宣告變數
  ' 變數path為字串型態
  Dim currentWorkbookPath As String
    
  ' 變數filename為字串型態
  Dim filename As String
    
  ' 變數i為整數型態 , 並設定初期值為1
  Dim i As Integer: i = 1
    
  ' 變數lastRow 為最後一列Row的數字
  Dim lastRow As Integer
    
  ' 變數CheckDir為字串型態
  Dim CheckDir As String
    
  ' 變數 currentProgramSheet為工作表物件
  Dim currentProgramSheet As Worksheet
    
  'currentProgramSheet 參照執行程式的活頁簿的工作表1
  Set currentProgramSheet = ThisWorkbook.Worksheets(1)

  ' 執行程式的活頁簿路徑指定給path變數
  currentWorkbookPath = ThisWorkbook.path
    
  ' dataRange為自由型態, 儲存陣列值使用
  Dim dataRange As Variant
    
  ' 取得最後一列(Row)的數字
  lastRow = Range("A1").End(xlDown).Row
    
  ' 將執行程式中的活頁簿A2到A11的值指定給dataRange
  dataRange = currentProgramSheet.Range("A2:A" & lastRow).Value
    
  ' 關閉畫面更新
  Application.ScreenUpdating = False
    
  ' For迴圈 確認資料夾內是否有與工作表內名稱相同的檔案
  For i = lastRow To 2 Step -1
         
     ' 確認執行程式的活頁簿路徑下的檔案
     CheckDir = Dir(currentWorkbookPath & "\" & dataRange(i - 1, 1) & ".xlsx")
        
     ' 如果找到的檔案名稱與執行程式的活頁簿相同
     If CheckDir = dataRange(i - 1, 1) & ".xlsx" Then
        
          ' 以唯讀方式開啟該名稱的活頁簿
          Workbooks.Open filename:=currentWorkbookPath & "\" & dataRange(i - 1, 1) & ".xlsx", ReadOnly:=True
           
          '目前作用中的活頁簿的工作表1,移動到執行程式的活頁簿的工作表1之後
          ActiveWorkbook.Worksheets(1).Move After:=currentProgramSheet
            
          ' 活頁簿關閉不存檔
          Workbooks(dataRange(i - 1, 1) & ".xlsx").Close saveChanges:=False
            
          ' 刪除檔案
          Kill currentWorkbookPath & "\" & currentProgramSheet.Range("A" & i).Value & ".xlsx"
                    
     Else
          ' 若找不到則傳回無此檔案
          MsgBox "無此檔案:  " & dataRange(i - 1, 1) & ".xlsx"
                    
     End If
  Next

  ' 開啟畫面更新
  Application.ScreenUpdating = True
    
  ' 選擇執行程式中的活頁簿的工作表1
  currentProgramSheet.Select
    
  ' 釋放物件
  Set currentProgramSheet = Nothing
    
  '提示完成
  MsgBox "Finish"
    
  Exit Sub
   
ErrorMsg:
    MsgBox "發生錯誤,請聯絡開發者! " & Chr(10) & "錯誤碼 : " & Err.Number & "  錯誤說明 : " & Err.Description

End Sub

關於階段5可參考以下連結影片


以上就是本次文章所介紹的內容,有興趣再參考看看吧。




張貼留言 (0)
較新的 較舊