日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

vba传值调用_VBA传递参数步骤

發(fā)布時(shí)間:2023/12/8 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vba传值调用_VBA传递参数步骤 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

到目前為止,你已經(jīng)創(chuàng)建了簡(jiǎn)單的可以執(zhí)行具體任務(wù)的VBA過(guò)程,這些過(guò)程在它們運(yùn)行前沒(méi)有要求你提供額外的數(shù)據(jù)。然而,在現(xiàn)實(shí)生活中,過(guò)程(子程序和函數(shù))經(jīng)常需要參數(shù)。參數(shù)(自變量)是過(guò)程工作時(shí)需要的一個(gè)或多個(gè)數(shù)值。參數(shù)通常輸入在括號(hào)之間,多個(gè)參數(shù)用逗號(hào)分割開(kāi)來(lái)。使用Excel有一陣了,你已經(jīng)知道Excel內(nèi)置函數(shù)根據(jù)你提供的數(shù)據(jù)可能產(chǎn)生不同的結(jié)果。例如,如果單元格A4和A5分別含有數(shù)字5和10,加和公式=SUM(A4:A5)將會(huì)返回15,除非你更改單元格里面的數(shù)值。正如你可以傳遞數(shù)值給Excel內(nèi)置函數(shù),你也可以傳遞數(shù)值給自定義VBA過(guò)程。

現(xiàn)在,我們來(lái)看看如何從子程序傳遞數(shù)值給函數(shù)SumItUp。這個(gè)自定義函數(shù)目的是計(jì)算一個(gè)人的姓和名的字母數(shù)目。

1.在放置函數(shù)SumItUp的模塊里輸入下列子程序NumOfCharacters:

Sub NumOfCharacters()

Dim f As Integer

Dim l As Integer

f = Len(InputBox("Enter first name:"))

l = Len(InputBox("Enter last name:"))

MsgBox SumItUp(f,l)

End Sub

2. ?將光標(biāo)放在過(guò)程N(yùn)umOfCharacters的任意地方并按下F5。VB將顯示信息輸入框問(wèn)你名字,這個(gè)信息框由下面的函數(shù)產(chǎn)生:

InputBox("Enter first name:")

3. ?輸入任何名字,回車,VB接受你輸入的文本并且將它作為一個(gè)參數(shù)傳遞給函數(shù)Len。函數(shù)Len計(jì)算提供的文本的字母數(shù)目。VB將函數(shù)Len的結(jié)果儲(chǔ)存于變量f以供以后使用。這之后,VB顯示下一個(gè)信息框,這次是問(wèn)你的姓。

4. ?輸入任何姓,回車。VB將輸入的姓傳遞給函數(shù)Len來(lái)獲得姓的文本長(zhǎng)度,然后數(shù)值儲(chǔ)存于變量l。接下來(lái)發(fā)生什么呢?VB遇到了函數(shù)MsgBox,這個(gè)函數(shù)告訴VB顯示函數(shù)SumItUp的結(jié)果。然而,因?yàn)檫@個(gè)結(jié)果還沒(méi)有準(zhǔn)備好,VB很快就跳到函數(shù)SumItUp里,使用變量f和l儲(chǔ)存的數(shù)值來(lái)做計(jì)算。在函數(shù)內(nèi)部,VB用變量f的值取代參數(shù)m和變量l值取代參數(shù)n。一旦取代工作完成,VB將兩個(gè)數(shù)值加和起來(lái),并且將結(jié)果返回給函數(shù)SumItUp。函數(shù)SumItUp內(nèi)部沒(méi)有其它的任務(wù)了,因此,VB又馬上返回子程序并且將函數(shù)SumItUp的結(jié)果作為一個(gè)參數(shù)提供給函數(shù)MsgBox。現(xiàn)在這個(gè)信

息出現(xiàn)在屏幕上,顯示了字母總數(shù)目。

5. ?點(diǎn)擊確定退出信息框,你可以多次運(yùn)行過(guò)程N(yùn)umOfCharacters,每次輸入不同的姓名。我們來(lái)看看另外一個(gè)使用變量傳遞參數(shù)的例子:

1. ?在工程MyFunctions (Chap04.xls)里添加一個(gè)新模塊,并重命名為Sample2

2. ?激活模塊Sample2并且輸入子程序EnterText:

Sub EnterText()

Dim m As String, n As String, r As String

m = InputBox ("Enter your first name:")

n = InputBox("Enter your last name:")

r = JoinText(m, n)

MsgBox r

End Sub

3. ?輸入下述函數(shù)過(guò)程:

Function JoinText(k,o)

JoinText = k + " " + o

End Function

4. ?運(yùn)行過(guò)程EnterText

VB執(zhí)行語(yǔ)句時(shí),它收集用戶輸入的數(shù)據(jù)并且將這些數(shù)據(jù)儲(chǔ)存在變量m和n上,然后傳遞這些數(shù)據(jù)到函數(shù)JoinText。VB將這些變量的值取代函數(shù)JoinText的參數(shù),并且將結(jié)果賦到函數(shù)名稱(JoinText)上。當(dāng)VB返回過(guò)程EnterText時(shí),函數(shù)的值儲(chǔ)存于變量r。然后,函數(shù)MsgBox在信息框里顯示變量r的內(nèi)容。結(jié)果就是用戶的完整姓名(姓和名用空格分開(kāi))。要從函數(shù)傳遞數(shù)值給子程序,需要將該值賦到函數(shù)名稱,例如,下面的函數(shù)NumOfDays將值7傳遞到子程序DaysInAWeek:

Function NumOfDays()

NumOfDays = 7

End Function

Sub DaysInAWeek()

MsgBox "There are " & NumOfDays & " days in a week."

End Sub

技巧:函數(shù)過(guò)程不能做什么

函數(shù)過(guò)程不能進(jìn)行任何動(dòng)作,例如,它們不能在工作表里做插入,刪除或設(shè)置數(shù)據(jù)格式操作,不能打開(kāi)文件,或改變屏幕顯示樣式

明確參數(shù)類型

在前面的部分,你學(xué)習(xí)了函數(shù)根據(jù)它們自變量傳遞的值進(jìn)行計(jì)算,當(dāng)你聲明函數(shù)時(shí),你將參數(shù)名稱列在一對(duì)括號(hào)里面。參數(shù)名稱就像變量一樣,每個(gè)參數(shù)名稱在函數(shù)調(diào)用時(shí),引用你提供的數(shù)值。當(dāng)子程序調(diào)用函數(shù)過(guò)程時(shí),它以變量形式傳遞參數(shù)。一旦函數(shù)做點(diǎn)什么,它就將結(jié)果賦給函數(shù)名稱。注意,函數(shù)過(guò)程的名稱當(dāng)作變量來(lái)使用。

象變量一樣,函數(shù)也有類型,函數(shù)的結(jié)果可以是字符串型,整型,長(zhǎng)整型,等。要明確你函數(shù)的結(jié)

果類型,只有在函數(shù)聲明行后添加關(guān)鍵字As和你想要的類型即可。例如:

Function MultiplyIt(num1, num2) As Integer

如果你不明確數(shù)據(jù)類型,VB將把你的函數(shù)結(jié)果設(shè)置為默認(rèn)類型(Variant數(shù)據(jù)類型)。當(dāng)你明確你的函數(shù)結(jié)果的數(shù)據(jù)類型時(shí),就象你明確變量的數(shù)據(jù)類型那樣有一些好處,你的程序?qū)⒏行У厥褂脙?nèi)存,因此它運(yùn)行得也更快些。

我們來(lái)看看這個(gè)例子,盡管其參數(shù)在主調(diào)過(guò)程聲明的是單精度浮點(diǎn)型,但是函數(shù)仍然返回整型數(shù)據(jù):

1. ?在工程MyFunctions (Chap04.xls)里添加一個(gè)新模塊,重命名為Sample3

2. ?激活模塊Sample3并且輸入子程序HowMuch,如下所示:

Sub HowMuch()

Dim num1 As Single

Dim num2 As Single

Dim result As Single

num1 = 45.33

num2 = 19.24

result = MultiplyIt(num1, num2)

MsgBox result

End Sub

3. ?在子程序HowMuch下面輸入下列函數(shù)過(guò)程:

Function MultiplyIt(num1,num2) As Integer

MultiplyIt = num1 * num2

End Function

因?yàn)閮?chǔ)存于變量num1和num2的數(shù)值不是整數(shù),要確保它們相乘后的結(jié)果為整數(shù),你就得將函數(shù)結(jié)果設(shè)置為整型。如果你不給函數(shù)MultiplyIt的結(jié)果設(shè)置數(shù)據(jù)類型,過(guò)程HowMuch將會(huì)將結(jié)果按變量,result聲明的數(shù)據(jù)類型顯示,相乘的結(jié)果將是872.1492,而不是872。

你可以在每次運(yùn)行該過(guò)程時(shí),提供它們不同的數(shù)值,來(lái)使得該函數(shù)更有用,你可以使用InputBox函數(shù)來(lái)輸入數(shù)據(jù),而不拘泥于程序代碼給定的數(shù)值。你自己可以依照前面章節(jié)中的子程序EnterText,花幾分鐘來(lái)修改過(guò)程HowMuch。

按地址和按值傳遞參數(shù)

在一些過(guò)程中,當(dāng)你將參數(shù)作為變量傳遞時(shí),VB可能突然改變?cè)撟兞康臄?shù)值。要確保該被調(diào)函數(shù)不改變傳遞的參數(shù)值,你應(yīng)該在函數(shù)聲明行在參數(shù)名稱之前加上關(guān)鍵字ByVal。我們來(lái)看看這個(gè)例子:

1. ?在工程MyFunctions (Chap04.xls)里添加一新模塊,命名為Sample4

2. ?激活模塊Sample4并輸入下列代碼:

Sub ThreeNumbers()

Dim num1 As Integer, num2 As Integer, num3 As Integer

num1 = 10

num2 = 20

num3 = 30

MsgBox MyAverage(num1,num2,num3)

MsgBox num1

MsgBox num2

MsgBox num3

End Sub

Function MyAverage(ByVal num1, ByVal num2, ByVal num3)

num1 = num1 + 1

MyAverage = (num1 + num2 + num3) / 3

End Function

使用關(guān)鍵字ByVal在參數(shù)名稱前,可以防止函數(shù)改變參數(shù)值。子程序ThreeNumbers給三個(gè)變量賦值,再調(diào)用函數(shù)MyAverage來(lái)計(jì)算,最后計(jì)算該三個(gè)變量的平均值。函數(shù)的參數(shù)就是變量num1,num2和num3。注意,所有變量的前面都有關(guān)鍵字ByVal。同時(shí),注意,在計(jì)算均值之前,函數(shù)MyAverage改變了變量num1的值,在函數(shù)內(nèi)部,變量num1等于11(10+1),因此,當(dāng)函數(shù)將計(jì)算的均值傳遞給過(guò)程ThreeNumbers時(shí),函數(shù)MsgBox顯示的結(jié)果是20.3333333333333而不是期望的20,接下來(lái)的三個(gè)函數(shù)顯示每個(gè)變量的內(nèi)容,變量?jī)?chǔ)存的內(nèi)容和它們開(kāi)始被賦的值一致——10,20,30。

如果你在函數(shù)聲明行忽略了參數(shù)num1前面的關(guān)鍵字ByVal,結(jié)果會(huì)怎樣呢?函數(shù)的結(jié)果仍然相同,但是函數(shù)MsgBox顯示的變量num1的內(nèi)容現(xiàn)在是11了。函數(shù)MyAverage不但返回了出乎意料的結(jié)果(20.3333333333333而非20),而且改變了儲(chǔ)存在變量num1里的原始數(shù)值。要避免VB永久地改變提供給函數(shù)的數(shù)值,就得使用關(guān)鍵字ByVal。

技巧:了解你的關(guān)鍵字:ByRef和ByVal

因?yàn)槊總€(gè)要傳遞給函數(shù)過(guò)程(或子程序)的變量,都可能在接收時(shí)改變數(shù)值,所以知道如何來(lái)保護(hù)變量的原始數(shù)值是非常重要的。VB有兩個(gè)關(guān)鍵字,提供或者否認(rèn)改變變量?jī)?nèi)容的允許——ByRef和ByVal。VB默認(rèn)地按地址(關(guān)鍵字ByRef)給函數(shù)過(guò)程(或子程序)傳遞信息,引用函數(shù)被調(diào)用時(shí),函數(shù)參數(shù)明確的數(shù)據(jù)。因此,如果函數(shù)改變了參數(shù)值,原始的數(shù)值就被改變了。

如果你在函數(shù)MyAverage聲明參數(shù)num1的前面忽略了關(guān)鍵字ByVal時(shí),你就會(huì)得到這種結(jié)果。如果你想要函數(shù)過(guò)程

改變?cè)紨?shù)值,你不必專門在參數(shù)前加關(guān)鍵字ByRef,因?yàn)?#xff0c;變量數(shù)值的傳遞默認(rèn)就是ByRef。當(dāng)你在參數(shù)名稱前使用關(guān)鍵字ByVal時(shí),VB按值傳遞參數(shù),這意味著VB復(fù)制一份原始數(shù)據(jù),然后將復(fù)制值傳遞給函數(shù),如果函數(shù)改變了參數(shù)的數(shù)值的話,原始數(shù)據(jù)依然不會(huì)變——只有復(fù)制值變化。這就是為什么函數(shù)MyAverage改變了變量num1的數(shù)值,而它的原始值還保持不變。

使用可選的參數(shù)有時(shí)候,你也許要給函數(shù)提供額外的參數(shù),例如,你有一個(gè)計(jì)算每個(gè)人膳食的函數(shù)。然而,有時(shí)你不希望函數(shù)進(jìn)行相同的計(jì)算。在參數(shù)名稱前面加上關(guān)鍵字Optional可以指明該參數(shù)不是必須的。可選參數(shù)在必須的參數(shù)之后,列在參數(shù)清單的最后;可選參數(shù)總是Variant數(shù)據(jù)類型,這意味著你不能使用關(guān)鍵字As來(lái)明確可選參數(shù)的類型。在前面部分,你創(chuàng)建了一個(gè)計(jì)算三個(gè)數(shù)值的平均值的函數(shù),假設(shè),你有時(shí)只想要計(jì)算兩個(gè)數(shù)的均值,你就可以將第三個(gè)參數(shù)設(shè)置為可選的。為了不破壞原來(lái)的函數(shù)MyAverage,我們來(lái)創(chuàng)建一個(gè)新的函數(shù)Avg,來(lái)計(jì)算兩個(gè)或三個(gè)數(shù)字的均值:

1. ?在工程MyFunctions (Chap04.xls)里添加一新模塊,命名為Sample5

2. ?激活模塊Sample5并且輸入下列函數(shù):

Function Avg(num1, num2, Optional num3)

Dim totalNums As Integer

totalNums = 3

If IsMissing(num3) Then

num3 = 0

totalNums = totalNums –1

End If

Avg = (num1+num2+num3)/totalNums

End Function

3. ?現(xiàn)在來(lái)從立即窗口調(diào)用該函數(shù):

?Avg(2,3)

一旦你按下回車,VB就顯示結(jié)果:2.5

?Avg(2,3,5)

這次結(jié)果為:3.3333333333333

你已經(jīng)看到,函數(shù)Avg允許你計(jì)算兩個(gè)或三個(gè)數(shù)字的平均值,你可以決定計(jì)算幾個(gè)值的平均值。當(dāng)你在立即窗口開(kāi)始輸入函數(shù)的參數(shù)時(shí),VB將可選的參數(shù)顯示在方括號(hào)里(方括號(hào)里的參數(shù)表示是可選的)

我們花幾分鐘來(lái)分析一下函數(shù)Avg。該函數(shù)最多可以用三個(gè)參數(shù);參數(shù)num1和num2是必須的,而第三個(gè)參數(shù)num3是可選的。注意,可選參數(shù)以關(guān)鍵字Optional開(kāi)頭,可選參數(shù)列在參數(shù)清單的后面。因?yàn)閰?shù)num1,num2和num3的類型都沒(méi)有聲明,VB對(duì)待它們?yōu)閂ariant。函數(shù)內(nèi)部,變量totalNums聲明為整型,并且初始賦值為3。因?yàn)樵摵瘮?shù)必須能夠處理兩個(gè)或三個(gè)數(shù)字的平均值計(jì)算,有關(guān)很方便的內(nèi)置函數(shù)IsMissing在檢查參數(shù)的個(gè)數(shù)。如果第三個(gè)參數(shù)沒(méi)有提供,函數(shù)IsMissing的值為0,同時(shí)變量totalNums的值被減去1,因此如果沒(méi)有可選參數(shù),totalNums為2。

接下來(lái)的代碼根據(jù)提供的數(shù)據(jù)計(jì)算平均值,并且將結(jié)果傳遞到函數(shù)名稱。

函數(shù)IsMissing用來(lái)檢測(cè)可選參數(shù)是否提供,如果第三個(gè)參數(shù)沒(méi)有提供,那么該函數(shù)返回邏輯值True,如果提供了第三個(gè)參數(shù)時(shí),則返回False。在這里,函數(shù)IsMissing是和一個(gè)做判斷的語(yǔ)句If…Then一起使用的(參見(jiàn)第五章有關(guān)該語(yǔ)句和VBA中其它判斷語(yǔ)句信息)。如果沒(méi)有參數(shù)num3(IsMissing),那么(Then)VB將num3設(shè)置為0,并且將變量totalNums減去1(totalNums=totalNums–1)。你還能使用別的方法來(lái)運(yùn)行函數(shù)Avg嗎?使用你自己的方法在工作表里運(yùn)行該函數(shù),確保你使用兩個(gè)和三個(gè)參數(shù)來(lái)運(yùn)行該函數(shù)。

技巧:測(cè)試函數(shù)過(guò)程

可以編寫一個(gè)子程序調(diào)用自定義函數(shù),并且顯示它的結(jié)果,看它是否能得到設(shè)計(jì)結(jié)果。除此之外,

該子過(guò)程還應(yīng)該能顯示參數(shù)的原始數(shù)據(jù),這樣,你才能很快知道參數(shù)數(shù)值是否改變了。如果該函數(shù)

使用了可選參數(shù),你也需要檢查不使用可選參數(shù)時(shí)候的情況。

總結(jié)

以上是生活随笔為你收集整理的vba传值调用_VBA传递参数步骤的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91叼嘿视频| 舐丝袜脚视频丨vk | 天天干夜夜看 | 欧美在线视频观看 | 黑人vs亚洲人在线播放 | 亚洲高清在线观看视频 | 亚洲一本二本 | 亚洲91精品| 欧美三级视频在线 | 中文字幕日韩欧美在线 | 亚洲精品视频在线播放 | 免费色视频 | 欧美一区二区三区视频 | 免费午夜网站 | 男女午夜激情 | 国产美女精品一区二区三区 | 少妇精品高潮欲妇又嫩中文字幕 | a视频在线免费观看 | 国产精品高潮呻吟久久 | 久久伊人操 | 欧美日韩在线观看成人 | 九九热在线免费观看 | 国产精品免费无遮挡无码永久视频 | 色婷婷av一区二区三区麻豆综合 | 精品中文字幕一区二区三区 | 久久资源365| 无遮挡裸光屁屁打屁股男男 | 亚洲不卡网 | 日本美女毛茸茸 | 在线观看视频日韩 | 天天干网址| 日韩中文av在线 | 色小姐综合 | 中国一区二区三区 | 日本三级视频在线播放 | 天天干天天舔天天射 | 精品无码国产污污污免费网站 | 涩涩视频在线免费看 | 国产精品色哟哟 | 一区二区三区在线观看视频 | 日本高清视频www夜色资源 | 亚洲精品高清视频 | 久久久久www | 亚洲熟妇色自偷自拍另类 | 久久精品视频免费看 | 国产激情自拍 | av在线免费网站 | 日美韩av| 一级黄色免费观看 | 亚洲淫片 | 久久麻豆精品 | 乱妇乱女熟妇熟女网站 | 毛片在线看片 | 香蕉久久精品日日躁夜夜躁 | 日韩欧美一区二区一幕 | 性做久久久 | 看了下面会湿的视频 | 福利视频免费观看 | 色大师av一区二区三区 | 岛国av在线免费 | 超碰在线| 日本高清视频免费观看 | 综合av | av在线播放观看 | 日韩tv | 久久精品欧美 | 国产精品无码内射 | 欧美性生活网址 | 国产成人在线电影 | 国产不卡在线观看视频 | 久久人人爽爽人人爽人人片av | 国产一区 在线播放 | 国产男女无遮挡猛进猛出 | 男女乱淫 | 国产成人h | 精品人妻少妇一区二区三区 | 国产喷白浆一区二区三区 | 神马久久久久久久久久久 | 国产麻豆午夜三级精品 | 蜜臀av午夜精品 | 翔田千里在线播放 | 久久久国产精品x99av | 国产精品久久久久91 | 精品人妻一区二区三区潮喷在线 | 国产综合福利 | 美女脱衣服一干二净 | 国产精品高清无码在线观看 | 成年人网站免费观看 | 精品无码av一区二区三区不卡 | 爱就操 | 天堂在线成人 | 伊人免费在线观看 | 朝桐光在线播放 | 农村妇女一区二区 | 亚洲你我色 | 香蕉国产片| 国产熟妇另类久久久久 | 中文字幕在线观看第二页 | 91漂亮少妇露脸在线播放 |