5 回答

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個(gè)贊
函數(shù)定義了之后就可以類似 系統(tǒng)的函數(shù)拿來使用,
<變量>=函數(shù)名(參數(shù)列表)
函數(shù)如果不關(guān)心其返回值,可以用:函數(shù)名 參數(shù)列表【注意,不加小括號(hào)】的形式拿來用,此時(shí)函數(shù)的功能與過程類似了
【例:MsgBox "Hello World!"】
過程可以用Call調(diào)用 ,如:Call 過程名(參數(shù)列表),也可不加Call
=============================================
按照你的說明 ,寫了以下小例子,沒有出錯(cuò):
Private Function a(b As Range) As Integer
Range("D1") = "Run a"
a = 2
End Function
Sub c()
Dim d As Range
Set d = Sheet1.Range("a1:d1")
Call a(d)
End Sub
運(yùn)行后 “D1”中內(nèi)容已經(jīng)更改了!說明已經(jīng)能夠正確運(yùn)行了
你的出錯(cuò) 請(qǐng)給出出錯(cuò)信息!

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊
假設(shè)我在一個(gè)模塊中建立了一個(gè)公共函數(shù)a
public function a(b as string)
...
end function
在另一個(gè)模塊中的建立一個(gè)過程c
sub c()
...
end sub
那如果我想從另一個(gè)模塊中的過程c調(diào)用這個(gè)公共函數(shù)a該怎么做呢?
順便問一下,如果我想在函數(shù)中返回一個(gè)數(shù)組該怎么做呢?
聽說call也可以??

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊
vba模塊中的公共函數(shù)是直接拿來可以用的就跟已經(jīng)在本模塊中一樣用法,用的時(shí)候就跟樓上說的一樣用 call a(b)
返回?cái)?shù)組我一般用兩個(gè)方法,
第一個(gè)方法是定義一個(gè)公用的數(shù)組,在哪個(gè)模塊都可以
如public b(10) as long
第二個(gè)方法是在過程中定義好數(shù)組,在調(diào)用函數(shù)的時(shí)候以參數(shù)的形式傳遞參數(shù)的地址。如
sub main()
dim b(10) as long
call trans(byref b) '這里必須在b之前寫上byref,表示傳達(dá)數(shù)組地址
'從這里開始就可以使用已經(jīng)被sub trans處理過的數(shù)組b(10)了
。。。。。。
end sub
sub trans(bb as long)
。。。。。。
end sub

TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個(gè)贊
通過VBA調(diào)用函數(shù)并給函數(shù)指明參數(shù)的幾種調(diào)用方法:
①種調(diào)用方法
Worksheets(1).Range("E6") = WorksheetFunction.Median(Range("A1:B4"))
這種調(diào)用形式,函數(shù)的參數(shù)是單元格地址區(qū)域,屬于普通型,但數(shù)據(jù)區(qū)域的定義難于確定。
②種調(diào)用方法
Worksheets("sheet1").Range("D6") = Application.Min(Range("A1:B4"))
這種調(diào)用形式,函數(shù)參數(shù)的數(shù)據(jù)區(qū)域及工作表名稱,屬于普通型,靈活性不夠。
③種調(diào)用方法
Worksheets(1).Range("C6") = Application.Max(Worksheets("Sheet1").Range("A1:B4"))
此類調(diào)用方法,直接指明工作表名稱及數(shù)據(jù)范圍,但還是缺乏靈活性。
④種調(diào)用方法
Worksheets(1).Range(Cells(6, 2), Cells(6, 2)) = Application.WorksheetFunction.Average(Worksheets(1).Range(Cells(1, 1), Cells(4, 2)))
這種調(diào)用方法,是最標(biāo)準(zhǔn)、最靈活、最具有代表性、最完整、出錯(cuò)率最低的一種調(diào)用方法。
因?yàn)橐粋€(gè)工作薄包含多張工作表,只要在調(diào)用中,首先指明工作表名稱再給出數(shù)據(jù)范圍,這樣,就不會(huì)和其它工作表混淆,另外,對(duì)表的名稱和數(shù)據(jù)區(qū)域的引用,完全都是通過可構(gòu)造性的行列序號(hào)來標(biāo)記的,這種方法是相當(dāng)?shù)撵`活。
另外,調(diào)用函數(shù)的時(shí)候,也是逐漸引用。首先是Application引用,再次是WorksheetFunction引用,最后長到函數(shù)名稱,如:Application.WorksheetFunction.Average,這樣就可以保證邏輯性的完整,可以避免錯(cuò)誤的發(fā)生。
請(qǐng)注意VBA只能調(diào)用EXCEL絕大多數(shù)的函數(shù),而不是所有函數(shù)。

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超17個(gè)贊
模塊一,兩個(gè)fun:
---------
Public Function aFun(n() As Long, m As Integer)
For i = LBound(n) To UBound(n)
n(i) = n(i) + 10
Next
m = m + 100
End Function
Public Function bFun(rng As Range)
On onerror GoTo 100
With rng
For i = 1 To .Rows.Count
For j = 1 To .Columns.Count
With .Cells(i, j)
If IsNumeric(.Value) And Not IsEmpty(.Value) Then .Value = .Value + 100
End With
Next j, i
End With
100:
End Function
------------
模塊二,兩個(gè)sub,調(diào)用上面的兩個(gè)fun:
---------
Public Sub a()
Dim iArr(1 To 3) As Long
Dim a As Integer
For i = 1 To 3
iArr(i) = i
Next
a = 5
Call aFun(iArr, a)
MsgBox iArr(3) & Chr(10) & a
End Sub
Public Sub b()
Dim iRng As Range: Set iRng = Range("a1:b5")
If iRng.Count <= 1 Then iRng.Value = iRng.Value + 100: GoTo 100
Call bFun(iRng)
100:
End Sub
添加回答
舉報(bào)