1、按ALT+F11调出EXCEL中VBA界面。
2、右键插入一个模块。
3、首先新建一个子程序,如图,填写公式进去。
4、for 是可以从任意数字开始和结束的,如图,我们从第2行到第10行。点击运行后,依次计算并填写完成。
5、接下来,用同样方法写完求平均数公式。
6、同样,运行后,可以看到,不均数也填写完成了。
7、这样填写的是公式,仔细观察,会发现相当于我们自动输入了公式,而不是计算后的值。
在日常工作中,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.后系统会自动弹出可以调用的工作表函数
我试了,在同一个文件中,只要另一个模块中的函数前不要加 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!
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"图标。
1、 前提是,不要把过程设置成PRIVATE。
2、 过程或者函数声明前前面加上PUBLIC就表示为公共的过程或函数
3、 或者声明为GLOBE为全局的过程或函数
4、 调用时加入模块名,即可调用。Call “空格” 模块名称 "." 程序名称
5、如果不加模块名,优先调用本模块内过程。如果本模块没有,则调用其他模块内同名过程