概述:VBA中每一個程式都包含過程,錄製的宏是一個過程,一個自定函數也是一個過程。掌握好的單個過程的編寫與思路,就可以組合成大中型外掛程式或者專業程式。
一、分類與調用方式
i. 分類
過程分為三類:子過程、函數過程和屬性過程
1. 子過程
Sub 子過程()
End sub
2. 函數過程
Function 函數過程(rng asRange)
End Function
3. 屬性過程
Property get 屬性過程( ) As Variant
End property
ii. 調用方式
1. 執行 Alt+F8
如果在工作表 ThisWorkBook、標準模組視窗存在sub過程。就可以彈出宏的對話方塊,然後選擇執行
2. 按鈕執行
在工作表中建一個按鈕,並將按鈕與sub過程關聯,從而實現按鈕執行程式。
開發工具---插入--表單控制項---按鈕 然後指定上自己的宏就搞定了
3. 菜單調用
暫無介紹,後續講解
4. 事件引發
對於部分需要自啟動的程式,通常利用事件引發,不需要人工幹預,例如:活頁簿開啟時就自動執行某程式,或者關掉表單,滑鼠移過表單時執行某程式等。後續講解實現。
5. 工作表中使用公式調用
插入模組—然後錄入代碼
Function 成績(rng)
成績 = IIf(rng>= 60, "及格", "不及格")
End Function
在C1的公式寫上=成績(B1)
然後在B1輸入30 則就會顯示不及格
iii. 插入過程方式
1. 非事件程序
首先插入一個模組,再插入過程,然後輸入模組名設定公有的就可以建立過程的外殼了。
2. 事件類別過程
VBA支援很多類事件,大部分事件的代碼都需要參數。可以通過VBE提供的對象與過程視窗的下拉式清單完成
雙擊sheet1 下拉式清單方塊中選擇worksheet代碼視窗預設產生change事件代碼。時間大部分要用下拉式功能表來選擇,不容易誤差
實現滑鼠移過事件
插入---使用者表單 右擊查看代碼 預設產生click事件 選擇為mousmove事件 然後輸入代碼
iv. 過程命名規則
過程名可以與本過程中的私人變數同名,但卻不能和共有變數同名
二、編寫sub過程
Sub過程即利用sub語句聲明的子過程,所有宏錄製起產生的過程全是sub過程,無法通過錄製宏產生function過程或者屬性過程
文法:
Private | public | friend [static]sub name [(arglist)]
[startements]
[exit Sub]
[statements]
End sub
Sub語句各參數的詳細功能
Public 可選的。表示所有模組的所有其他過程都可以訪問這個sub過程。如果在包含Option pirvate的模組中使用,則這個過程在該工程外是不可使用的
Private 可選。表示智能在包含其聲明的模組中的其他過程中可以訪問該sub過程
Friend 可選。智能在類別模組中使用,表示該sub過程在整個工程中都是可見的,但是對對象執行個體的控制著是不可見的
Static 可選的,表示調用時保留sub過程中局部變數的值。Static屬性對sub外聲明的變數不會產生影響,即使過程中使用了這些變數
Name 必須的。 Sub的過程名。
Arglist 可選的,代表在調用時要傳遞給sub過程的參數的變數列表,多個變數則用都好隔開
Statements 可選的。Sub過程中所指定的語句組
v. 模組層級過程
只能在當前模組調用的過程。
聲明sub過程前使用private
只有在當前模組中調用
Private 子程序1(name As String)
MsgBox name
End Sub
Private 子程序2()
Call 過程1("調用過程1")
End Sub
不出現在宏對話方塊中。 在alt+F8所開啟的對話方塊中無法查看到過程的名稱
vi. 工程層級過程
指在當前工程中任何地方都可以隨意調用的過程,在sub語句潛質表示符public,非當前過程可以調用,可以出現在宏列表,如果沒有修飾,則預設是public,任何模組或者表單中都可以調用 支援參數
vii. Exit sub 與end 的作用和區別
是否釋放公有變數
Exit sub 不釋放變數,退出當前過程
End 釋放變數
是否終止所有程式
Exit sub退出當前過程
End 退出當前所有程式。也就是事件已經結束
b) Sub過程的執行流程
i. 逐步執行 按F8逐步執行sub。跳過變數定義語句
ii. 使用冒號實現一行執行多個代碼
Private Sub 一行執行多個代碼()
If 60 = 60 Then MsgBox "及格": Exit Sub
End Sub
iii. 使用標籤改變執行流程
規則:
可是是標點符號以外的符號組合
以冒號結尾
與大小寫無關,必須位於一行的最左端
配合goto
Private Sub 建立總表()
For i = 1 To Sheets.Count
If Sheets(i).name = "總表" ThenGoTo err
Next i
Sheets.Add
ActiveSheet.name = "總表"
End
err:
MsgBox "已經存在總表"
End Sub
iv. Sub過程的嵌套調用方式
1. Call語句調用
[call] name [(argumentlist)] call過程名參數 call可以省略
2. Run方法調用
Application.Run 過程名 Application可以省略
v. 過程的遞迴
Private Sub 建立5張表()
If Sheets.Count > 5Then Exit Sub
Sheets.Add ,Sheets(Sheets.Count), 1
Call 建立5張表
End Sub
設定時鐘:
Sub 時間()
[a1] = WorksheetFunction.Text(Now(), "hh:mm:ss")
Application.OnTime Now() + TimeValue("00:00:01"), "時間"
End Sub
Sub 終止()
Application.OnTime Now() +TimeValue("00:00:01"), "時間", , False
End Sub
c) 過程的案例
i. 選區統計
Sub 選區統計()
Dim msg As String
msg = msg & "儲存格個數"& Selection.Count & Chr(10)
msg = msg & "數字個數"& WorksheetFunction.Count(Selection) & Chr(10)
msg = msg & "非空儲存格"& WorksheetFunction.CountBlank(Selection) & Chr(10)
msg = msg & "選區之和"& WorksheetFunction.Sum(Selection)
MsgBox msg
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Call 選區統計
End Sub
ii. 將儲存格資料轉換成首字母大寫:帶有參數的sub過程
Sub 轉換(target)
Selection(1) = StrConv(target, vbProperCase)
End Sub