为了账号安全,请及时绑定邮箱和手机立即绑定

vba中如何调用公共函数?

vba中如何调用公共函数?

肥皂起泡泡 2019-02-05 20:06:44
假设我在一个模块中建立了一个公共函数apublic function a(b as string)...end function在另一个模块中的建立一个过程csub c()...end sub那如果我想从另一个模块中的过程c调用这个公共函数a该怎么做呢?顺便问一下,如果我想在函数中返回一个数组该怎么做呢?听说call也可以??我自己又重新看了一下,我觉得很可能是参数的问题function a (b as range)...end function而在sub c()中我是这么做的:dim d as rangeset d=sheet1.range("a1:d1")call a(d)结果总是出错
查看完整描述

5 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

函数定义了之后就可以类似 系统的函数拿来使用,
<变量>=函数名(参数列表)
函数如果不关心其返回值,可以用:函数名 参数列表【注意,不加小括号】的形式拿来用,此时函数的功能与过程类似了
【例:MsgBox "Hello World!"】

过程可以用Call调用 ,如:Call 过程名(参数列表),也可不加Call

=============================================
按照你的说明 ,写了以下小例子,没有出错:

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

运行后 “D1”中内容已经更改了!说明已经能够正确运行了

你的出错 请给出出错信息!



查看完整回答
反对 回复 2019-03-18
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

假设我在一个模块中建立了一个公共函数a
public function a(b as string)
...
end function

在另一个模块中的建立一个过程c
sub c()
...
end sub
那如果我想从另一个模块中的过程c调用这个公共函数a该怎么做呢?

顺便问一下,如果我想在函数中返回一个数组该怎么做呢?
听说call也可以??



查看完整回答
反对 回复 2019-03-18
?
ibeautiful

TA贡献1993条经验 获得超5个赞

vba模块中的公共函数是直接拿来可以用的就跟已经在本模块中一样用法,用的时候就跟楼上说的一样用 call a(b)

返回数组我一般用两个方法,
第一个方法是定义一个公用的数组,在哪个模块都可以
如public b(10) as long
第二个方法是在过程中定义好数组,在调用函数的时候以参数的形式传递参数的地址。如
sub main()
dim b(10) as long
call trans(byref b) '这里必须在b之前写上byref,表示传达数组地址
'从这里开始就可以使用已经被sub trans处理过的数组b(10)了
。。。。。。
end sub

sub trans(bb as long)
。。。。。。
end sub


查看完整回答
反对 回复 2019-03-18
?
温温酱

TA贡献1752条经验 获得超4个赞

通过VBA调用函数并给函数指明参数的几种调用方法:
①种调用方法
Worksheets(1).Range("E6") = WorksheetFunction.Median(Range("A1:B4"))
这种调用形式,函数的参数是单元格地址区域,属于普通型,但数据区域的定义难于确定。
②种调用方法
Worksheets("sheet1").Range("D6") = Application.Min(Range("A1:B4"))
这种调用形式,函数参数的数据区域及工作表名称,属于普通型,灵活性不够。
③种调用方法
Worksheets(1).Range("C6") = Application.Max(Worksheets("Sheet1").Range("A1:B4"))
此类调用方法,直接指明工作表名称及数据范围,但还是缺乏灵活性。
④种调用方法
Worksheets(1).Range(Cells(6, 2), Cells(6, 2)) = Application.WorksheetFunction.Average(Worksheets(1).Range(Cells(1, 1), Cells(4, 2)))
这种调用方法,是最标准、最灵活、最具有代表性、最完整、出错率最低的一种调用方法。
因为一个工作薄包含多张工作表,只要在调用中,首先指明工作表名称再给出数据范围,这样,就不会和其它工作表混淆,另外,对表的名称和数据区域的引用,完全都是通过可构造性的行列序号来标记的,这种方法是相当的灵活。
另外,调用函数的时候,也是逐渐引用。首先是Application引用,再次是WorksheetFunction引用,最后长到函数名称,如:Application.WorksheetFunction.Average,这样就可以保证逻辑性的完整,可以避免错误的发生。
请注意VBA只能调用EXCEL绝大多数的函数,而不是所有函数。



查看完整回答
反对 回复 2019-03-18
?
慕慕森

TA贡献1856条经验 获得超17个赞

模块一,两个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
------------
模块二,两个sub,调用上面的两个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



查看完整回答
反对 回复 2019-03-18
  • 5 回答
  • 0 关注
  • 2487 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信