专栏首页Excel和Access学习笔记过程(四)传地址和传值

过程(四)传地址和传值

上节介绍了过程的传递参数部分内容,即实参与形参的结合。

在VBA中实参可以通过两种方式将数据传递给形参,分别为传地址和传值,都是在创建通用过程定义变量时。

由于概念生硬不易理解,还是先说示例,再总结介绍。

一、 传 地 址

传地址是VBA默认的数据传递方式,在定义过程时,如果形参前面有关键字ByRef或者省略,则该参数通过传地址的方式传递。下面先看示例:

首先在模块中创建jisuan过程,ByRef a As Integer为按地址将实参传递给形参。

创建diaoyong过程,先定义了整型变量b,给b赋初始值为2。然后调用jisuan过程,将变量b作为实参按地址传递给变量a,进行计算a=a+1。此时再在立即窗口中显示变量b,就会发现它已经经过计算变成了3。

这是因为在调用过程时,将变量b做实参按地址传递给变量a,变量b和变量a指向同一个内存单元,一起变化。

注 意 点

1、前面说过sub过程通常不能返回运算结果的,如果需要返回值时,是可以利用ByRef方式来定义形参,这样就可以将子过程的运算数据返回调用程序中。

2、当形参定义为ByRef形式时,只有当实参为一个变量时,才能按地址方式传递参数,如果实参是一个表达式或者常量,则不能按传地址方式传递。

二、 传 值

传值是将实参的值作为一个副本,赋值给形参。定义过程中,在形参面前添加ByVal关键字,则该参数就按传值方式传递。

将上面示例中传地址的方式改成传值方式再运行一次,对比下结果。

在jisuan过程,ByVal a As Integer为按值将实参传递给形参。

在diaoyong过程,先定义了整型变量b,给b赋初始值为2。然后调用jisuan过程,将变量b作为实参按值给变量a,进行计算a=a+1。此时再在立即窗口中显示变量b,b的值仍为2。

所以使用传值方式传递参数时,传递的只是变量的副本,类似于一次赋值操作,改变只是在jisuan过程中,而再调用过程diaoyong中变量的值没有改变。

传地址与传值对比

两种方式,在程序中使用传地址方式比传值方式效率高,但是传地址方式中,有可能对程序产生不必要的影响。

为了在实际当中应用,一些原则可供参考:

1,形参如果是数组、自定义变量、对象变量,则只能用传址方式

2,形参前用了Byval,或者对应参数是常数、表达式,都是传值方式

3,形参前为Byref,或者没有关键词,都是传址方式。

4,实参为变量,且变量放在括号内,如“(a)”,则为传值。这种情况不多见

“传址”还是“传值”,该怎么选择呢?

1,如果希望通过过程调用,并修改对应实参的数值,用传址

例如:要实现两个变量值的交换,宜用传址

例如:要计算三个数的累加和额函数过程,在定义形参时,宜用传值。因为不希望在函数调用后,这三个参数值有什么改变

2,传址方式的速度快,但增加了过程的相互牵连;也不利于程序调试。而传值则相反

在实际中,可以先用传值方式,等调试后,再改为传址方式

3,用传址方式,要求实参与形参的数据类型完全一致


本节主要介绍过程的参数传递问题,重点是区分传地址和传值两种方式,结合示例去理解。(对于实参是数组的一类,后期介绍完数组的之后会补充。)

下一节将介绍可选参数和可变参数。祝大家学习快乐。


本文分享自微信公众号 - Excel和Access学习笔记(excel-note),作者:无言之月

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

原始发表时间:2019-04-16

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • VBA程序的变量和常量

    大家好,在本节就主要介绍变量和常量,主要掌握声明变量和变量赋值,变量的作用域和存活期需要理解。

    无言之月
  • VBA程序控制结构概述

    大家好,本节的主要内容是简单介绍下VBA编程中的基本程序控制结构,然后用其中一种结构的语句来简单举例,目的是让大家先对控制结构有整体的印象,然后引出变量和对象两...

    无言之月
  • Range单元格对象常用属性(二)

    Range单元格对象的常用属性,本节主要介绍单元格对象的End属性和Count属性。

    无言之月
  • Serverless Registry最佳操作实践

    在不久前的Serverless Days大会中,我们发布了Serverless Registry这个基于Serverless Framework的开源应用商城。...

    云大学小编
  • thinkphp3.2同时连接两个数据库的简单方法

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对ZaLou.Cn的支持。

    砸漏
  • thinkphp3.2.3框架动态切换多数据库的方法分析

    本文实例讲述了thinkphp3.2.3框架动态切换多数据库的方法。分享给大家供大家参考,具体如下:

    砸漏
  • Thinkphp连接Oracle

    'DB_TYPE' => 'oracle', // 数据库类型 'DB_HOST' => 'XXXXXXX', //...

    苦咖啡
  • 熵、交叉熵和KL散度的基本概念和交叉熵损失函数的通俗介绍

    为了开始了解熵到底指的是什么,让我们深入了解信息理论的一些基础知识。在这个数字时代,信息是由位(0和1)组成的。在通信时,有些位是有用的,有些是多余的,有些是错...

    deephub
  • java编程思想第四版第六章总结

    用户7798898
  • 程序员提高效率之自我驱动的秘诀

    一年多以前,参加过公司的一个『Management 3.0』培训。遗憾的是,没学会怎么当管理者,倒是学会了怎么驱动自己去做更多的事。 需求与驱动力 人呐,主动做...

    Phodal

扫码关注云+社区

领取腾讯云代金券