巴蜀兄弟连吧 关注:60贴子:246
  • 4回复贴,共1

『巴蜀兄弟连』Excel - VBA - 基础知识 - 02 - Function

只看楼主收藏回复

【Function 函数】 利用Function编写自定义函数
1、我们需要建立一个“标准模块”;
2、在标准模块中编写Function函数,即可在Excel工作表的单元格中进行调用。
【如何建立标准模块】
我们打开VBE窗口之后,可以通过两种方式建立“标准模块”:
第一种方法:点击“插入” - “模块”,在“工程资源管理器”里面,出现的类似"模块1"、“模块2”这样的模块,就是标准模块,我们可以通过点击“模块1”,然后在属性窗口中更改模块名字;
第二种方法:在工程资源管理器的工作表模块上,点鼠标右键,然后依次点击“插入” - “模块”,建立标准模块。如图:

有了标准模块,双击“模块1”或者在“模块1”上点鼠标右键,然后选择“查看代码”,就打开了标准模块“模块1”的代码编辑窗口, 然后我们试着来编写我们的第一个自定义函数 ---- BaShu
【用Function编写最简单的自定义函数】
VB语言最基本的两个语法,就是Function ... End Function,Sub ... End Sub
Function我们称之为函数,Sub我们称之为过程。
任何一个函数或者过程,均是由类似:
Function xx()
......
End Function

Sub yy()
......
End Sub
这样的结构块组成。每一个Function对应唯一的一个End Function,相互之间不可嵌套。
同样每一个Sub都对应唯一的一个End Sub。否则就会产生错误。
所以下面都是错误的:
Function xx() '错误的
Function yy()
......
End Function
Sub zz() '错误的
......
End Sub
End Sub
一个完整的Function函数,包括Private/Public等关键字,还可能包括一些参数,还有类型。
为了快速入门,这里省略这些复杂的部分,直接从最简答的函数开始进入VBA的世界。
'=================================
' Function
' 函数
'=================================
Function 函数名称()
'这里的Function就表示这是一段函数,主要你是与Sub相区分。
'函数名称可以是英文,汉字,也可以是英文加数字、汉字的混合体,但函数名称不能参杂某些特殊符号,也不能以数字作为开头,函数名称后面的括号不可省略,括号中可以添加参数
函数名称 = "巴蜀兄弟连" '这里是给函数赋值为“巴蜀兄弟连”
'巴蜀兄弟连五个字用双引号括起来,表示一个字符串
'在VB语言中,由双引号括起来的部分,就是字符串
Exit Function '可以在函数中任何位置添加 Exit Function语句,表示直接退出函数
'下面的End Function表示函数执行到这里结束。
End Function
以下是一个最基本的函数,想学习的人,可以在代码编辑区输入以下代码进行测试:
Function BaShu()
BaShu = "巴蜀兄弟连"
End Function
如下图:

Rem 下面,我们在Sheet1的A1单元格中输入“=BaShu()”,那么我们就完成了第一个自定义函数了!
如图:
以上就是最简单的自定义函数的书写过程!


IP属地:上海1楼2013-10-27 22:29回复
    Function BaShu()
    BaShu = "巴蜀兄弟连"
    End Function
    上面的这段代码,Function就表示这是一个函数,Bashu是这个函数的名字。()内是空的,表示这个函数还没有参数。
    Bashu = "巴蜀兄弟连"
    这个叫做赋值语句,函数名后面用赋值语句,我们通常把这个叫做给函数一个返回值,而函数区别于Sub语句,最大的特点就在于函数拥有返回值,而函数的返回值就通过函数中的赋值语句来实现。
    哦,卖锅的,难道函数就这么一丁点儿能耐吗?如果你这么认为的话,那么你就大错特错了。VBA作为Excel的扩展,可以用一个词来形容就是——“无所不能”。当然,这里的无所不能是对于VBA语言功能强大的夸张说法,但的确VBA可以突破EXCEL工作簿本身函数和一些功能的限制,从而实现更为强大而丰富的功能,这个是毋庸置疑的。
    那么究竟VBA可以实现什么功能呢?我们就从Function函数开始,一步一步来解开VBA语言在我们心中的不解谜团。
    熟悉Excel的同学,想必对于Sum这样的函数再熟悉不过。那么我们当然也可以编写自定义函数来实现类似于Sum函数同样的功能。比如添加如下这样的一段代码:
    Function mySum(ByRef Rng As Range)
    Dim r As Range, n As Double
    For Each r In Rng
    n = n + Val(r)
    Next
    mySum = n
    End Function
    然后,我们在C1:C10和D1:D10输入,1,2,3...10十个数字,然后在c11单元格中输入 "=Sum(c1:C10)",在D11单元格里面输入"=mySum(D1:D10)",回车键后,我们发现,两个单元格通过求和计算得到了相同的结果55。
    没错,我们就是通过VBA语句,实现了和Sum函数同样功能的函数mySum。
    对于上面的这段函数,对于初学者来说,理解起来肯定是有些困难的。但至少我们应该可以看懂以下几个部分。
    1、Function关键字,这个表示我们上面的代码块是一段函数;
    2、mySum这个表示函数名称;
    3、()括号是函数不可缺少的部分,而我们这段代码括号里面多了byref Rng as Range,这是表示一个Range类型的参数;
    4、End Function,这个是函数的结束部分。
    那么其他几个部分呢,其他几个方面并不复杂:
    1、Dim r As Range, n as Double这个是变量定义语句,表示定义一个Range(单元格对象)类型的变量r和一个Double(双精度浮点类型)类型的变量n。
    2、For ... Next 循环语句;
    3、n = n + Val(r) :这是一个赋值语句。
    【赋值语句的工作原理】-----------------------------------------
    赋值语句的赋值过程一般是两个步骤:
    1、计算等号右边的表达式的值,
    2、将计算结果赋值给左边的变量、属性或者函数。
    -------------------------------------------------------------------------
    上面的 n = n + Val(r),Val(r)这个是一个函数,表示将r单元格的值转换成数值,n + Val(r)就是用n的值加上Val(r),最后再赋值给n。
    是不是被绕糊涂了。那么我们看以下几个实例:
    b = 2
    c = 3
    a = b + c
    上面是三个赋值语句,b =2 ,c =3这样的赋值语句,通常最为简单,也非常容易理解,因为等号右边直接是数值,那么就不必进行计算,直接赋值给左边的变量b和c。那么通过这样的赋值语句之后,b的值就是2,c的值就是3,这个我们数学里面理解x = 2, y = 3,z = x + y = 5是一样的。
    而对于第三个赋值语句: a = b + c
    那么就会先进行右边的表达式计算,也就是计算机会先计算 b + c的值,也就是2 + 3,结果是5,然后再将5这个结果赋值给a。
    所以经过上面3个语句之后,b = 2, c = 3 ,a = 5。
    其实,你可能会说,你这个人怎么这么啰嗦,b =2 ,c =3 ,a = 5,这个小学生都看得懂的玩意儿,你有必要讲这么婆婆妈妈一大堆吗?
    其实,我是想说,你必须明白赋值语句的工作机制,因为在编程里面我们经常会遇到下面这样的赋值语句:
    n = n + 1
    许多人开始的时候就很不理解,n = n + 1,那前后两个n不是一样的吗?那么我要告诉你,谨记我上面所说的赋值语句的工作机制,对于n = n + 1这样的语句,首先计算n + 1的值,然后赋值给左边的n。
    比如:
    n = 2
    n = n + 1
    那么,先计算左边的 n + 1,也就是 2 + 1 = 3, 然后将3赋值给左边的n。所以经过n = n + 1计算之后的n的值就变成了3。
    你不用想得太复杂,这个赋值过程就这么简单而已。
    所以,下面的函数我想你肯定能够看得懂了:
    Function mm()
    Dim a as integer, b as integer
    a = 1
    b = 2
    a = a + 1
    b = b + 2
    mm = a + b '结果是6,你能分析出来怎么得到的吗?
    End Function
    OK,然后我们在B2单元格输入"=mm()",那么就得到最终的计算结果:6。
    请在“『巴蜀兄弟连』Excel - VBA - 基础知识 - 03 - Dim 定义变量” 篇下载测试附件!I


    IP属地:上海2楼2013-10-30 21:01
    回复
      2025-08-02 16:54:55
      广告
      不感兴趣
      开通SVIP免广告
      棒棒,你真棒!


      IP属地:四川4楼2013-10-30 22:37
      回复
        再看一遍。。。。呵呵。


        IP属地:四川5楼2014-08-14 21:35
        回复
          哎呀妈娿,这一个,我居然能看懂了!


          6楼2014-08-15 10:27
          回复