Function函数

前面我们说过Sub过程,VBA还有一种Function函数,语言规则与Sub差不多:

Function 函数名(参数 As 数据类型) As 数据类型

End Function

与Sub不同的是:

  • 函数可以返回一个值
  • 不能直接运行

详细介绍请查看官方文档:

https://docs.microsoft.com/zh-cn/office/vba/language/reference/user-interface-help/function-statement?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev11.query%3FappId%3DDev11IDEF1%26l%3Dzh-CN%26k%3Dk(vblr6.chm1008927)%3Bk(TargetFrameworkMoniker-Office.Version%3Dv16)%26rd%3Dtrue

1、Function有什么用?

其实Function能做的,Sub都可以做到,设置Function这种模式个人认为还是为了方便,让人一看就知道某段代码仅仅是为了完成某一个特定任务。

这种将复杂功能分解成若干小功能,由各个小功能来组合完成一个复杂功能的编程思想是非常重要的:

  • 可以简化开发难度
  • 提高代码的复用

2、Function的参数

VBA中,参数的传递有2种方式:

  • Byval 传值,传递的是副本,与原始变量已经没有关系。
  • Byref 传地址,传递的是变量的地址,就是原始变量。

打个比方:

  • 孙悟空和妖怪打架,他法术好,用个毫毛就能变个分身,他让分身去打架,妖怪伤害了分身,不会影响他自己。这就是Byval。
  • 猪八戒去打的话,他不会分身术,只能自己去,被妖怪打的猪头都不像猪头了,那就是猪八戒自己受的伤。这就是Byref。

如果参数前面省略了修饰符,默认是Byref(个人认为这个默认非常的不好,我刚开始用VBA的时候碰过这个问题,莫名其妙不知道为什么变量的值不对了)。

这2种方式的区别初学者只要记住(非常重要)就可以,要理解有点难度,需要一定的计算机内存方面的知识。

只要简单记住,如果你传递的变量只是给其他函数使用的,并不需要改变的话,用Byval。

3、举例

继续用前面说的例子,我们将判断数字奇偶这个功能分解出来:

Sub TestFor()
    Dim i As Long
    
    For i = 1 To 100 Step 1
        Range("B" & VBA.CStr(i)).Value = OddOrEnev(VBA.CLng(Range("A" & VBA.CStr(i)).Value))
    Next i
End Sub

Function OddOrEnev(lValue As Long) As String
    If lValue Mod 2 = 1 Then
        OddOrEnev = "奇数"
    Else
        OddOrEnev = "偶数"
    End If
End Function

我们将判断奇偶这个功能做出1个OddOrEnev Function,然后在Sub过程中直接调用就可以,OddOrEnev返回的值就可以直接赋值给B列的单元格了。

如果以后你突然觉得OddOrEnev仅仅给出奇偶的判断不够的话,直接修改OddOrEnev这个Function就可以,Sub过程不需要改动,这样修改起来就简单了。

如果其他的Sub过程也需要这个功能,直接调用即可,这也就是代码的复用了。

4、小结

介绍了Function的规则、参数的传递、Function的作用等。

本文分享自微信公众号 - VBA 学习(xyjvba),作者:熊业军

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • VBA编写Ribbon Custom UI编辑器03——认识Ribbon的xml

    当然我们关注的不是说主要用哪几个东西,而是Ribbon xml的编写格式,这个格式的文本如何转换为一个二维数组,然后输出到Excel表格:

    xyj
  • 常用功能加载宏——单元格数字与文本转换

    使用Excel主要就是做表格,表格自然离不开数字,特别是对于会计专业的,每天都要处理大量的表格,大量的数字。

    xyj
  • VBA解析复合文档07——Parse参数IReadWrite

    因为考虑到除了直接读取文件之外,还有可能直接传入一个已经读取好了的Byte数组,比如直接从2007版本以上的Excel中读取vbaProject.bin,所以定...

    xyj
  • 使用truffle框架部署合约

    【注意】先安装node.js node.js的安装可以参考:https://blog.csdn.net/u014361775/article/details/...

    foochane
  • 「MoreThanJava」机器指令到汇编再到高级编程语言

    上一次我们已经了解了 二进制和 CPU 的基本原理,知道了程序运行时,CPU 每秒数以亿次、十亿次、百亿次地震荡着时钟,同步执行着微小的 「电子操作」,例如:从...

    我没有三颗心脏
  • 解决 Laravel 项目跨域问题

    Access to XMLHttpRequest at 'http://youji.teavels.test/api/travels/show' from o...

    hedeqiang
  • 分布式定时任务调度系统技术选型

    原文链接:https://blog.csdn.net/guyue35/article/details/84883408...

    业余草
  • 图解机器学习总结——1、基本概念

    序言:近期主要帮同事讲解《图解机器学习》,刚拿到这本书觉得内容相比较平常使用的机器学习算法,很多地方讲解得比较奇怪,在认真的读完后,觉得还是有很多重要的东西,因...

    zhaozhiyong
  • MinHook库的使用 64位下,过滤LoadLibraryExW

    minHook库是一个支持x64跟x86HOOK的库.Detours也支持x64.不过是收费的所以在x64下使用minHook也是一个不错的选择.

    IBinary
  • vim编辑器在linux下的几个常用操作

    在linux系统中vim可以说是最常用到的编辑器了,但是vim和在windows下的notepad有很大的不同,今天就介绍一下vim常用的几个操作。 首先需要打...

    用户1188347

扫码关注云+社区

领取腾讯云代金券