任務介紹
上一回我們進行了分類彙總值的統計,這一回我們統計分類明細。具體任務目標爲將下面“分數”sheet頁按性別分成男/女兩個sheet頁,每個sheet頁的結構一樣。實際上就是將總表的各行分別複製到不同sheet頁即可。
VBA編程
- 依次點擊【開發工具】→【Visual Basic】,雙擊【ThisWorkbook】進入編程頁面。如果想同時保留多個宏,也可以【右鍵】【插入模塊】進入編程頁面。
- 編寫如下程序
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語句調用方是被複制的對象,輸入參數是粘貼到的對象。可以簡單理解爲從語句左邊的對象複製粘貼到右邊的對象。
- 點擊綠色小三角運行宏,或者點擊【宏】找到這個宏並執行都可以運行這段程序。寫在【模塊】裏的宏沒有ThisWorkbook前綴。
- 運行結果如下: