Excel VBA 基礎(01.3)

多謝大家的關注與鼓勵,你們的認可是我寫作的動力。

周末加班的間隙來趕進度,爭取在2018年7月結束前寫完所有基礎篇以及實戰篇的內容。3月中到4月末由於審計外勤,寫作計劃可能會受到影響。目前趁工作尚可應付的時候,想加快些進度。以後更新頻率可能會放慢,還請大家諒解。但是作為一個有理想的專欄作者,我是絕對不回棄坑的。

上期我們說到VBA項目,以及Sub和函數。本節我們將介紹數據類型以及變數定義的概念。

1 數據類型

1.1 數據類型定義模式

變數類型定義n Dim 變數名稱 As 數據類型 (可以是String, Integer, Object以及等等自定義的類型)nDim productName As StringnDim length As IntegernDim reg As RegExpnn 函數中參數以及返回值類型定義 n 無返回值函數n [Public|Private] Function 函數名(參數 As 數據類型)nPublic Function MsgBox(msg As String) 當然實際上的MsgBox是有返回值的n 有返回值函數n [Public|Private] Function 函數名(參數 As 數據類型) As 返回值數據類型nPublic Function len(s as String) As Longn

數據類型基本類型和引用類型(即Object類)。

常用的基本類型有 字元串類型,String,

以及時間類型 Date

還有各種數值類型, 整型 Integer , 長整型 Long,

浮點數類型 Float 以及 Double

布爾類型 Bool 即邏輯真假, 只有兩個實例 True 和 False

引用類型也稱為對象。以後再進行詳細介紹。

為了避免使講解過於學術,現在只需掌握如下要點即可,細節後續進行補充

  • 字元串,即通常意義上的文本型變數,如工作表名稱,文件路徑名稱,會計科目名稱,科目代碼(雖然會計科目代碼為通常以數字表示但一般不認為是數值類型。將兩個科目代碼相加有意義么?)。【字面量(即在程序中定義時)表示字元串時一定要加" "】, 即 "1" 代表字元串,1 為數值類型;字面量 qiou為某個變數或函數名 而 "qiou" 則為字元串。
  • Integer 只能放小於35000的整數,超過這個範圍請使用Long
  • 同樣的道理,帶小數點的數 Double的範圍要遠遠廣於Float
  • Bool類型中,0與False等同,其他非零數值與True等同 (vlookup 函數最後一個參數因此可以寫0,此時0與False等同)

1.2 數據類型的意義

變數可以理解為暫時存放運算數據的一個容器,而數據類型的作用是將這些容器事先分類,方便VBE解釋器進行相應操作。並且每種數據類型對應的模式各不相同,譬如 1 + 0.5 等於1.5 是有意義的,因為相加(+也可以看成是一種函數)默認兩個參數類型均應為數值類型(Number), 如果 1 + "狗", 則會因為不符合函數參數的數據類型定義而報錯。這也是上文函數參數定義數據類型的原因。

1.3 實例

請看如下例子

1.3.1 試定義一個函數,要求接收兩個字元串, 並返回較長的那一個的長度

首先分析函數簽名(即函數定義的第一行),並且取一個有意義的名字。

  • 輸入參數為兩個字元串,接收參數為 str1 As String, str2 As String
  • 同時返回值為長度,即屬於數值類型, 用Integer

return the length of the longer stringnPrivate Function getLongerStringLen(str1 As String, str2 As String) As IntegernnnEnd Functionn

接下來,寫函數體。分析業務邏輯(即處理問題的基本思路),1. 取得兩個字元串長度放入兩個數值變數 2.比較兩個數值變數大小並返回較大的一個

字串長度的函數之前介紹過 len(), 在講流程式控制制之前先使用另外一個函數 iif(判斷,為真的返回值,為假的返回值),有過Excel使用經歷的朋友們會驚奇地發現這和公式中的IF函數完全一樣。

Option ExplicitnnPublic Sub main()n n Debug.Print getLongerStringLen("qiou.eu", "sgfxq")n nEnd Subnn return the length of the longer stringnPrivate Function getLongerStringLen(str1 As String, str2 As String) As Integernn length of str1n Dim l1 As Integern n length of str2n Dim l2 As Integern n get length of str1n l1 = Len(str1)n n get length of str2n l2 = Len(str2)n n return the length of longer stringn getLongerStringLen = IIf(l1 > l2, l1, l2)nnEnd Functionn

現在簡單解釋, 看函數體,先定義兩個整型變數 l1 l2來裝 兩個字元串的值。

= 為賦值,即,將等號右邊的值賦予等號左邊的變數,注意萬萬不要與數學中的等號混淆。

return the length of longer stringn getLongerStringLen = IIf(l1 > l2, l1, l2)n

再來看返回值,對於剛接觸VBA的朋友來說可能會有些難度。我們來分析,先看等號右邊。IIF表示,如果 l1 大於 l2 則返回 l1, 如果 l1 小於等於l2 則返回l2,即始終返回兩者中最大值。再結合上述定義,l1 l2 分別為兩字元串的長度。問題解決。

當然Application.WorksheetFunction.Max()會更加簡潔,但是為了串聯知識點以及為以後章節鋪墊,這裡採用IIf函數。

入口函數中,我們寫一個簡易的測試(實際開發一般寫在單獨Module里),

【Debug.Print 是實戰中最最常用功能之一,它會將參數值列印到 立即窗口】

(立即窗口 的操作不懂?出門右轉看本系列教程0 )

這時它會列印出 7 , 即"qiou.eu"的長度。

再來說一說編程習慣,

【函數體一律縮進(選中整個函數體按 Tab鍵)】

【函數體命令之間注意空行】

【添加必要注釋。代碼維護以及分工協作會變得更加容易】

【首行必寫 Option Explicit】

還記得之前說過的首行必寫 Option Explicit 么,你可以嘗試注釋掉 l1的變數聲明(即在該行前加上 , 使之成為注釋,無法被解釋器執行) ,再運行main會發生什麼?

length of str1n Dim l1 As Integern

這時你再注釋掉第一行的 Option Explicit,運行後一切是不是又恢復正常了?

接著,假設你在開發過程中不小心將 l2 = Len(str2) 誤寫為 l1 = Len(str2),(試想實戰中動輒上千行的項目,打錯一個字母是很常見的事)

Option ExplicitnnPublic Sub main()n n Debug.Print getLongerStringLen("qiou.eu", "sgfxq")n nEnd Subnnn return the length of the longer stringnPrivate Function getLongerStringLen(str1 As String, str2 As String) As Integernn length of str1n Dim l1 As Integern n length of str2n Dim l2 As Integern n get length of str1n l1 = Len(str1)n n get length of str2 ##!!!!!! ERROR HERE !!!!!!n l1 = Len(str2)n n return the length of longer stringn getLongerStringLen = IIf(l1 > l2, l1, l2)nnEnd Functionn

你會發現詭異的事情發生了。列印返回值不再是7,你開始懷疑人生...

因為聲明變數之後,自動為該變數賦此變數所屬數據類型的默認值。由於l2 只是經過聲明,而沒有賦值,因此被賦予Integer類的默認值0,故小於l1。

藉以上例子說明編程習慣的重要性。

習慣決定你能走多遠。之前一直聽人說Python的動態語言模式根本不適用於大型項目開發,直到我拜讀過SQLalchemy的源碼,才明白制約開發者的並不是語言本身(因為任何圖靈完備的語言在理論上都能實現相同的功能),而是習慣與能力。

1.3.2 封裝與復用: 試在1.3.1的基礎上編寫 接收3個字元串參數的函數,並返回最長字元串長度。要求調用 1.3.1中的函數。

請大家務必預先嘗試,歡迎給出你們的代碼。

解析留待下期。

有任何問題請在下方留言。

本專欄所有文章著作權歸屬本人。未經本人書面許可,除知乎日報外,任何人不得轉載。


推薦閱讀:

Excel中如何製作雙層餅圖
如何解決Power BI在線版和本地版的時區差異問題
百分比堆積柱形圖
不為人知的Excel轉壓縮包逆天功能
PQ補充說明

TAG:MicrosoftExcel | VBA |