Excel VBA 基礎(02.1)
Excel VBA 基礎(01)部分我們初次接觸到Excel VBA工程並且介紹了變數以及函數的相關知識。
在進入第二部分之前,請確保你已經掌握如下知識點,
- 如何進入VBE並創建以及運行項目?
- 如何添加註釋?
- 解釋器解釋程序的基本順序是怎麼樣的?
- 變數類型有哪些?如何聲明?如何賦值?
- 什麼是變數作用域?
- ByVal以及ByRef有什麼區別?
- 如何定義以及調用一個函數?
- 函數簽名有哪些部分,你知道哪些相關的關鍵字?
接下來的第二部分,我們將重點介紹流程式控制制 以及 常用內置函數。其間會涉及到部分面向對象 以及 Excel對象模型的知識,為以後各章進行一個鋪墊。
上一節,我們講了IF,為流程式控制制開了一個頭。今天我們說一說循環結構之For。
還記得之前 1.4.2 例子: 等差數列製造器 么 (本系列教程中的實例編號規則為,前兩個數字表示所在文章序號,第三個數字指同一文章中例子編號。1.4 指基礎教程1.4, 2 為第二個實例,方便大家查找),試設想如下情況,如果在實際項目中需要列印出前5000個數值,手動操作是幾乎不可能的。因此,我們需要循環結構來幫我們重複相關操作。
For 的結構定義如下
Dim in For i = 初始值 To 結束值 Step 步長值n n Next in
聲明一個循環變數i,
進入循環體, 首先將初始值賦給循環變數,此時,檢查循環變數。
如果步長值大於0時 檢查循環變數是否 小於等於 結束值, 步長小於0 循環變數是否大於等於結束值。如果檢查結果為真,才繼續循環體的執行, 為假結束循環。步長 為1時可以省略。
下面示例中,由於初次檢查為假,循環體內部代碼不會執行,因此不會列印任何結果。
Private Function testFor()n n Dim in n For i = 11 To 10n Debug.Print in Next innEnd Functionn
每次內部代碼執行結束後,循環變數會增加一個 步長值 並重複之前的檢查操作直到檢查結果為假,退出循環。步長值可以為正為負也可以為0。
了解循環基本原理之後我們來改寫1.4.2 例子。列印出前6個數
Private Function testFor()n n Dim in n For i = 1 To 6n Debug.Print i * 3 + 5n Debug.Print String(10, "*")n Next innEnd Functionn
第一次進入循環,i賦值為1,列印結果為 8(1 * 3 + 5)
循環體運行結束, i 增加一個步長,此時步長為默認值1 , i 變為2 由於 2 小於6 ,檢查為真,循環繼續進行,列印出 11(2 * 3 + 5)
依此類推,直到 i = 6 時,循環執行完畢 後, i 增加一個步長,變為7由於大於6,檢查為假,跳出循環(繼續執行循環後面的代碼)。
初學者請按步驟分析程序執行過程,以加深對循環理解。
同理,之前函數體應當是
getVal=3*v+5n
注意:避免在循環體中對循環變數的值進行修改,否則會出現許多意想不到的後果。
試分析如下程序的列印輸出結果。
!!!!千萬不要執行下面程序。如果非要嘗試請確保相關工作表已經存檔。nPrivate Function testFor()n n Dim in n For i = 1 To 10n Debug.Print in i = 4n Next innEnd Functionn
第一次進入循環列印為1,之後賦值為4,結束後增加1,5小於10,繼續循環。列印出5,第二次又被賦值為4,並無限重複上述過程。這就是死循環。惟一解決途徑只有重啟Excel。
請注意,【在嘗試運行VBA項目之前,請務必保存。因為Excel無法撤銷因為運行VBA而發生的改變!以後涉及到文件修改操作之前請預先備份!】
關於編碼習慣,請注意【各個流程式控制制結構內部代碼均應該縮進】
例子2.1.1 試定義函數 printAsterisks(ByVal level As Integer) ,level為列印的層數
當輸入值為5時,在立即窗口列印出如下圖形
* n *** n*****n *** n * n
當輸入值為19時,列印出
* n *** n ***** n ******* n ********* n *********** n ************* n *************** n ***************** n*******************n ***************** n *************** n ************* n *********** n ********* n ******* n ***** n *** n * n
提示 (此題有多種解法,請先嘗試思考,如果你沒有思路可以參考如下提示)
1. 每一行由空格和星號組成,前置和後置的空格與星號的總長度不變
2. 可以先列印出上半部分再列印下半部分
3. 輔助函數簽名如下
返回對應層數的星號數,參數為目標層數nPrivate Function asterisksOnRow(ByVal targetRow As Integer) As Integernn列印出相應的層,參數totalLvl 為總層數, targetRow 為目標層數nPrivate Function printRow(ByVal totalLvl As Integer, ByVal targetRow As Integer)n
此題是入門到初階的分水嶺,所有編程語言教程保留的經典例子。請務必進行作答!
有任何問題請在下方留言。
本專欄所有文章著作權歸屬本人。未經本人書面許可,除知乎日報外,任何人不得轉載。
推薦閱讀:
※VBA逐句注釋:文本透視
※【Excel技巧】- VBA代碼提示運行時錯誤 '1004': 應用程序定義或對象定義錯誤
※64位的excel與32位的excel相比,有哪些優缺點?64位的excel使用體驗如何?
※手把手教你VBA
TAG:MicrosoftExcel | VBA |