【原创】VBA学习笔记(15)VBA的参数传递:ByVal 和 ByRef 的区别,VBA默认按byRef传递

52 篇文章 109 订阅
订阅专栏

1 参数传递时的 byVal 和 byRef 区别的简单总结

1.1 如果不写关键字, VBA默认按地址传递

  • VBA默认按地址传递,是为了方便管理?

1.2  什么是参数的调用和回调?

目的:

  • 主程序调用一些需要参数的子程序,为了给其他程序的主动传递变量,而调用其他程序(被调用程序),并获得回调后的参数
  • 主程序需要调用其他子程序,有些子程序(被调用程序)需要参数就必须传递参数过去。而被调用程序设置的参数关键字不同,会造成不同的调用和回调效果。

 

参数调用和回调的方法

  • 被调用的程序,可以设定2种传递方式,进而影响给主程序的回调值。
  • 也就是会不会受影响,不由主程序决定!而是由 需参数的被调用的程序自身决定。

1.3 参数调用的两种方式

  • byref ,被调用程序 按地址传递,传回主程序的参数,回调时会受影响。
  • 按地址传递(ByRef),是指主程序直接将数据交给子过程(过程中定义传递方式),在过程中修改、调试、返回给主程序,主程序输出的是修改后的值。
  • VBA默认的是 byref方式
  • byval  ,被调用程序 按值传递,传回主程序的参数,回调时会不受改变。
  • 按值传递(Byval),是指将主程序的值(副本一份)给子过程,过程对副本操作,主程序输出的仍是原值。若想输出值传递后的值,可在子过程中设置输出。

1.4 常量是不变化的

  • 只有变量有这个问题,常量怎么传递本身也不改变

2 例子1,比较byVal 和 byRef的区别

运算函数1:运算函数,定义了自身函数需要的参数,是传值,还是传地址。

                    其他函数在调用时,需要按这种方式传递参数

运算函数2:主函数:因为调用运算函数时,会根据运算函数设定的参数属性,所以主函数的参数发生改变了。

Sub test1(ByRef a)
Debug.Print "test1被调用"
Debug.Print "a=" & a
a = a + 1
Debug.Print "a=" & a
Debug.Print "test1调用结束"
End Sub

Sub test2(ByVal b)
Debug.Print "test2被调用"
Debug.Print "b=" & b
b = b + 1
Debug.Print "b=" & b
Debug.Print "test2调用结束"
End Sub

Sub main1()
Debug.Print "mian1开始执行"
Debug.Print "x=" & x
Debug.Print "y=" & y
x = 3
y = 4
Debug.Print "x=" & x
Debug.Print "y=" & y
Debug.Print "开始调用"
test1 x
test2 y
Debug.Print "调用结束"
Debug.Print "x=" & x
Debug.Print "y=" & y
Debug.Print "mian1执行完毕"
End Sub

执行结果

mian1开始执行
x=
y=
x=3
y=4
开始调用
test1被调用
a=3
a=4
test1调用结束
test2被调用
b=4
b=5
test2调用结束
调用结束
x=4
y=4
mian1执行完毕

3 例子2,如果不带关键字,默认为byref

  • 如果被调用函数的不带关键字,就默认为byref传递
Sub test1(a)
Debug.Print "test1被调用"
Debug.Print "a=" & a
a = a + 1
Debug.Print "a=" & a
Debug.Print "test1调用结束"
End Sub
 
Sub test2(b)
Debug.Print "test2被调用"
Debug.Print "b=" & b
b = b + 1
Debug.Print "b=" & b
Debug.Print "test2调用结束"
End Sub
 
Sub main1()
Debug.Print "mian1开始执行"
Debug.Print "x=" & x
Debug.Print "y=" & y
x = 3
y = 4
Debug.Print "x=" & x
Debug.Print "y=" & y
Debug.Print "开始调用"
test1 x
test2 y
Debug.Print "调用结束"
Debug.Print "x=" & x
Debug.Print "y=" & y
Debug.Print "mian1执行完毕"
End Sub

mian1开始执行
x=
y=
x=3
y=4
开始调用
test1被调用
a=3
a=4
test1调用结束
test2被调用
b=4
b=5
test2调用结束
调用结束
x=4
y=5
mian1执行完毕

4 例子3,继续试验

Sub test1(ByRef a)   '参数默认是按ref调用
Debug.Print "test1被调用"
Debug.Print "a=" & a
a = 1
Debug.Print "a=" & a
End Sub



Sub test2(ByVal b)
Debug.Print "test2被调用"
Debug.Print "b=" & b
b = 2
Debug.Print "b=" & b

End Sub

Sub main1()
Debug.Print "执行main1"
Debug.Print "x=" & x
Debug.Print "y=" & y
x = 3
y = 4
Debug.Print "x=" & x
Debug.Print "y=" & y
Debug.Print "开始调用"
test1 x
test2 y
Debug.Print "调用结束"
Debug.Print "x=" & x
Debug.Print "y=" & y

End Sub

执行结果可以看出

main1函数的x   会因为调用了其他运算函数,这个运算函数要求传地址,之后运算函数改变了a=x,从而x也被改变

而main1函数y参数,因为调用的函数是只需要按值传递,只传了一个副本给运算函数,自身y不会变化

执行main1
x=
y=
x=3
y=4
开始调用
test1被调用
a=3
a=1
test2被调用
b=4
b=2
调用结束
x=1
y=4

关于 byval 与 byref区别分析总结
10-30
关于 byval 与 byref区别分析总结
Byval 和 Byref区别
周江霄
07-22 1万+
在VB中,提高过程和和函数,一定少不了参数,参数传递时过程中非常重要的问题。通过实际参数和形式参数的传递可以实现调用过程和被调用过程之间的信息交换。在这里首先要明白实参和形参。举个例子吧: 假设定义一个过程: Sub Employee(Num As String,Name As String,Age As Integer)    ——>形式参数表 则调用这一个过程: Call Emplo
VB中的byRefbyVal
最新发布
千月星跡
07-30 421
byref会修改主调程序的变量值,而byval不会改变主调程序的变量值。
byrefbyval:一文读懂按地址传递(默认)和按值传递——vba
yongshiqq的博客
04-16 1099
按值传递Byval),是指将主程序的值(副本一份)给子过程,过程对副本操作,主程序输出的仍是原值。若想输出值传递后的值,可在子过程中设置输出。按地址传递(ByRef),是指主程序直接将数据交给子过程(过程中定义传递方式),在过程中修改、调试、返回给主程序,主程序输出的是修改后的值。由此可见,byref会修改主程序变量值,而byval不会改变主程序变量值。byval ,被调用程序 按值传递,传回主程序的参数,回调时会不受改变。byref ,被调用程序 按地址传递,传回主程序的参数,回调时会受影响。
VB中Byval与Byref区别
qq_18671205的博客
11-17 8424
1.byval是按值传递的方式,而byref是按地址的传递方式。 2.在程序中x是按值传递,而y是按地址传递,随后我们在程序中进行调用,因为在调用之前已经将z赋值为300,e赋值为400. 3.所以调用函数以后,按值传递的Z为300,而按地址传递的E则为200,e即使被赋值,因为它是根据地址进行传递的,所以值依然不变。 ...
VBA·编译错误:ByRef参数类型不符
SCscHero的博客
08-19 4296
阅文时长 | 0.34分钟 字数统计 | 550.4字符 主要内容 | 1、引言&背景 2、分析&解决原理 3、声明与参考资料 『VBA·编译错误:ByRef参数类型不符』 编写人 | SCscHero 编写时间 | 2021/8/19 AM12:3 文章类型 | 系列 完成度 | 已完成 座右铭 每一个伟大的事业,都有一个微不足道的开始。 一、引言&背景   完成度:100% a)..
以下是一个使用 VBA 的例子,演示了 ByVal 和 ByRef区别,以及如何在函数中传递参数和返回值。
QingYuanve的博客
06-13 747
【代码】以下是一个使用 VBA 的例子,演示了 ByVal 和 ByRef区别,以及如何在函数中传递参数和返回值。
chatgpt赋能python:Python中byref参数详解
test100t的博客
05-29 812
在Python中,byref参数指的是通过引用传递参数,也就是说传递的是变量的存储地址。当函数中传递的参数是一个对象引用时,函数内所有对该对象的修改都会影响到该对象在主调函数中的值。本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。🧡AI职场汇报智能办公文案写作效率提升教程 🧡专注于AI+职场+办公方向。
VB参数传递(传值ByVal与传址ByRef)[整理].pdf
10-20
VB 中的参数传递方式有两种:传值(ByVal)和传址(ByRef)。这两种方式决定了在过程调用时,主调过程和被调过程之间的数据传递方式。 传值方式(ByVal) 在 VB 中,传值方式是将实参的值复制一份给形参,因此实参...
Asp中通过简单的例子理解下ByVal和ByRef的用法
10-28
VB中形参声明有两种方式,一种是ByVal,一种是ByRef,如果是ByVal则在传递参数时将实参的一个拷贝传递给子程序,子程序对参数的修改不会影响原有参数。如果是ByRef,则将实参的指针传递给子程序,子程序对参数的修改...
.Net 下区别使用 ByRef/ByVal 的重要性 分享
10-27
在.NET编程环境中,理解ByRefByVal区别至关重要,因为它们直接影响到函数或方法中参数的传递方式,进而影响程序的性能和预期行为。这两者是VB.NET和C#等.NET语言中的两种主要参数调用约定。 ByVal是.NET默认的...
VBA参数传递ByVal 和 ByRef区别
LILI00000的专栏
02-26 560
VBA参数传递ByVal 和 ByRef区别
VBA函数传递参数方式
热门推荐
Gordennizaicunzai的博客
03-04 2万+
VBA函数传递参数值时分为Byval(值传递)和Byref(地址传递),用法上,分别相当于C/C++的值传递使用方法和引用传递使用方法。在VBA中,参数传递默认方式是Byref,因为本质想法是对于相同命名的参数,在系统中采用同一个数值。 '获取非空行 Function GetNotNullRow(ByVal iStartRow, ByRef iRow) Dim Rng As Ran
byrefbyval区别的正确理解
weixin_42150685的博客
03-27 2084
byrefbyval其实按照字面上的理解来说,一个按照地址传递或者说指针,一个按照值传递,两个区别是什么呢,大众理解就是,按地址理解就是直接把它地址传进来,对形参的操作将影响实参。而按值传递就是copy实参的值放到另一块内存地址上,也就是要开辟内存,这两者的区别,确实,这样的说法对于使用值类型来说没有毛病,但是假如对于引用类型来说呢?且看我先给大家看的两个测试: Module Module1 ...
函数的参数
zhangyiyang111的博客
12-18 251
1.2 函数参数 1.2.1 参数 如果函数中出现不确定的值,就可以作为参数 形参(形式参数): function 函数名(参数1,参数2) 实参(实际参数): 函数名(10) //单个参数 function sum(n){//var n; var s = 0; for(var i = 1;i<=n;i++){ s += i; } console.log(s); } //调用 sum(100); sum(200); //多个参数,多个参数之间用,隔开
写给初学者:VB 中 ByRefByVal 参数传递方式的区别
FrontGoggle
10-09 7472
简而言之,ByRefByVal区别在于参数源是否可以被函数修改,前者(默认方式)是可以被修改的,而后者是不能被修改的。例:Private Function Func(ByRef argv1 As String, ByVal argv2 As String)    argv1 = "I love WYC!"    argv2 = "I love WYC!"End FunctionF
VBA:值传递和引用传递
andy_2的专栏
10-21 1937
之前写的几篇关于VBA的文章时,处理的只是单一一个单元格,虽然对象是Range。不过今天发现,还需要处理同行相邻多个单元格,于是想,可否把这几个相邻的单元格一起copy到另一张excel表中。 当前A excel表中有:月租、通信费、信息费,分别位于AF\AG\AH列,存放的数据分别是广东省各个地市的。现在Ricki需要把属于某个地市的月租、通信费、信息费copy到B...
Python中的 ctypes 的用法(byref
Littlehero_121的博客
08-05 1万+
参考链接:https://www.cnblogs.com/adylee/p/10299157.html 以下内容主要摘抄以上博主博客 用途:可以直接调用二进制的动态链接库,python 写类似于 C 语言的程序,就不需要用其他语去写扩展了 一、 导入 C 类型 库(在python中加入引用) from ctypes import * 二、常用的类型如下: ...
VBA案例:去空数据和合并多列,延申问题,变量传递和跨sheet引用
奔跑的犀牛先生
06-29 1168
技巧的练习是非常必要的 但是技巧的练习的同时,也应该去摸原理,加深理解,理解了就不用记住了 比如 造兵时间UI? 时间描述 拆分为小时,分,秒 /3600 /60 ...
vbabyval和byref区别
04-11
ByVal和ByRef是Visual Basic中的参数传递方式。ByVal表示按值传递,即传递一个参数的副本,对副本进行操作不会影响原参数;而ByRef表示按引用传递,即传递一个参数的引用,对参数进行操作会影响原参数。
写文章

热门文章

  • VBA 数组定义,赋值,一维数组 56670
  • 【原创】VBA学习笔记(12)VBA的数组 array---基础知识(1) 56156
  • EXCEL的各种“空”的区别:blank,““ , 0 ,以及 VBA里的各种空值:empty,null,nothing 等 41247
  • EXCEL的换行符等,输入,替换,和 char(10) char(13)等 40262
  • VBA: 如何停止当前VBA程序(尤其是死循环)的运行,用程序停止其他程序,暂停程序等(未完成) 37891

分类专栏

  • 线性代数 9篇
  • 数学学习 3篇
  • maths--概率和统计 24篇
  • VBA基础知识 52篇
  • VBA实验 69篇
  • letcode
  • maths--数学杂学
  • 学习编程
  • code学习资料整理分享 7篇
  • 一个韭菜的自我修养 35篇
  • BAT命令行 19篇
  • HTML&CSS
  • microPython和pyboard 2篇
  • pygame游戏 1篇
  • cocos creator
  • python 53篇
  • Unity 12篇
  • cocos 4篇
  • 社会与人生 62篇
  • learn 6篇
  • VBA 92篇
  • EXCEL 99篇
  • 命令行 40篇
  • 爱与家庭 6篇
  • 游戏开发 5篇
  • ps
  • 机器学习 3篇
  • 爬虫 3篇
  • html&css 23篇
  • js
  • c#
  • microPython 2篇
  • git 7篇

最新评论

  • VBA跨表操作和取数据的各种问题,如跨表取其他EXCEL工作簿的sheet名

    奔跑的犀牛先生: 不是老师。。。

  • VBA跨表操作和取数据的各种问题,如跨表取其他EXCEL工作簿的sheet名

    奔跑的犀牛先生: Worksheets("统计").Cells(k, 1) 用这种worksheets().cells() 的方法应该就可以

  • 【小白学机器学习10】假设检验之1:F检验,F检验量的构造,F分布,F分布查表求P值等

    奔跑的犀牛先生: 是写错了,我修改,谢谢

  • 【小白学机器学习10】假设检验之1:F检验,F检验量的构造,F分布,F分布查表求P值等

    奔跑的犀牛先生: 是写错了,我修改,谢谢

  • VBA,判断数据类型的相关函数----修改

    奔跑的犀牛先生: 对,感谢,是写反了,我修改

大家在看

  • 高斯分布、均值与标准差:详细讲解与案例分析 1046
  • 【设计模式】11.深入理解 Java 中的观察者模式
  • 精通Java并发锁机制:24种锁技巧+业务锁匹配方案
  • 【设计模式】10.深入理解 Java 中的策略模式
  • GPT+Python)近红外光谱数据分析与定性/定量建模技巧

最新文章

  • 【小白学机器学习19】什么是量化分析(草稿)
  • 【小白学机器学习18】 为什么1类错误+2类错误的和不是1
  • 【小白学机器学习17】 概率论的认识论和方法论
2024年32篇
2023年100篇
2022年83篇
2021年57篇
2020年124篇
2019年292篇
2018年90篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家商场装饰玻璃钢卡通雕塑代理价格圣诞老人玻璃钢雕塑深圳斯嘉丽玻璃钢花盆安顺玻璃钢商场美陈深圳开业商场美陈云南玻璃钢雕塑商家玻璃钢和铸铜雕塑有什么区别松原景区玻璃钢雕塑厂家楼盘玻璃钢雕塑批量定制景观玻璃钢雕塑施工哪家好上海室内商场美陈生产企业商丘卡通玻璃钢雕塑深圳常见商场美陈制造江西玻璃钢雕塑厂商大理玻璃钢雕塑订购红色玻璃钢人物雕塑厂家现货佛像玻璃钢卡通雕塑定做价格新型玻璃钢造型雕塑北京中庭商场美陈价钱武都玻璃钢雕塑生产厂家景观玻璃钢雕塑制作设计厂家西宁仿真人物玻璃钢雕塑定做网红商场打卡美陈浙江玻璃钢花盆厂家成都创意玻璃钢雕塑定制北海玻璃钢景观雕塑小白兔园林玻璃钢雕塑厂家长沙玻璃钢公仔雕塑图片新密玻璃钢人物雕塑赣州玻璃钢雕塑厂招聘信息香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化