VBA與函數(shù)重載
所謂函數(shù)重載是指同一個(gè)函數(shù)名可以對(duì)應(yīng)著多個(gè)函數(shù)的實(shí)現(xiàn)。
例如,可以給函數(shù)名add()定義多個(gè)函數(shù)實(shí)現(xiàn),該函數(shù)的功能是求和,即求兩個(gè)操作數(shù)的和。
其中,一個(gè)函數(shù)實(shí)現(xiàn)是求兩個(gè)int型數(shù)之和,另一個(gè)實(shí)現(xiàn)是求兩個(gè)浮點(diǎn)型數(shù)之和,
再一個(gè)實(shí)現(xiàn)是求兩個(gè)復(fù)數(shù)的和。每種實(shí)現(xiàn)對(duì)應(yīng)著一個(gè)函數(shù)體,這些函數(shù)的名字相同,但是函數(shù)的參數(shù)的類型不同。這就是函數(shù)重載的概念。
函數(shù)重載在類和對(duì)象的應(yīng)用尤其重要。
函數(shù)重載要求編譯器能夠唯一地確定調(diào)用一個(gè)函數(shù)時(shí)應(yīng)執(zhí)行哪個(gè)函數(shù)代碼,即采用哪個(gè)函數(shù)實(shí)現(xiàn)。
確定函數(shù)實(shí)現(xiàn)時(shí),要求從函數(shù)參數(shù)的個(gè)數(shù)和類型上來(lái)區(qū)分。
這就是說(shuō),進(jìn)行函數(shù)重載時(shí),要求同名函數(shù)在參數(shù)個(gè)數(shù)上不同,或者參數(shù)類型上不同。否則,將無(wú)法實(shí)現(xiàn)重載。
如果按這樣的定義,VBA不支持函數(shù)重載!!因?yàn)関ba沒辦法寫同名函數(shù)。也沒有構(gòu)造函數(shù)。那vba能實(shí)現(xiàn)函數(shù)重載同樣的功能嗎?
嘿嘿……
情型1:簡(jiǎn)單的不同數(shù)據(jù)類型的重載功能
function SubA( varA as Variant)
select case varType(varA)
case VBString :
....
case VBInteger,VBLong :
...
end select
End function
情型2:不確定性的參數(shù)
function funA(optional varA,optional varB,……)可選參數(shù)變量只能是variant
if not isming(varA) then
select case varType(varA)
case vbString:
……
case vbInteger,VBlong:
……
end select
else if not isming(varB) then
……
end function
情型3:
function funA (paramarray())
處理數(shù)組參數(shù)情形
end function
情型4:optional中使用數(shù)組 (高難度動(dòng)作)
vba參考寫明optoional是無(wú)法使用數(shù)組作為可選參數(shù)的。
只不過(guò)參考說(shuō)明從來(lái)就是被人用來(lái)突破的。
Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Var() As Any) As Long
dim b(5) as long '隨便定義一個(gè)數(shù)組,二維的也行
function FunA(optional varA as long)
varA=varPtr(b)
如果varA=0是空數(shù)組,非0則一定是數(shù)組。
至于如何通過(guò)varPtr獲得的地址來(lái)獲取數(shù)組值,自己百度一下。
end funtion
情型5:用callbyname來(lái)模擬重載 這個(gè)有點(diǎn)雞肋,意義不大。