学习Excel技术,关注微信公众号:

excelperfect

前面用了几篇文章详细讲解了Sub过程的语法及相关知识,本文进一步讲解与Sub过程相关的一些“重要事项”,以进一步理解Sub过程的使用。

ByRef和ByVal

我们知道,可以在调用其他过程时,向该过程传递参数。通常使用ByVal来指定参数通过值传递,或者使用ByRef来指定参数通过引用传递。如果没有指定限定词,则默认为ByRef,即参数通过引用传递。

那么,什么是通过引用传递呢?先看下面的示例代码:

Sub testMy()

Dim my As Long

my = 1

Call testYour(my)

Debug.Print my

End Sub

Sub testYour(ByRef your As Long)

your = your + 8

End Sub

运行testMy过程后的结果如下图1所示,打印出变量my的值为9。

图1

所谓引用传递,就是将调用过程的变量的引用传递给了被调用过程的参数变量。也就是说,它传递的是一个指针,该指针包含调用过程中的变量在内存中的地址。因此,调用过程中的变量与被调用过程中的变量都是指向内存中的同一地址,如下图2所示。

图2

这样,被调用过程中对变量值的修改,实际上是对变量指向的内存中地址存储的值的修改,因此,调用过程中的变量值也相应被修改。

与引用传递不同,值传递只是将调用过程中的变量的值赋给了被调用过程中的变量。如下面的代码所示:

Sub testMy()

Dim my As Long

my = 1

Call testYour(my)

Debug.Print my

End Sub

Sub testYour(ByVal your As Long)

your = your + 8

End Sub

运行代码后的结果如下图3所示,打印出变量my的值仍为1。

图3

可以看出,值传递并不会改变所传递的变量的值。这是因为,调用过程中的变量与被调用过程中的参数变量分别在不同的内存地址中存储各自的值,如下图4所示。

图4

因此,被调用过程中的参数变量值的修改不会影响到调用过程中变量的值。

Sub过程不返回值吗?

一般来说,Sub过程不返回值,Function过程才返回值(完美Excel后续文章将详细讲解Function过程)。然而,使用ByRef方式传递参数值,我们可以得到其“返回的值”。正如上文图1所示的代码,调用过程testYour后,my的值变为了9。

ParamArray

可以使用ParamArray来指定参数是一个包含任意元素的变体数组,但是只能作为Sub过程的参数列表的最后一个元素。也就是说,通过使用ParamArray指定参数,可以实现给Sub过程传递任意数量的变量。

看看下面的示例代码:

Sub testParam()

Dim my As Long

my = 10

Call testOur(my, 1, 2, 3)

End Sub

Sub testOur(our As Long, ParamArray ArgsList() As Variant)

Dim lResult As Long

Dim vArg As Variant

For Each vArg In ArgsList

lResult = our + vArg

Debug.Print lResult

Next

End Sub

打印的结果为11、12、13,如下图5所示。

图5

从代码中可以看出,在调用过程testParam中,并没有将参数作为数组来显示传递,而是以逗号分隔的值来传递。

当然,也可以变量列表的形式来传递。例如:

Sub testParamByVar()

Dim my As Long

Dim your1 As Long

Dim your2 As Long

Dim your3 As Long

my = 10

your1 = 1

your2 = 2

your3 = 3

Call testOur(my, your1, your2, your3)

End Sub

Sub testOur(our As Long,ParamArray ArgsList() As Variant)

Dim lResult As Long

Dim vArg As Variant

For Each vArg In ArgsList

lResult = our + vArg

Debug.Print lResult

Next

End Sub

运行testParamByVar过程后,打印出与上图5相同的结果。

注意,ParamArray不能与ByRef、ByVal或者Optional同时使用。

redirect通过url_for传递参数_Excel VBA解读 | 进阶篇(127):Sub过程的参数传递技术...相关推荐

  1. navicat存储过程返回值为空_Excel VBA解读(128):Function过程详解——枯燥的语法...

    学习Excel技术,关注微信公众号: excelperfect 在<Excel VBA解读(27):看看VBA的Sub过程和Function过程>中,我们讲解了Function过程的基本形 ...

  2. cstring::replace不区分大小写_Excel VBA之函数篇-3.11订单号千奇百怪,如何按照结构区分来源...

    前景提要 随着经济水平的不断的提高,现在很多的外资企业都已经来到中国开厂和中国公司打交道做生意了,而很多国内公司为了适应各种不同的市场,也是开发了各种不同的业务,这些业务很多都是通过订单号的形式存在于 ...

  3. 必须声明标量变量_Excel VBA解读(136): 在用户定义函数中的变体、引用、数组、计算表达式、标量...

    学习Excel技术,关注微信公众号: excelperfect 在前面的几篇文章中,我们自定义的函数使用定义为Range的参数来从Excel工作表中获取数据,例如: Function VINTERPO ...

  4. resize函数_Excel VBA解读(134): 使用Excel函数提高自定义函数的效率

    学习Excel技术,关注微信公众号: excelperfect 在上篇文章中,我们展示了自定义函数有效的方式是通过将单元格区域读取到Variant型数组来传递单元格区域数据.本文将介绍在自定义函数中最 ...

  5. vba复制整个sheet内容_Excel VBA解读(74):移动或复制工作表——Move方法和Copy方法...

    有时候,我们可能想复制工作表,保留一份工作表的副本,以免误操作打乱工作表后无法恢复.有时候,我们也可能想移动工作表,调整工作表顺序,将工作表重新排列,以方便工作表的布置.本文介绍在VBA中实现这两种操 ...

  6. workbook对象需要关闭_Excel VBA解读(92):Workbook对象的Open事件和BeforeClose事件

    本文详细讲解Workbook对象常用的两个事件:Open事件和BeforeClose事件. Workbook_Open事件 当打开工作簿时发生Workbook_Open事件. 在ThisWorkboo ...

  7. lua loadstring传递参数_lua学习之函数篇

    函数 函数是对语句和表达式进行抽象的主要机制 两种用法 一是可以完成特定的任务,一句函数调用被视为一条语句 二是以只用来计算并返回特定的结果,视为一句表达式 print("Hello, Wo ...

  8. vba中取小数点后两位数_Excel VBA之函数篇-3.24整数小数随意切换 如何取整你说的算...

    前景提要 按照计划,今天将会是函数篇的最后一节了,函数篇已经持续更新了23篇了,前前后后也是和大家分享了不少VBA中的函数知识,有些函数可能大家并不是很在意,因为他的功能并不是很强大,有些函数大家则是 ...

  9. python中redirect如何传值_flask的重定向(redirect)传递参数的方法

    flask中的重定向redirect方法常常被用来跳转页面,那redirect在跳转页面的同时能不能传递我们下一个页面需要的参数呢? 带着这个问题我看了redirect()的源码,如下: 1 def ...

最新文章

  1. 看了这篇 LeetCode 的刷题心得,再也不用抄别人代码了
  2. 手绘图解 | 机器学习最常见的30个基本概念
  3. Spark Machine Learning 03 Spark上数据的获取、处理与准备
  4. sql计算留存_免费教程《图解SQL面试题》
  5. 实战SSM_O2O商铺_27【商品类别】删除商品类别从Dao到View层的开发
  6. LeetCode 365. 水壶问题(最大公约数)
  7. cxf javax.xml.parsers.DocumentBuilderFactory.setFeature(Ljava/lang/String;Z)
  8. scikit-learn学习之神经网络算法
  9. 基于华为云CSE微服务接口兼容常见问题
  10. 工程师们,不要想一辈子靠技术混饭吃
  11. java内置的四大函数式接口
  12. (转)巴菲特的投资智慧--1998年的演讲
  13. c语言开方不是整数怎么表示,c语言中的开方本人自学c语言,想请问在c中类似开方,取绝对值这类的(也不知道应该算运算符还是函数什么的)都要怎么解决~麻...
  14. 完整的ERP流程图大全
  15. 区块链行业被攻击怎么办?
  16. Python学习—字典
  17. 在虚拟机里安装windows
  18. 使用JS创建条形码在线生成工具-toolfk.com
  19. Pandas 01- Series
  20. MySQL(进阶篇)

热门文章

  1. ADO.NET2.0的十大新特性
  2. 关于空值null的排序问题 mysql 和oracle
  3. flex页面布局练习--知乎
  4. SQL查询数据并插入新表
  5. Python数据可视化1.2 数据转换
  6. Android 关闭软键盘
  7. 戴尔新鲜空气制冷的研究:在数据中心里面,让我们脱掉厚夹克换上一件夏威夷衬衫!...
  8. effective java ---读书笔记一
  9. java 统计图 mysql_java实现各种数据统计图(转)
  10. 设计模式在Netty中的应用-工厂模式源码举例