ByRef vs. ByVal

VBA核心原理深度解析:循环控制、参数传递与数据库对象 VBA作为Office自动化核心编程语言,其本质是基于COM的轻量级过程式语言,运行于宿主应用(如Excel/Access)的VB6兼容引擎中。理解其循环执行时序、ByRef/ByVal内存语义、DAO与ADO对象模型差异,是规避静默错误、提升代码健壮性的基础。尤其在Access开发中,DAO Recordset与窗体数据绑定的深度耦合,决定了事件驱动逻辑的正确性;而浮点舍入、定长字符串Len行为等细节,则直指VBA类型系统与底层内存表示。本文聚焦VBA真题高频失分点,结合字节码机制、调试实践与生产优化,系 阅读详情

 

VBS 中函数参数支持 ByVal 和 ByRef 两种传递方式,它们的区别是什么呢?

 

ByRef 表示传递的是指向对象的指针,函数体内修改变量值时将直接修改指针所指向的对象值,参数定义时如果没有声明为 ByVal 或 ByRef ,则默认为 ByRef ,例如:

msg = "DB MSG - Some junk from error message:SQL Err001"

Msgbox IsDBError(msg)

Msgbox msg

 

Function IsDBError(ByRef sMessage)   

       If inStr(sMessage, "DB") <= 0 Then       

              IsDBError = False       

              Exit Function   

       End If   

       sMessage = Replace(sMessage, "Some junk from error message:", "")   

       IsDBError = True

End Function

 

在这里调用 IsDBError 不仅返回布尔值,而且返回 ByRef 传递的修改后的变量值。

 

 

ByVal 表示传递的是对象的拷贝,函数体内修改的是局部变量的值。例如:

msg = "The field Value: abc"

Report msg

Msgbox msg

 

Function Report(ByVal Message)   

       Message = Replace(Message, "The field Value: ", "")   

       Msgbox (Message)

End Function

 

但是有个看起来像是例外的是 Dictionary ,例如下面的代码:

Sub AddValue(ByVal oDicationay)  

       oDicationay.Add "Some", "Thing"

End Sub

 

Set oDic = CreateObject("Scripting.Dictionary")

Call AddValue(oDic)

Msgbox oDic.Containes("Some") 'What will this print ,True or False?

按理, ByVal 是传递变量的拷贝,因此跳出 AddValue 函数体外之后应该取原来的变量值,但是这里脚本执行的结果是 True ,表明 AddValue 函数体内对变量值进行了直接的修改,其行为相当于 ByRef 。

 

原因是 oDic 对象并不是真正的 Dictionary 对象,而是指向 Dictionary 对象的指针,因此传递给 AddValue 的也不过是指针而已,最终修改的还是所指向的同一个 Dictionary 对象!

 


再来看下面的例子:

Sub DoIt(ByVal oDictionary)   

       oDictionary.Add "1", "1"   

       Set oDictionary = Nothing

End Sub

 

Sub DoIt2(ByRef oDictionary)   

       oDictionary.Add "2", "2"

       Set oDictionary = Nothing

End Sub

 

Set oDic = CreateObject("Scripting.Dictionary")

Call DoIt(oDic)

MsgBox oDic.Count 'What will this print?

Call DoIt2(oDic)

MsgBox oDic.Count 'What will this print?

 

两个 Sub 中都用了 Set oDictionary = Nothing ,但是由于 ByVal 和 ByRef 的不同而产生不一样的结果:

第一个 Sub 中, ByVal 传递的是指向 oDic 对象的指针拷贝,因此设置为 Nothing 释放的是 oDictionary ,而不是 oDic ,因此 MsgBox 能显示 oDic 的 Count 属性值。

而第二个 Sub 中, ByRef 传递的是指向 oDic 对象的指针,因此设置为 Nothing 释放的就是 oDic 本身,因此后面的 MsgBox 尝试显示已被销毁的 oDic 对象的属性值时发生错误:缺少对象‘ oDic ’ !

 

 

VS.NET教程示例复现:VB.NET迁移与三层架构避坑 语言迁移不只是关键字替换,类型系统、默认参数传递和程序集边界都会改变代码语义。以 VB.NET 迁移 为例,VB6 到 VB.NET 的 ByRef/ByVal 默认值变化、整数位宽调整、属性过程合并与命名空间叠加,都会造成“能编译但结果错”的隐蔽问题;而三层架构通过 UI、BL、DB 的职责边界和接口契约,把业务规则、数据访问与界面交互解耦。掌握这些基础原理,有助于在老项目升级、VS.NET 教程示例复现和订单查询等场景中定位问题,并自然落到可编译的最小工程与避坑清单上。 阅读详情

相关推荐

VB.NET三层架构落地与VB6迁移避坑:把教程PPT变成可编译代码

三层架构是一种把用户界面、业务逻辑和数据访问解耦的经典设计模式,其原理是通过单向依赖与接口抽象约束调用方向,让业务规则不依附于窗体或数据库。落到VB.NET工程实践中,UI层只负责收集与展示,BL层承担校验和事务边界,DB层用参数化查询完成读写,配合依赖注入可显著提升可测试性与可维护性。掌握这些基础概念,对课程设计、老系统维护和VB6迁移尤其关键,因为类型位宽、默认传参、访问修饰符和根命名空间等差异常导致静默错误。围绕一份VS.NET入门教程PPT,内容进一步拆解三层骨架、VB6到VB.NET语法替换和常见

weixin_30512965的博客 272

VBScript的中ByRef和ByVal的不同

在VBScipt中ByRef表示的是地址的变化,而ByVal表示的是值得变化,比如 Dim i,j i=1 j=1 Function ByRefValue(ByRef val1) val1=val1+1 End Function Function ByValValue(ByVal val2) val2=val2+1 End Function ByRefValue i ByVa

markson__0328的博客 1163

VB6迁移VS.NET完全指南:语法差异、数据类型重映射与三层架构落地

在现代.NET开发体系中,从VB6迁移到VB.NET不仅是IDE的切换,更涉及语言底层规则的全面重构。Integer类型由16位升至32位、参数传递默认值从ByRef改为ByVal、Property Let/Set被统一为Property块,这些语法演进决定了老代码编译通过却未必行为一致。理解关键字到框架类方法的映射、访问修饰符的边界、继承与重载的分工,是掌握VB.NET面向对象编程的基础。三层架构作为企业级项目的标准范式,将UI、BL、DB层职责清晰分离,结合ADO.NET参数化查询与结构化异常处理,可显

weixin_33428613的博客 234

ByVal和ByRef有什么区别

VB中ByVal和ByRef有什么区别原理:        byval 是按值传送,在传的过程中不会改变原来的值,仅仅传送的是一个副本,                而 byref 相反,从内存地址来说,后者是同一个内存地址 区别:       就是变量如果以ByVal传递给过程,过程里有代码对这个变量做了更改,在过程结束返回后这个变量还是调用过程前的值,不会变化,变量如果以ByRe

sono_yin的专栏 2263

VB.NET入门知识地图:三层架构、命名空间与VB6迁移易错点

在 .NET 桌面业务系统开发中,分层架构与面向对象语法是理解代码组织方式的基础概念。三层架构把 UI、BL、DB 的职责边界划清,命名空间和访问修饰符则决定类型如何分组、成员在项目与派生类中的可见范围;参数默认传递方式从 ByRef 转向 ByVal、Integer 与 Long 的位宽重排,又直接影响 VB6 迁移后的运行结果。掌握这些原理,能避免编译通过但数据长度、副作用或访问范围悄悄变化的问题,提升代码复用性与可维护性。对于需要把零散语法串成工程地图的 VB.NET 入门者,类、继承、属性、异常与迁

weixin_31423955的博客 261

彩虹期权定价

彩虹期权的定价较为复杂,因为它涉及多个标的资产的联合分布。蒙特卡洛模拟(Monte Carlo Simulation):通过模拟多个标的资产价格路径,计算期权的预期支付。解析近似方法:如马尔可夫链近似方法或多变量Black-Scholes公式的扩展。数值方法:如有限差分法或傅里叶变换法,适用于某些特定条件下的多资产期权定价。由于彩虹期权涉及多个标的资产,我们通常使用蒙特卡洛模拟来进行定价。接下来,我将演示如何使用Heston模型和蒙特卡洛模拟方法来定价彩虹期权。

智能科技前沿 1856

ByVal与ByRef的区别

1、引用参数(ref)在可以作为引用参数在函数成员调用中传递之前,必须已明确赋值,而输出参数(out)在可以作为输出参数在函数成员调用中传递之前不一定要明确赋值,在该函数成员正常返回前都必须已明确赋值。 2、在函数内部,引用参数(ref)被视为初始已赋值,输出参数(out)被视为初始未赋值。 3、默认地,C#中的所有参数都是值传递。只有在参数的修饰符中明确包含out或ref,才是引用传递。

YC.PENG的专栏 1475

SAP系统中PP模块全配置文档

配置路径IMG>SAP NetWeaver>常规设置>维护日历>工厂日历事务代码SCAL要求传输工厂代码描述日历代码日历描述起始日期星期一星期二星期三星期四星期五星期六星期日有效开始日期有效结束日期1000南微医学工厂MT南微医学工厂日历√√√√√√√201820502.4定义工厂配置路径IMG>生产>物料清单>常规数据>定义BOM状态事务代码OS23要求传输配置路径IMG>生产>主数据>资源>常规数据>标准值>定义参数。

yanzibing99的博客 1889

VBA中Call与Application.Run的深度对比:静态绑定与动态调用的实战选择

在VBA编程中,过程调用是实现代码复用的核心机制。从原理上讲,过程调用分为静态绑定与动态绑定两种方式,前者在编译时确定调用关系,后者在运行时解析。静态绑定通过Call语句实现,它确保了类型安全和编译时检查,是结构化编程的基石,适用于模块内部紧密协作的场景。动态绑定则通过Application.Run方法实现,它允许通过字符串动态指定宏名,突破了作用域限制,支持跨工作簿调用和运行时决策,为构建可配置、插件化的自动化框架提供了可能。这两种方式在参数传递机制上也有差异,Call支持按引用传递,而Run总是按值传递

weixin_29597551的博客 346

tkinter使用label视频播放

tkinter是python的界面开发包 使用tkinter显示视频流的一个办法是使用label来逐帧显示图片。 from Tkinter import * from PIL import ImageTk, Image import cv2 root = Tk() # Create a frame app = Frame(root, bg="white") app.grid() # Create a label in the frame lmian = Label(app) lmain.grid(

六十英里的专栏 5526

io_uring vs epoll ,谁在网络编程领域更胜一筹?

简介:从定量分析的角度,通过量化 io_uring 和 epoll 两种编程框架下的相关操作的耗时,来分析二者的性能差异。 本文作者:王小光,「高性能存储技术SIG」核心成员。 背景 io_uring 在传统存储 io 场景已经证明其价值,但 io_uring 不仅支持传统存储 io,也支持网络 io。io_uring 社区有众多的开发者尝试将 io_uring 用于网络应用。我们之前也在《你认为 io_uring 只适用于存储 IO?大错特错!》中也探索过 io_uring 在网络场景的应用及其

阿里云云栖号 3034

使用EnumWindows函数通过Windows进程ID获取窗口句柄实例(VB.NET2019)

本文通过已知窗口的进程ID获取窗口句柄的实例来浅谈EnumWindows函数使用、委托函数的定义及其意义、ByVal和ByRef的区别。

mengxiangde的博客 6639

EPS+ArcGIS+CASS三剑客:等高线裁剪的完整工作流与避坑指南

本文详细介绍了EPS、ArcGIS和CASS三款软件在等高线裁剪中的协同工作流程与避坑指南。通过发挥各软件优势,解决数据完整性、拓扑准确性和流程可靠性等核心挑战,提升40%以上的工作效率。特别适合大型测绘项目中复杂地形的处理,涵盖数据准备、核心处理到后期优化的全流程。

weixin_30352645的博客 617

vb6 VS vb.net int数据类型

vb6没有short类型,只有integer(Int16),long(Int32) vb.net有short(Int16),integer(Int32),long(Int64) 所以,注意转换。 另外,ByRef: 传地址;ByVal:传值 转载于:https://www.cnblogs.com/jonson1126/archive/2013/01/18/2865897.html...

weixin_30480583的博客 493

工程师必读一次性讲明白系列(十三)眼图、阻抗匹配、信号一致性、射频匹配、电磁感应

概念主要作用影响因素解决方法眼图评估信号质量,显示失真和噪声噪声、信号失真、时序抖动改善信号源、使用低噪声组件阻抗匹配避免信号反射,提高传输效率阻抗不匹配、传输线路特性使用匹配电路、适配器信号一致性保证信号稳定准确传输传输线路、噪声干扰使用屏蔽、滤波器,选择合适线路射频匹配确保射频信号高效传输天线设计、阻抗不匹配使用射频匹配器、调整天线设计电磁感应防止电磁干扰对信号的影响设备之间的电磁干扰(EMI)屏蔽、接地、滤波器。

weixin_43199439的博客 156

终于搞定!Cloudflare Tunnel 报错 Error 1033,一次完整修复记录

最近遇到了 Cloudflare Tunnel Error 1033 报错的问题,本文记录了完整的排查和解决方案💡

XiaoqiangClub的博客 1748

vb.net 教程 2-9 过程

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 过程,也或直接称为方法、函数。 Sub过程(子过程)和Function(函数过程) 基本的语法: 访问级别 Sub 函数名称(ByVal/ByRef 参数 as 类型, ByVal/ByRef 参数2 as 类型……) 语句块 end sub 访问级别 Function 函数名称(ByVal/ByRef 参数 as 类型, ByVal/ByRef 参数2 as 类型……) as 类型 ..

chinaherolts2008的博客 463

innovus:NRDB-2276 special net route layer与NanoRouteMode route layer冲突问题解决方法

NanoRouteMode中设置绕线层次2-6,但是被动到的special net有8-11的preferred route layer,这个层次可能是create_route_type+set_ccopt_property -net_type 定义的。二者绕线层次范围有冲突,导致在调整过这条net后再绕线就会提示失败。然后再下route_design 等route命令去绕别的net。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1099

VBA Brush Up 04:Passing Arguments to Procedures and Functions

来自:Julitta Korol,“Access.2003.Programming.by.Example.with.VBA.XML.and.ASP”,by Wordware Publishing, Inc. 2005, p52-p75Technorati 标签: byval,byref,argument,parameter,call,ismissing,optional,VBA

843

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【机房重构之积累】

前言: 进入个人机房重构有一段时间了,这次的机房收费系统加入了七层,应用vb.net语言等等,学习了新的东西,这篇文章主要讲vb.net在机房这个系统的小知识。本篇主要介绍四个知识点: 核心:   (一)、传参与传实体           在机房重构开始的时候,一直是传实体,但是实体和值所占的空间可是差的很多。   传实体:什么是传实体呢?在机房个人重构的时候,我们定义了一个实体

展翅的雄鹰 854

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

HoRain云--ASP子程序与函数实战指南

本文详细介绍了ASP中子程序(Sub)和函数(Function)的使用方法。主要内容包括:基础子程序的定义与参数传递方式,函数的定义及递归函数实现,高级特性如错误处理和数据库操作,实用工具库的开发,以及性能优化技巧。文章通过大量代码示例展示了ASP编程的最佳实践,包括使用Option Explicit、合理组织代码结构、实现完善的错误处理机制、优化数据库访问等。最后总结了ASP开发的注意事项,帮助开发者编写更高效、可维护的ASP应用程序。

2401_86544677的博客 368

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

VB中Function与Sub的实战对比:何时用函数?何时用子程序?

本文深入对比了VB中Function与Sub的核心区别与适用场景。Function用于计算并返回结果,如数据验证和业务计算;Sub用于执行操作流程,如界面初始化和数据保存。掌握何时使用函数或子程序,能显著提升代码的清晰度与可维护性。

metaverse5vr的博客 428

<<读书笔记>>系列--《VB2005-菜根谭》注释版

实际作者的意图是解释一些VB2005(VS2005)相对于VB2003的高级特性,或者是一些2003中容易忽略的特性。以便帮助那些VB2003的同学快速升级到VB2005。 余过古刹,于残经败纸中拾得《VB2005-菜根谭》一录,似某一人或某一群人琐事记载,又似一些观点零散发布。翻视之,虽断断续续,然于身心性命之学,实有隐隐相发明者。亟携归,重加校雠,缮写成帙。 旧有序,文...

263
上一篇: 在DataTable中如何保留数据格式?
下一篇: 零基础QTP自动化测试培训大纲
TIB
TIB
博客等级 码龄19年 2879粉丝 957原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值