Vba第四十三課
關於vba操作工作表、數組、字典等所有的基本功能如果大家仔細去學習、認真敲代碼的話,數據分析應該是入門,當然vba作vb的分支語言,在office的平臺上去運行還是大有作為的,更深層次的功能都相當不錯,而前面的課程所講的功能基本可以定義為少量數據的清洗運算功能,要達到數據分析的水平是遠遠不夠的,比如操作資料庫、自定義函數等等都是數據分析的一些必要技巧,後面也會慢慢上傳教程,今天就講一下自定義函數;
自定義的函數可以在工作表中使用,也可以在VBA過程裡使用,函數其實是一組可重複使用的代碼,可以在程序中的任何地方調用。這消除了一遍又一遍地編寫相同的代碼的需要,這樣能夠將一個大程序劃分成許多小的可管理的功能模塊。
例:
Public Function SfzId(ID) As String
If Len(ID) = 18 Then
SfzId = IIf((Mid(ID, 17, 1) Mod 2) = 0, &34;, &34;)
Else
SfzId = &34;
End If
End Function
代碼解析:
Public Function SfzId(ID) As String
Public表示定義的模塊級變量(也就是SfzId)對外界可見,可以被本模塊和其他模塊使用。而Private定義的模塊級變量,只能用於本模塊,不能被其他模塊調用。一般情況Public用的較多;
Function表示是定義了一個函數,這是自定函數必須要寫的名稱,就像sub一樣約定俗成的;
SfzId 給這個自定義函數起一個名字,不能跟系統已有的函數同名,也不能使用保留的欄位;
(ID)就是這個函數要加的參數,可以是多個,上圖中ID代表的就是要放入函數的參數,也就是身份證號,如果下面的代碼要使用多個參數,這裡也必須定義兩個參數;
If Len(ID) = 18 Then 判斷身份證是否等於18位,如果有運行下面的代碼,沒有就運行else後的代碼,len表示計算ID的長度;
SfzId = IIf((Mid(ID, 17, 1) Mod 2) = 0, &34;, &34;) 表IIF後面運算的值賦給函數名(SfzId);在vba中if可以直接調用,但必須寫成IIF,Mid截取字符,表示從ID也就是身份證號中的第17位後截取1個字符,Mod表示求餘數,也就是mid截取的值除以2,如果沒有餘數表示為0,通過Iff來斷是男是女,我們知道身份證倒數第2位能被2整除就是女性,不能整除就是男性,這樣就通過多個Excel中自帶的函數來進行運算;
在圖中方框中就顯示這個自定義函數可以直接在excel中直接使用,當然在程序中怎麼調用呢;
例:
Sub strSex()
Dim a As Integer
arr = Sheets(1).Range(&34;)
For a = 1 To UBound(arr)
arr(a, 2) = SfzId(arr(a, 1))
Next
Sheets(1).[a2].Resize(UBound(arr), UBound(arr, 2)) = arr
End Sub
如圖:
arr(a, 2) = SfzId(arr(a, 1))這句代碼就是調用了這個自定義函數,當我們有多段代碼,簡單說有多個sub時都要用到這個自定義函數時,就不必要重複寫了,直接調用,然後運行自定義函數中的所有代碼;
如果對自定義函數的參數不是太明白的話,大家可以簡單的做一個求長方形面的自定義函數,也就是長*寬,那麼這裡就要兩個參數(長、寬),自已動手試一試,有問題的話可以留言;
如果覺得有幫助的話記得關注和點讚,有不懂的地方可以私信我,需要表格素材的也可私信給我轉發給你們。
如果各位在實際工作中遇見excel常規方法無法解決的或操作比較複雜的報表可以私信我,可以免費編寫代碼來解決!