Excel VBA编程教程(基础一)(Microsoft)
VBA介紹
Visual Basic for Applications(VBA)是 VisualBasic 的一種宏語言,是微軟開發(fā)出來在其桌面應(yīng)用程序中執(zhí)行通用的自動化(OLE)任務(wù)的編程語言。主要能用來擴展 Windows 的應(yīng)用程序功能,特別是Microsoft Office軟件。
說簡單點,VBA 是運行在 Microsoft Office 軟件之上,可以用來編寫非軟件自帶的功能的編程語言。Office 軟件提供豐富的功能接口,VBA 可以調(diào)用它們,實現(xiàn)自定義的需求。基本上,能用鼠標(biāo)和鍵盤能做的事情,VBA 也能做。
正如前文所述,VBA 可以運行在 Office 軟件上,包括 Excel、Word、PPT、Outlook 等。VBA 語言在 Office 軟件中是通用的,基本語法和用法都相同。但是每一個軟件具有自己獨有的對象,例如 Excel 有單元格對象,Word 有段落對象,PPT 有幻燈片對象。
編寫第一個VBA宏
「宏」:簡單的說,宏是一段可以運行的 VBA 代碼片段。
step one 創(chuàng)建啟用宏的工作簿
首先新建一個工作簿,并將工作簿保存為「啟用宏的工作簿」類型。詳細步驟查看這篇文章。
step two 打開 VBA 編輯器
通過功能區(qū)「開發(fā)工具 → 代碼→Visual Basic」或快捷鍵 Alt + F11 打開 VBA 編輯器。詳細步驟參考這篇文章。
step three
Excel 工作簿中的 VBA 代碼通常保存在工作表對象或模塊中。本例中,我們用模塊保存 VBA 代碼。
首先選中左側(cè)工程列表中的工作簿,后右鍵,在彈出的選項列表中,選擇「插入」。二級菜單中,選擇「模塊」,完成插入新模塊。
插入完成后,在工程列表對應(yīng)工作簿內(nèi),在模塊文件夾下,顯示新插入的模塊。新插入的模塊的默認名稱是,模塊 x,本例中是模塊1。在屬性窗口,可以修改模塊的名稱。
step four 打開模塊
雙擊上一步插入的模塊1,在右側(cè)代碼窗口區(qū)域里,將打開模塊1的代碼編輯器。在右側(cè)代碼窗口中當(dāng)前打開的代碼編輯器所對應(yīng)的模塊,在編輯器標(biāo)題末尾可以看到。
step five 創(chuàng)建一個宏(VBA 過程)
在代碼編輯窗口中,輸入以下代碼:
Sub MyCode()
End Sub
這段代碼是一個空的 VBA 過程,只有開始和結(jié)束。過程的其他代碼,都在這中間編寫。
其中 Sub 是 Subroutine 的縮寫,直譯過來是子程序。在 VBA 中表示一個過程,也是代表一個過程的開始。下一行 End Sub 表示過程的結(jié)束。
step six 編寫 VBA 過程實體部分
過程的實體部分指的是,真正會被執(zhí)行的部分。上一步創(chuàng)建的是一個空的 VBA 過程,里面不包含實體代碼。雖然可以正常運行,但是不會有結(jié)果輸出。
這一步我們編寫 VBA 過程的實體部分。將如下代碼輸入到過程的開始和結(jié)束處之間。
MsgBox "Hello World"
step seven 運行代碼
現(xiàn)在我們已經(jīng)寫完了一個完整的 VBA 過程,現(xiàn)在運行它,看一下結(jié)果。
將光標(biāo)放置在代碼的任何一處,點擊工具欄上的運行「▶ 」按鈕,或按 F5,運行代碼。
可以看到運行結(jié)果,Excel 彈出一個對話框,顯示內(nèi)容正是在代碼中編寫的內(nèi)容。
認識VBA編輯器
編輯器中每個模塊的基本用法如下:
- 工具欄:編輯器命令欄,與 Excel 功能區(qū)域類似,包含 Excel VBA 開發(fā)相關(guān)的命令。
- VBA 工程:顯示當(dāng)前 VBA 工程包含的所有對象。通常,一個工作簿就是一個 VBA 工程,其中包括 Excel
對象、工作表對象、模塊等。 - 屬性窗口:查看和設(shè)置選中對象的屬性的窗口。
- 代碼編輯窗口:實際編寫代碼的位置。編寫、修改、保存代碼,都在這里進行。
- 立即窗口:代碼運行過程中,打印出的內(nèi)容,在立即窗口中顯示。一般用于調(diào)試代碼。
管理VBA工程
通常,一個工作簿就是一個 VBA 工程,其中包括 Excel 對象、工作表對象、模塊等。當(dāng)多個工作簿同時打開時,他們公用同一個 VBA 編輯器,VBA 工程界面顯示所有的 VBA 工程。
插入/刪除模塊
在一個 VBA 工程中想要插入新的模塊時,可在 VBA 工程右鍵,選擇插入類型即可。
要刪除模塊,選中模塊,右鍵,選擇「移除 模塊」
語法介紹
程序結(jié)構(gòu)示例
首先,本篇將使用以下代碼,介紹各種程序結(jié)構(gòu),大家可以先看一下。
Sub MyCode()
'聲明循環(huán)變量和是否為空變量
Dim i As Integer
Dim isBlank As Boolean
'循環(huán) A2-A10 單元格
For i = 2 To 10
'存儲單元格是否為空的結(jié)果
isBlank = Cells(i, 1).Value = ""
'如果為空,則用上方的單元格的值填充當(dāng)前單元格
If isBlank Then
Cells(i, 1) = Cells(i - 1, 1)
End If
Next i
End Sub
以上代碼運行后,在 A2:A10 單元格區(qū)域,依次判斷每一個單元格是否為空,如果是空,則用上一個單元格的值填充。
過程
過程是 VBA 中,程序?qū)嶋H運行的最小結(jié)構(gòu)。單獨的一行或多行代碼無法運行,必須把它們放置在一個過程里,才能運行。
在示例中,Sub 過程名() 開頭,End Sub 為結(jié)尾部分是一個過程的主題,其余代碼需要放置在兩者之間。
Sub MyCode()
End Sub
程序語句
語句,是表示一個完整意思的一行代碼。
例如,示例中第一行,聲明變量就是一條語句。它表示,聲明一個整型變量。同理,第二行、第三行和其余的每一行都是語句。VBA 中的過程,就是由這樣一條條語句構(gòu)成的。
Dim i As Integer
Dim isBlank As Boolean
通常,一行就是一個語句,除非它用換行符或合并符號.
Excel VBA 對象
我們學(xué)習(xí) VBA 的最終目的是操縱 Excel,完成一些特定的目標(biāo)。其中,操縱 Excel 就是通過 Excel VBA 對象完成的。
在示例中,Cells() 就是一個 Excel VBA 對象,表示一個單元格,提供行號和列號指定單元格。
程序運行結(jié)構(gòu)
接下來是程序結(jié)構(gòu)中最核心的部分,也是最有意思的部分,程序運行結(jié)構(gòu)。大部分編程語言都具備基本的三種程序運行結(jié)構(gòu),分別是順序結(jié)構(gòu)、循環(huán)結(jié)構(gòu)、判斷結(jié)構(gòu)。各種簡單到復(fù)雜的算法,都是由這三種基本的結(jié)構(gòu),相互組合而完成。
1.順序結(jié)構(gòu)
首先是基本的順序結(jié)構(gòu)。順序結(jié)構(gòu),顧名思義就是按照順序依次執(zhí)行。VBA 中的順序就是從上到下、從左到右的順序。
在示例中,首先運行兩個聲明語句,然后運行循環(huán)結(jié)構(gòu),以此類推。值得注意的事,當(dāng)程序有嵌套時,嵌套的部分也是按照順序指定的。
2.循環(huán)結(jié)構(gòu)
第二個基本結(jié)構(gòu)是循環(huán)結(jié)構(gòu)。當(dāng)使用循環(huán)結(jié)構(gòu)時,循環(huán)部分代碼,按照指定的循環(huán)次數(shù),循環(huán)重復(fù)執(zhí)行。
在我們的示例中,F(xiàn)or 至 Next i 之間的代碼就是一個循環(huán)代碼。
VBA 中,有多種循環(huán)結(jié)構(gòu),本例中是 For 循環(huán)結(jié)構(gòu)。For 循環(huán)結(jié)構(gòu)中,第一行指定循環(huán)次數(shù),最后一行表示開始下一個循環(huán)。
'循環(huán)開始
For i = 2 To 10
'這里是循環(huán)的代碼
Next i
3.判斷結(jié)構(gòu)
最后一種基本結(jié)構(gòu)是,判斷結(jié)構(gòu)。簡單來說,該結(jié)構(gòu)中,當(dāng)提供的表達式為真(True)時,判斷結(jié)構(gòu)的主體部分才會被執(zhí)行,否則跳過。
在示例代碼中,If 開頭和 End If 結(jié)尾處是典型的判斷結(jié)構(gòu)。第一行,判斷 isBlank 變量是否為真,如果是,則執(zhí)行判斷結(jié)構(gòu)主體部分,否則跳過。
'如果為空,則用上方的單元格的值填充當(dāng)前單元格
If isBlank Then
Cells(i, 1) = Cells(i - 1, 1)
End If
運行
下面,我們實際運行我們的示例代碼,看一看它具體的效果。
Excel 是一個對象,這個對象包含很多屬性和子對象,而 VBA 是可以操作這些對象的工具,實現(xiàn)各種各樣的效果。例如,Excel 包括 Range 對象,即單元格對象,使用 VBA 可以改變單元格對象的填充顏色屬性。用代碼表示如下。
'A1 單元格的填充顏色設(shè)置為顏色號為 49407 的顏色
Range("A1").Interior.Color = 49407
- Range(“A1”)、Interior、Color 等是 Excel 具備的對象和屬性;
- 對象和屬性的操作,是通過 VBA 語言實現(xiàn)的,即上面是一行 VBA 代碼。中間的等號(=)是 VBA 語言的賦值符號,也是能改變單元格填充顏色的關(guān)鍵所在。
變量
變量是存儲數(shù)據(jù)的一種表達方式。在程序開始,可以聲明一個變量,指定變量的類型(數(shù)字、文本、邏輯值等),并給變量賦值。在程序其他地方,就可以用該變量,使其存儲的值參與運算。
'聲明一個文本類型的變量
Dim val As String
'給 val 變量賦值,即 "Hello World"
val = "Hello World"
'在 A1 單元格寫入 val 變量存儲的數(shù)據(jù)
Range("A1").Value = val
數(shù)組
組表示一組同類型的數(shù)據(jù)的集合,是 VBA 中最重要的概念之一。以下面的代碼為例:
'創(chuàng)建數(shù)組
Dim Val(1 to 4) As String
'給數(shù)組的元素賦值
Val(1) = "Excel"
Val(2) = "Word"
Val(3) = "PowerPoint"
Val(4) = "Outlook"
基礎(chǔ)運算符
使用 VBA 開發(fā)某項功能,本質(zhì)上是,對變量進行基礎(chǔ)的運算和操作,例如加減乘除比較等。為此,VBA 提供了很多運算符和操作符,利用它們可以實現(xiàn)復(fù)雜的運算。
今天先學(xué)習(xí) VBA 提供的基礎(chǔ)運算符和操作,以及它們的基本用法。VBA 運算符可以分為以下 6 類:
- 賦值運算符
- 算數(shù)運算符
- 比較運算符
- 邏輯運算符
- 連接運算符
- 其他運算符
VBA 中的連接運算符用于連接 2 個或多個文本。其用法與 Excel 公式中的 & 符號相同。
連接操作符
| 運算符 | 說明 | 示例 |
|---|---|---|
| & | 連接兩個文本 | “Zhang” & ” ” & “San” -> “Zhang San” |
其他操作符
| 運算符 | 說明 |
|---|---|
| _ (下劃線) | 將一行代碼分解成兩行 |
| : ( 英文冒號) | 將兩行代碼放置在一行 |
比較運算符
比較運算符,比較提供的兩個變量,如果符合比較條件,返回 True,否則,返回 False。
假設(shè) a = 10,b = 3,-> 表示結(jié)果。
| 運算符 | 說明 | 示例 |
|---|---|---|
| = | 比較兩個值是否相等 | a = b -> False |
| > | 大于 | a > b -> True |
| >= | 大于等于 | a >= b => False |
| < | 小于 | a < b -> False |
| <= | 小于等于 | a <= b -> False |
| <> | 不等于 | a <> b -> True |
- VBA 運算符基礎(chǔ)教程(加減乘除+高級操作)
- VBA 數(shù)據(jù)類型基礎(chǔ)教程(程序更高效、更精準(zhǔn))
注釋
通常,一段代碼寫完后,不會完全沒問題。在實際使用過程中可能需要修改,符合最新的需求。過一段時間再打開查看時,可能已經(jīng)忘記了當(dāng)時的思路,不能很快想起來有些代碼實際的用途,更不用說讓別人查看了。這時,就需要注釋出場了。
注釋是對代碼的一種解釋,不影響代碼的運行。VBA 中的注釋語句是,以英文單引號 (')開頭,后接需要解釋說明的內(nèi)容。
選擇結(jié)構(gòu)
if Then 結(jié)構(gòu)
選擇結(jié)構(gòu)中,If Then 結(jié)構(gòu)是最基礎(chǔ)的一個。它只有條件表達式真時,執(zhí)行的代碼。
If Then 結(jié)構(gòu)基本語法如下,其中 End If是選擇結(jié)構(gòu)的結(jié)束標(biāo)志。
If 條件表達式 Then
'表達式為真時,執(zhí)行的代碼
End If
現(xiàn)在我們看實際的例子,判斷學(xué)生是否及格,及格條件是成績 ≥60。如果及格,在C列對應(yīng)單元格填寫“及格”。具體代碼如下:
Sub MyCode()
Dim i As Integer
For i = 2 To 10
If Cells(i, "B").Value >= 60 Then
Cells(i, "C") = "及格"
End If
Next i
End Sub
我們可以看到,我們使用 B 列中的學(xué)生成績與 60 分比較,如果≥60分,就在 C 列填寫及格。
條件表達式是 Cells(i, "B").Value >= 60,選擇性執(zhí)行的代碼部分是 Cells(i, "C") = "及格"。
其中,F(xiàn)or 語句是表示循環(huán)結(jié)構(gòu),這里只需知道程序從第一個學(xué)生循環(huán)到最后一個學(xué)生,依次判斷每個學(xué)生的成績。循環(huán)結(jié)構(gòu)將在下一篇中做詳細介紹。
將以上代碼運行后,可以看到運行結(jié)果如下:
If Else 結(jié)構(gòu)
很多時候,我們根據(jù)表達式的真假,真時執(zhí)行一塊代碼,假時執(zhí)行另一塊代碼。這種需求可以使用 If Else結(jié)構(gòu)實現(xiàn)。
If Else結(jié)構(gòu)中,條件表達式在真時,執(zhí)行Then后的代碼;條件表達式為假時,執(zhí)行 Else后的代碼。基本語法如下:
If 條件表達式 Then
'真時執(zhí)行的代碼
Else
'假時執(zhí)行的代碼
End If
我們繼續(xù)看實際的例子。在上一個例子的基礎(chǔ)上,這次對不及格的學(xué)生,在C列填入不及格。代碼如下:
Sub MyCode()
Dim i As Integer
For i = 2 To 10
If Cells(i, "B").Value >= 60 Then
Cells(i, "C") = "及格"
Else
Cells(i, "C") = "不及格"
End If
Next i
End Sub
在這個例子中,條件表達式 Cells(i, "B").Value >= 60為假時,表示學(xué)生成績低于60分,即不及格。這時就執(zhí)行 Else后的代碼。
程序運行結(jié)果如下:
循環(huán)結(jié)構(gòu)
VBA 中程序循環(huán)結(jié)構(gòu)基礎(chǔ),以及多種循環(huán)結(jié)構(gòu)形式。包括子類在內(nèi),VBA 中常使用的循環(huán)結(jié)構(gòu)包括 6 種,它們是:
| 循環(huán)結(jié)構(gòu) | 說明 |
|---|---|
| For … Next 循環(huán) | 按指定次數(shù)循環(huán)執(zhí)行 |
| For Each 循環(huán) | 逐一遍歷數(shù)據(jù)集合中的每一個元素 |
| Do While … Loop 循環(huán) | 當(dāng)條件為真時,循環(huán)執(zhí)行 |
| Do … Loop While 循環(huán) | 當(dāng)條件為真時,循環(huán)執(zhí)行。無論條件真假,至少運行一次 |
| Do Until … Loop 循環(huán) | 直到條件為真時,循環(huán)執(zhí)行 |
| Do … Loop Until 循環(huán) | 直到條件為真時,循環(huán)執(zhí)行。無論條件真假,至少運行一次 |
此外,學(xué)習(xí)了兩種跳出循環(huán)的語句,它們是:
| 跳出語句 | 說明 |
|---|---|
| Exit For | 跳出 For 循環(huán) |
| Exit Do | 跳出 Do While/Until 循環(huán) |
本文介紹兩個常用的循環(huán)
For 循環(huán)
- For … Next 循環(huán)
使用 For ... Next循環(huán)可以按指定次數(shù),循環(huán)執(zhí)行一段代碼。For 循環(huán)使用一個數(shù)字變量,從初始值開始,每循環(huán)一次,變量值增加或減小,直到變量的值等于指定的結(jié)束值時,循環(huán)結(jié)束。
For ... Next 循環(huán)語法如下:
For [變量] = [初始值] To [結(jié)束值] Step [步長]
'這里是循環(huán)執(zhí)行的語句
Next
其中:
- [變量] 是一個數(shù)字類型變量,可在循環(huán)執(zhí)行的語句里使用。
- [初始值] 和 [結(jié)束值] 是給定的值;
- [步長] 是每次循環(huán)時,變量的增量。如果為正值,變量增大;如果為負值,變量減小。
下面看一個實際的例子,求 1 至 10 數(shù)字的累積和。
Sub MyCode()
Dim i As Integer
Dim sum As Integer
For i = 1 To 10 Step 1
sum = sum + i
Next
End Sub
可以看到,F(xiàn)or 循環(huán)使用i變量,循環(huán) 10 次,i 的值從 1 到 10 變化。
值得注意的是,For 循環(huán)的 Step 值如果是 1,則 Step 關(guān)鍵詞可省略。上述過程循環(huán)部分可寫成如下方式:
For i = 1 To 10
sum = sum + i
Next
- Do While 循環(huán)
Do While循環(huán)用于滿足指定條件時循環(huán)執(zhí)行一段代碼的情形。循環(huán)的指定條件在 While關(guān)鍵詞后書寫。
Do While … Loop循環(huán),根據(jù) While 關(guān)鍵詞后的條件表達式的值,真時執(zhí)行,假時停止執(zhí)行。基本語法如下:
Do While [條件表達式]
'循環(huán)執(zhí)行的代碼
Loop
其中,只要 [條件表達式] 為真,將一直循環(huán)執(zhí)行。[條件表達式] 一旦為假,則停止循環(huán),程序執(zhí)行 Loop 關(guān)鍵詞后的代碼。
看一個實際的例子,還是求 1- 10 累積和。
Sub MyCode()
Dim i As Integer
Dim sum As Integer
i = 1
Do While i <= 10
sum = sum + i
i = i + 1
Loop
End Sub
i變量的初始值是 1,根據(jù) While 后的條件,只要 i 變量小于等于 10,后續(xù)的代碼就可以一直循環(huán)執(zhí)行。
這里為了演示使用了 Do While 循環(huán),實際情況下,這種求和問題,使用 For 循環(huán)更簡潔。
With 結(jié)構(gòu)語法
With 結(jié)構(gòu)由 With 和 End With 兩個語句構(gòu)成,對象的屬性和方法都寫在兩者之間。基本語法如下:
With [對象]
.[屬性] = [數(shù)據(jù)]
.[方法]
'其他屬性和方法
End With
With 結(jié)構(gòu)里,對象的屬性和方法均有點 (.)符號開始,后接對象的屬性名和方法名。
With 結(jié)構(gòu)實例
現(xiàn)在看一個實際的例子,需要將工作簿中 Sheet1 工作表設(shè)置新名稱,然后設(shè)置標(biāo)簽顏色為黑色,最后隱藏工作表。
如果不用 With 結(jié)構(gòu),代碼如下:
Sub MyCode()
Worksheets("Sheet1").Name = "新名稱"
Worksheets("Sheet1").Tab.ThemeColor = xlThemeColorLight1
Worksheets("Sheet1").Visible = xlSheetHidden
End Sub
可以看到,每個語句都重復(fù)寫 Worksheets(“Sheet1”) 部分。
使用 With 結(jié)構(gòu),可以避免重復(fù)寫同一個對象名,代碼如下:
Sub MyCode()
With Worksheets("Sheet1")
.Name = "新名稱"
.Tab.ThemeColor = xlThemeColorLight1
.Visible = xlSheetHidden
End With
End Sub
復(fù)制實例
本實例實現(xiàn)的是把很多excel表格的一些數(shù)據(jù)單元復(fù)制到一個新的文檔上。
Sub 合并當(dāng)前目錄下所有工作簿的全部工作表()
Dim MyPath, MyName, AWbName
Dim Wb As Workbook, WbN As String
Dim G As Long
Dim Num As Long
Dim BOX As String
Application.ScreenUpdating = False
MyPath = ActiveWorkbook.Path
MyName = Dir(MyPath & "\" & "*.xls")
AWbName = ActiveWorkbook.Name
Num = 0
Do While MyName <> ""
If MyName <> AWbName Then
Set Wb = Workbooks.Open(MyPath & "\" & MyName)
Num = Num + 1
With Workbooks(1).ActiveSheet
.Cells(.Range("A65536").End(xlUp).Row + 2, 1) = Left(MyName, Len(MyName) - 4)
'For G = 1 To Sheets.Count
Wb.Sheets(1).Range("A3:E3").Copy .Cells(.Range("A65536").End(xlUp).Row + 2, 1)
Wb.Sheets(1).Range("C9:D18").Copy .Cells(.Range("A65536").End(xlUp).Row + 2, 1)
'Next
WbN = WbN & Chr(13) & Wb.Name
Wb.Close False
End With
End If
MyName = Dir
Loop
Range("A1").Select
Application.ScreenUpdating = True
MsgBox "共合并了" & Num & "個工作薄下的全部工作表。如下:" & Chr(13) & WbN, vbInformation, "提示"
End Sub
總結(jié)
以上是生活随笔為你收集整理的Excel VBA编程教程(基础一)(Microsoft)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 南通州北通州通南北州的下联
- 下一篇: SAP Analytics Cloud连