文科生也能學會的Excel VBA 宏編程入門(二)——分類明細

任務介紹

上一回我們進行了分類彙總值的統計,這一回我們統計分類明細。具體任務目標爲將下面“分數”sheet頁按性別分成男/女兩個sheet頁,每個sheet頁的結構一樣。實際上就是將總表的各行分別複製到不同sheet頁即可。
在這裏插入圖片描述

VBA編程

  1. 依次點擊【開發工具】→【Visual Basic】,雙擊【ThisWorkbook】進入編程頁面。如果想同時保留多個宏,也可以【右鍵】【插入模塊】進入編程頁面。
    在這裏插入圖片描述在這裏插入圖片描述
  2. 編寫如下程序
Sub 分類明細統計()
'
' 按分類統計明細
'

'

Dim maleRow, femaleRow As Long '用於記錄兩個分sheet頁分別記錄到哪一行了

maleRow = 2
femaleRow = 2

Dim nameList() As String           '定義一個字符串數組
nameList = Split("男生,女生", ",") '通過Split函數將字符串通過“,”分割成字符串數組


'刪除sheet
For Each name In nameList  '循環語句,遍歷nameList數組中的每一個字符串
    On Error Resume Next   '出錯後繼續執行。因爲sheet不存在時刪除會報錯
    Application.DisplayAlerts = False '關閉彈窗提示
    Sheets(name).Delete
    Application.DisplayAlerts = True  '打開彈窗提示
    On Error GoTo 0       '取消出錯後繼續執行
Next

Sheets("分數").Select

'創建sheet
For Each name In nameList
    Sheets.Add after:=ActiveSheet '在當前激活的Sheet後面添加一個新的sheet
    ActiveSheet.name = name       '新添加的sheet會變成當前激活的sheet,所以給ActiveSheet改名即可
    Sheets("分數").Rows(1).Copy ActiveSheet.Rows(1)  '將分數的第一行標題複製到新建的sheet的第一行
    
Next


Dim row, rowNumber As Long
row = 2
rowNumber = Sheets("分數").UsedRange.Rows.Count '獲取分數的總行數

Do While row <= rowNumber '用於判斷是否到最後一行
        
    If Sheets("分數").Range("B" & row) Like "男" Then
        Sheets("分數").Rows(row).Copy Sheets("男生").Rows(maleRow)
        maleRow = maleRow + 1
    Else
        Sheets("分數").Rows(row).Copy Sheets("女生").Rows(femaleRow)
        femaleRow = femaleRow + 1
    End If
        
    row = row + 1
        
Loop

End Sub
  • 下面對程序中一部分內容進行說明,這裏Dim maleRow, femaleRow As Long採用了Long類型,Long是長整型,VBA中,Integer類型的範圍是-32768–32767,由於擔心Excel錶行數超出3萬多條,因此採用Long型,範圍是-2147483648 – 2147483648,肯定夠用。
  • Dim nameList() As String是定義一個字符串數組,也就是說VBA裏面在變量名後面加個括號就可以定義成數組類型,定義成數組類型是爲了方便通過循環的方式遍歷數組裏面的內容,避免大量重複的代碼。
  • nameList = Split("男生,女生", ","),這裏用VBA自帶的Split函數將字符串"男生,女生"通過逗號分割成字符串數組{"男生","女生"}
  • For Each是VBA中常用來遍歷數組的循環語句,每次從數組中順序取出一個值賦給變量,直到取完。
For Each 變量 In 數組變量
...程序
Next
  • On Error Resume Next的意思是當發生錯誤的時候,無視錯誤並繼續運行。該語句對整個Sub內的代碼都有效,如果要關閉這個功能,需使用語句On Error GoTo 0。這裏使用這個語句是刪除不存在的Sheet頁時會報錯,因此跳過錯誤繼續刪除下一個。
  • Application.DisplayAlerts = False是用來關閉彈窗,不然每次刪除一個Sheet的時候都會彈出一個煩人的提示窗。
  • Sheets("分數").Select顧名思義就是選中“分數”這個Sheet頁,相當於用鼠標點擊了這個Sheet頁標籤一樣,目的是爲了讓它成爲當前激活的Sheet頁。
  • Sheets.Add after:=ActiveSheet是在激活的Sheet頁後面添加一個新的Sheet頁。VBA中,符號:=是用來給函數的輸入參數賦值。也就是說Add這個函數有一個名叫after的輸入參數,用於告訴Add函數在哪個Sheet頁後面添加一個新的Sheet頁。顯然,Add函數也有一個叫before的參數用來在某個Sheet頁前面添加一個新的Sheet頁,具體可以查VBA文檔。而我們希望的是在當前激活的Sheet頁後面添加一個新的Sheet頁。需要注意的是,每個新添加的Sheet頁會變成當前激活的Sheet頁。
  • Sheets("分數").Rows(row).Copy Sheets("男生").Rows(maleRow),VBA的Copy語句調用方是被複制的對象,輸入參數是粘貼到的對象。可以簡單理解爲從語句左邊的對象複製粘貼到右邊的對象。
  1. 點擊綠色小三角運行宏,或者點擊【宏】找到這個宏並執行都可以運行這段程序。寫在【模塊】裏的宏沒有ThisWorkbook前綴。
    在這裏插入圖片描述
  2. 運行結果如下:
    在這裏插入圖片描述
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章