VBA宏編程簡介
VBA編程是Office系列軟件自帶的編程功能,也就是說不只是Excel,Word和PPT也能進行VBA編程。而“宏”可以理解爲一組自動化程序,執行一個宏就能執行其對應的一系列操作。創建宏主要有兩種方法,一種是錄製宏,也就是將人的一些操作錄下來,需要的時候執行宏就可以自動重複這些操作;另一種就是本文要介紹的,通過VBA編程來自己寫一個宏。
準備工作
Excel默認是沒有打開宏功能和VBA編程功能的,因此需要打開一下。
打開宏功能
依次點擊【文件】 【選項】【信任中心】【信任中心設置】【宏設置】【啓用所有宏】
打開“開發工具”選項卡
依次點擊【文件】 【選項】【自定義功能區】找到“開發工具”,並把它添加到右邊
VBA編程
示例任務介紹
該任務分兩個sheet,其中Sheet1爲學生的分數,Sheet2爲對Sheet1的信息進行分類統計,具體如下:
第一個表起名爲“分數”,第二個表起名爲“統計”
文件宏
- 依次點擊【開發工具】【Visual Basic】
左側看到如上圖所示目錄,雙擊【Sheet1】、【Sheet2】、【ThisWorkbook】都可以打開編程窗口,但程序作用範圍不一樣,由於我們需要操作兩個Sheet,因此雙擊【ThisWorkbook】打開。這裏大家可能能猜到了,Workbook指的就是這個Excel文件。 - 編寫如下程序
Sub 分類統計()
Dim maleCtr As Integer '男生人數
Dim femaleCtr As Integer '女生人數
Dim daCtr As Integer '名字以達結尾人數
Dim maleSum As Double '男生總分
Dim femaleSum As Double '女生總分
Dim i As Integer
i = 2
Do While Not IsEmpty(Sheet1.Range("A" & i))
Dim name, sex As String
Dim score As Double
name = Sheet1.Range("A" & i)
sex = Sheet1.Range("B" & i)
score = Sheet1.Range("C" & i)
If sex = "男" Then
maleCtr = maleCtr + 1
maleSum = maleSum + score
Else
femaleCtr = femaleCtr + 1
femaleSum = femaleSum + score
End If
If name Like "*達" Then 'like是相似的意思,*爲通配符
daCtr = daCtr + 1
End If
i = i + 1 '下一行
Loop
Sheet2.Range("A2").NumberFormatLocal = "0" '設置數字格式爲沒有小數
Sheet2.Range("B2").NumberFormatLocal = "0.##" '設置數字格式爲小數點後兩位,非零才顯示
Sheet2.Range("C2:E2").NumberFormatLocal = "0.00" '設置數字格式爲小數點後兩位且補零
Sheet2.Range("A2") = maleCtr
Sheet2.Range("B2") = femaleCtr
Sheet2.Range("C2") = daCtr
Sheet2.Range("D2") = maleSum / maleCtr
Sheet2.Range("E2") = femaleSum / femaleCtr
End Sub
- 下面對程序進行一些說明,首先
Sub 宏名稱()...End Sub
裏“宏名稱”改成任意你想要的宏名稱即可,但不可以有空格。 Dim 變量名 As 數據類型
是Visual Basic語言定義變量的方式,其中常用的數據類型有Integer
整數、Double
小數、String
字符串、Date
日期。- Visual Basic語言中單引號
'
後面的爲註釋內容,即程序之外的文本,不參與程序的運行,一般用來寫一些解釋說明,方便程序的理解。如程序中Dim maleCtr As Integer '男生人數
。maleCtr
這個整數類型的變量用於累加Sheet1中男生的人數。 Do While 邏輯條件 ... Loop
是Visual Basic中的循環語句之一,當邏輯條件爲真時進入循環,當邏輯條件爲假時退出循環。本程序中這個循環是爲了一行行遍歷Sheet1這張表,直到最後一個學生。因此我們需要判斷變量i
什麼時候到最後一行。這裏採用的邏輯條件是Not IsEmpty(Sheet1.Range("A" & i))
,其中IsEmpty()
是用於判斷是否爲空,爲空時返回true
,否則返回false
,但我們希望當不爲空時繼續循環,因此前面加個Not
用於取反。Sheet1.Range("A1" )
可以用於取出Sheet1中A1格里面的內容,此外還可以用Sheets(1).Range("A1" )
或Sheets("分數").Range("A1" )
。"A" & i
是將字符串"A"
和整數i
拼接起來,隨着i=i+1
的累加,這個程序中會依次遍歷"A2"
、"A3"
一直到退出循環。- Visual Basic常用的邏輯判斷語句如下,當邏輯條件1滿足時執行程序1,都不滿足時執行程序3,其中
Elseif 邏輯條件 Then
的數量不限。
If 邏輯條件1 Then
... 程序1
Elseif 邏輯條件2 Then
... 程序2
Else
... 程序3
End If
name Like "*達"
的意思是name
這個字符串的內容是否以“達”結尾,其中“*”爲通配符,可以表示任意長度的任意內容,如果寫成"*達*"
意思就是名字中間是否有"達"。Sheet2.Range("A2").NumberFormatLocal = "0"
是設置數字單元格的顯示格式,例如可以有"0.0"
,"0.##"
,"0.00%"
等各種你想要的格式。這裏的0和#都是一個代號,0代表即便這一位上沒有數字也要顯示一個0;#代表這一位如果有數字就顯示,沒有就不顯示;%結尾會自動轉成百分比顯示,具體可以看Excel的幫助或是這個鏈接:Excel自定義格式。上述代碼中爲了展示不同的格式才這麼寫,實際上整數就用"0"
,兩位小數就用"0.00"
即可。Sheet2.Range("A2") = maleCtr
大家肯定都能猜到了,這是往Sheet2中對應的單元格里填數。這裏Range()
其實可以選多個單元格,就如上面設置格式的時候就用過多選:Sheet2.Range("C2:E2").NumberFormatLocal = "0.00"
。
-
點擊綠色的小三角就可以運行這個程序了,保存程序的時候可能會提示爲無法保存,這時候將Excel文件另存爲帶宏的格式即可,例如xlsm格式。
-
這時,點擊【開發工具】【宏】也能找到我們編寫的宏,點執行就能運行,但我們可以看到,這裏宏的位置爲“ThisWorkbook”,也就是我們打開的這個Excel文件,在別的文件裏是無法運行這個宏的。
-
運行結果如下:
-
如果想調試程序,點擊【調試】【逐語句】即可一行一行運行程序,將鼠標放到對應變量上可以看到它們的值,這樣程序運行結果不對時就可以用於尋找BUG。
全局宏
上面我們提到,通過【Visual Basic】進入編程界面編寫的宏是屬於單個文件或Sheet的,如果我們想編寫一個可以在所有文件中運行的宏要怎麼做呢?下面是具體做法。
- 點擊【開發工具】【錄製宏】
- 宏名稱隨意,保存在必須選擇【個人宏工作簿】,這個工作簿就是這臺電腦共享的宏保存位置,具體位置爲
C:\Users\【用戶名】\AppData\Roaming\Microsoft\Excel\XLSTART
,裏面有一個文件叫PERSONAL.XLSB
。共用的宏就保存在這裏,通過將這個文件發給別人覆蓋對應的文件就可以把共用的宏給別人用了。如果是文件自帶的宏,只需要把Excel文件發給對方就可以,文件已經自包含了。
- 點【確定】,這時可能會提示文件必須打開,那我們就把
PERSONAL.XLSB
這個文件打開後再來一次。 - 這次點【確定】可以錄製了,事實上什麼都無需錄,直接點【停止錄製】即可,我們只想要個殼而已。
- 點擊【宏】,找到我們剛纔錄製的這個宏,點擊【編輯】。
- 我們會看到這個宏保存在【PERSONAL.XLSB】這個分支的【模塊】分支下面,如果是第一次錄製就是【模塊1】,對於我來說是【模塊2】。我們將前面的程序複製一下,然後替換掉這個空的宏裏的所有代碼。
- 僅僅是將代碼複製過來是不夠的,因爲這個宏是共用的,代碼中
Sheet1
等變量的指代不明,不知道是哪個Excel文件中的Sheet1,因此我們做些小的修改。直接查找替換,將Sheet1
都替換成ActiveWorkbook.Sheets(1)
;將Sheet2
都替換成ActiveWorkbook.Sheets(2)
即可。這裏顧名思義,ActiveWorkbook
就是指當前激活的那個Excel文件,因此想在哪個文件運行宏,就從那個文件執行宏即可。記得點保存,最終完整代碼如下:
Sub 分類統計()
Dim maleCtr As Integer '男生人數
Dim femaleCtr As Integer '女生人數
Dim daCtr As Integer '名字以達結尾人數
Dim maleSum As Double '男生總分
Dim femaleSum As Double '女生總分
Dim i As Integer
i = 2
Do While Not IsEmpty(ActiveWorkbook.Sheets(1).Range("A" & i))
Dim name, sex As String
Dim score As Double
name = ActiveWorkbook.Sheets(1).Range("A" & i)
sex = ActiveWorkbook.Sheets(1).Range("B" & i)
score = ActiveWorkbook.Sheets(1).Range("C" & i)
If sex = "男" Then
maleCtr = maleCtr + 1
maleSum = maleSum + score
Else
femaleCtr = femaleCtr + 1
femaleSum = femaleSum + score
End If
If name Like "*達" Then 'like是相似的意思,*爲通配符
daCtr = daCtr + 1
End If
i = i + 1 '下一行
Loop
ActiveWorkbook.Sheets(2).Range("A2").NumberFormatLocal = "0" '設置數字格式爲沒有小數
ActiveWorkbook.Sheets(2).Range("B2").NumberFormatLocal = "0.##" '設置數字格式爲小數點後兩位,非零才顯示
ActiveWorkbook.Sheets(2).Range("C2:E2").NumberFormatLocal = "0.00" '設置數字格式爲小數點後兩位且補零
ActiveWorkbook.Sheets(2).Range("A2") = maleCtr
ActiveWorkbook.Sheets(2).Range("B2") = femaleCtr
ActiveWorkbook.Sheets(2).Range("C2") = daCtr
ActiveWorkbook.Sheets(2).Range("D2") = maleSum / maleCtr
ActiveWorkbook.Sheets(2).Range("E2") = femaleSum / femaleCtr
End Sub
- 在想要執行宏的Excel文件中點擊【宏】,這時就可以看到我們剛纔寫的宏了,點擊【執行】就可以運行。