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的作用等。
- 马尔可夫链文本生成的简单应用:不足20行的Python代码生成鸡汤文
- 最长递增子序列
- dedecms批量删除文档关键词可以吗
- 【学术】在C ++中使用TensorFlow训练深度神经网络
- 一个canonical标签解决site不在首页的问题
- 由一道面试题来了解进程间的通信
- 【教程】简单教程:用Python解决简单的水果分类问题
- 通过html<map>标签给图片加链接
- Windows下安装Scikit-Learn
- 解决后台无法进入提示DedeCMS Error: (PHP 5.3 and above) Please set 'request_order' ini value
- 一文教你实现skip-gram模型,训练并可视化词向量
- 如何将文章列表用<li>分两列显示
- 面试题之走楼梯问题
- 最长公共子序列与最长公共子串
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 详解升级Android Studio3.0时遇到的几个问题
- Android 动态加载二维码视图生成快照的示例
- 使用Mybatis反配置逆向工程,错误eg:This is not a MyBatis Generator Configu
- DTS(数据库传输服务)
- R语言关联挖掘实例(购物篮分析)
- 用R语言中的神经网络预测时间序列:多层感知器和极限学习机
- 基于R语言股票市场收益的统计可视化分析
- Mac系统R语言升级后无法加载包报错 package or namespace load failed in dyn.load
- 如何从xml文件创建R语言数据框dataframe
- Matlab马尔可夫链蒙特卡罗法(MCMC)估计随机波动率(SV) 模型
- 如何从xml文件创建R语言数据框dataframe
- R语言POT超阈值模型和极值理论EVT分析
- R语言使用灰色关联分析(Grey Relation Analysis,GRA)中国经济社会发展指标
- R语言中的模拟过程和离散化:泊松过程和维纳过程
- R语言Lee-Carter模型对年死亡率建模预测预期寿命