VBA教學:Function自訂函數用法,Optional預設值如何設計

Excel Weekday函數可以計算某個特定日期是星期幾,預設是從星期天開始起算,和一般直覺不同。本文介紹VBA函數以及Function Optional用法,如何設計一個優化的自定義函數。

一、Excel Weekday

Excel有個蠻好用的Weekday函數,它可以傳回特定日期的星期幾,例如公式:「WEEKDAY(TODAY())」,會重回今天的星期幾,不過今天明明是星期一,公式卻傳回「2」,似乎不合期待。

VBA教學:Function自訂函數用法,Optional預設值如何設計 1

二、函數引數設定

為了瞭解Weekday函數用法,可以叫出「函數引數」視窗,第一個參數是特定日期,在此是利用TODAY函數得到今天的日期,第二個參數是星期幾的計算方法,先前第一步驟省略了第二個參數,省略時預設的是從禮拜天開始,因此函數針對星期一的計算結果便是第一步驟的2,在這裡將第二個參數設定為「2」,從「函數引數」視窗瞭解到其作用是從星期一開始起算,所以計算結果是「1,」比較合乎一般的直覺。

關於Excel引用函數視窗及其他應用技巧,可以參考贊贊小屋相關文章

VBA教學:Function自訂函數用法,Optional預設值如何設計 3

三、VBA Weekday

依照先前兩個步驟的狀況,想要利用VBA程式優化Excel日期函數,因此進入VBA編輯器設計程式。

首先,Excel有Weekday函數,VBA也有同樣名稱而且作用相同的函數,第二個參數也是可以省略,省略的話預設值也是從星期天起算。另外在此同時補充一點,除了以數字設定參數值,在VBA或者VBA程式語言還可以用文字方式,例如這裡看到的「vbMonday」,它的作用等同於「2」,只不過程式碼在設計和閱讀理解而言較為直覺。

注意到程式還用到了VBA函數Date,其作用和Excel的Today函數相同,只是名稱不同。而綜合Weekday及Date兩個VBA函數和Excel相對應函數比較,可得知VBA函數和Excel函數是相互獨立的,常用基本函數都有,名稱不一定會相同。

關於Excel如何進入VBA編輯器,開始設計並執行程式,可以參考贊贊小屋相關文章

VBA教學:Function自訂函數用法,Optional預設值如何設計 5

四、VBA自訂函數

執行上個步驟的程式,果然MsgBox會跳出訊息視窗顯示「今天是期1」。除此之外,VBA的Function函數不但可以在VBA程式中使用,在Excel也可以使用,所以這裡可以看到公式「今天星期幾()」的公式會得到「1」的結果。

一張含有 桌 的圖片

自動產生的描述

五、Function Optional

進一步設計程式,由於 Weekday函數預設從星期天起算,現在想要利用VBA變更預設值,可以使用「Optional」,其作用便是可省略的預設值,然後再進一步設計簡單的判斷語句,利用VBA IsMissing函數檢查是否未設定的機制,如果沒有設定參數的話,預設值是「2」,接著和先前第三步驟同樣用以Weekday函數取得今天的日期。

一張含有 文字 的圖片

自動產生的描述

六、VBA優化函數

上個步驟執行程式的結果,果然沒有設定參數的話會傳回「1」,也就是星期一,不過當然也可以設定參數為「1」,將會得到跟Excel Weekday 函數相同的結果。

VBA教學:Function自訂函數用法,Optional預設值如何設計 9

七、設計理想函數

在VBA Weekday函數用法以及VBA Function結構語法,同時進一步熟悉省略參數預設值的設定,最終設計一個理想中的Weekday函數。

VBA教學:Function自訂函數用法,Optional預設值如何設計 11

八、WeekdayPro函數

在Excel使用 WeekdayPro這個VBA自定義函數,它和Excel的Weekday函數同樣有兩個參數,第一個參數是特定日期,第二個參數可以省略,不過它的預設值是比較希望的2,從星期一開始起算,因此可以說是Excel函數的加強版。

VBA教學:Function自訂函數用法,Optional預設值如何設計 13

VBA Function函數用法

Excel Weekday函數本身已經很好用了,第二個參數值熟悉之後其實並不會造成太大困擾,這篇文章有點大費周章設計一個VBA優化的自定義函數,用意不是真的想提昇多大效率,重點是藉由這個相對簡單並且算是實用的 VBA自定函數設計的過程,更加瞭解VBA Function相關用法,體會到只要經過簡單的程式設計,在很多其他場合可以發揮更大的作用。

每天學習,每天充電:VBA自動化文章合輯