VBA如何在一个模块中引用另一个模块的函数

2024-11-15 23:26:10
推荐回答(5个)
回答(1):

1、按ALT+F11调出EXCEL中VBA界面。

2、右键插入一个模块。

3、首先新建一个子程序,如图,填写公式进去。

4、for 是可以从任意数字开始和结束的,如图,我们从第2行到第10行。点击运行后,依次计算并填写完成。

5、接下来,用同样方法写完求平均数公式。

6、同样,运行后,可以看到,不均数也填写完成了。

7、这样填写的是公式,仔细观察,会发现相当于我们自动输入了公式,而不是计算后的值。

回答(2):

在日常工作中,Excel里面很多函数我们都用过,比如求和函数sum,sumif,计数函数count,countif。同样在VBA里面也有一些函数,我们称之为VBA函数,相对于VBA函数,我们经常在工作里面使用的函数称之为工作表函数。

在写代码时,我们可以引用工作表函数,也可以直接使用VBA函数,但如果VBA函数不能实现某个目的而工作表函数却能轻松实现的情况之下,那要在代码中引用工作表函数。

下面我们来看下,如何引用工作表中的公式?

以上图为例,

一、用VBA在F2中计算金额。

在工作表中使用公式,很简单,直接在F2中输入:

=B2*C2

在VBA中表达如下:

Sub 普通公式()Range("f2") = "=b2*c2"End Sub
等号后面直接双引号,双引号里公式和工作表里的公式一致,注意带等号。

二、如果是要一次性在F2:F8里输入公式呢?

这里要用到循环语句,正好复习前面讲过的内容

Sub 普通公式1()Dim x As IntegerFor x = 2 To 8Cells(x, 6) = "=b" & x & "* c" & xNext xEnd Sub
X是一个变量,代表行号,公式中用凡是文本与数字相连要用&符号,且文本必须用括号括起来。

这里我们用了cells,那可以用range吗?当然可以,只有这样举一反三我们才能真正掌握其写法:

Sub 普通公式2()Dim X As IntegerFor X = 2 To 8Range("f" & X) = "=b" & X & "* c" & XNext Xend sub
跟上面的代码很相似,从这个例子中我们观察到了,比如,我用VBA写A2单元格,应该是range("A2"),A2要用双引号括起来,但如果引用的是A列的任意一个单元格,Ax,x为变量,那么写法就是range("A"&x),而不需要在此基础上再加双引号了,同样,后面跟的公式中含有变量时写法也是如此。

经过前面几节的内容,我们也逐步的认识到了VAB中单元格的两种表示方式:

1、range("具体的单元地址")

2、cells(行号,列号)

单元格的表示还有一种更简单的方法:[具体的单元格地址]

比如A1单元格,可以写成,range("a1"),cell(1,1),cell(1,"a"),[a1]

以上是直接引用工作表中的公式,公式中没有使用函数,如果公式中有函数,又该如何引用呢?

三、如果是要计算A产品的个数呢?

如果是在工作表里,我们直接

=COUNTIF(A2:A8,"A")

就可以了。

那VBA中会是怎么样的呢?

Sub 普通公式3()Range("D12") = "=COUNTIF(A2:A8,""A"")"End Sub
跟前面所讲的写法的区别在与,凡是原来公式里有引号的,在VBA中要多加一个引号。

前面两种情况,我们都了解了,一个是公式中没有函数的情况,一个是公式中有函数的情况。

四、那我们常用的数组公式,那个大括号,我们平常是按Crtl+Shift+Enter后自动加上去的,这种情况在VBA中怎么解决呢?

比如上例中:求金额之和,用数组公式是:

=SUM(B2:B8*C2:C8)

VBA中写法如下:

Sub 数组公式()Range("e10").FormulaArray = "=SUM(B2:B8*C2:C8)"End Sub
数组公式也是等号后面双引号里直接复制公式进去,不同在于,如果是数组公式,Range("e10")后要跟FormulaArray(表示数组公式)

五、以上是直接引用工作表中的函数公式如果在VBA中要调用工作表的函数直接获得值,语法如下(以计算A产品出现的次数为例):

Sub 调用公式()Range("D12") = Application.WorksheetFunction.CountIf(Range("A1:A8"), "A")End Sub
Application.WorksheetFunction.后面跟函数,并且函数的参数写法要按照VBA中的格式写,输入WorksheetFunction.后系统会自动弹出可以调用的工作表函数

回答(3):

我试了,在同一个文件中,只要另一个模块中的函数前不要加 Private 之类的限制词,就可以直接调用,或者前面加模块名再加函数名来调用。比如(我用的Call方式调用,其他方式应该也行的吧):

Call 模块2.DealMerge(ActiveCell)
或者
Call DealMerge(ActiveCell)

模块2中的过程是这样的:
Function DealMerge(Target As Range)
Dim tmpRange As Range
Set tmpRange = Cells(Target.Row(), 1).MergeArea
'......
End Function

GoodLuck!

回答(4):

1. 什么是DLL文件

DLL是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库。

DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。DLL 是一个包含可由多个程序同时使用的代码和数据的库。

2. DLL在VBA中有什么作用?

① 把核心代码封装在DLL里,用户无法查看到DLL文件中的代码,有利于保护自已的代码。

② 可以放在DLL文件中被大家共享。

3. 怎么把VBA代码封装到DLL文件中呢?

常用的方法是使用VB6.0进行封装,所以大家要想学习本集封装,需要先安装VB6.0程序。具本的封装步骤详见下面的DLL封装示例模块。

4. 怎么在VBA中调用这些代码呢?

封装的代码是以类的形式存在,所以调用前需要先加载DLL文件,然后在模块中象调用类模块一样调用DLL中的函数,详见下面的"DLL代码的调用"模块内容。

二、DLL封装

在模块中编写试调正确
例:写一个求矩形面积的VBA自定义函数。

Function 面积(长 As Double, 宽 As Double)
面积 = 长 * 宽
End Function

2. 打开VB程序,在"新建工程'窗口中点"ActiveX DLL"图标。

回答(5):

1、 前提是,不要把过程设置成PRIVATE。
2、 过程或者函数声明前前面加上PUBLIC就表示为公共的过程或函数
3、 或者声明为GLOBE为全局的过程或函数
4、 调用时加入模块名,即可调用。Call “空格” 模块名称 "." 程序名称
5、如果不加模块名,优先调用本模块内过程。如果本模块没有,则调用其他模块内同名过程