ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1406|回复: 5

大家好,关于function 会改变sub 参数的问题,请大师帮忙看下.

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-10-31 17:31 | 显示全部楼层 |阅读模式
下面这个例子:
Sub abc()
ReDim arr(1 To 3)
arr(1) = 5
arr(2) = ""
arr(3) = ""
crr = temp1(arr)
drr = temp2(arr)
End Sub

Function temp1(brr)
brr(2) = 6
temp1 = brr
End Function

Function temp2(brr)
brr(3) = 7
temp2 = brr
End Function



这样运行的效果得到:   
会让arr都改变为
arr(1)=5
arr(2)=6
arr(3)=7

crr(1)=5
crr(2)=6
crr(3)=""

drr(1)=5
drr(2)=6
drr(3)=7

而我想要的结果是:
arr不变.
arr(1)=5
arr(2)=""
arr(3)=""

crr(1)=5
crr(2)=6
crr(3)=""

drr(1)=5
drr(2)=""
drr(3)=7

请大侠指点小弟下,这个function 要怎么写才能得到所需要的效果,
function 的过程直接改变了sub里面的变量,如果让他不改变呢.
万分感谢



TA的精华主题

TA的得分主题

发表于 2012-10-31 19:53 | 显示全部楼层
我是初学者,反复单步追踪了楼主的程序,谈一点点粗浅理解吧:
看这句代码:crr = temp1(arr) 调用,Function temp1(brr), brr 是形参,arr 是实参,你传进去的就是arr 相当于你对arr 数组对象执行了temp1 方法,而temp1 方法实质上就是把该数组的第2个元素改变赋值然后传回去。
那么arr 是要一定改变的,就是这段代码的作用。
至于要保持arr 不变个人认为可以从2方面着手:1. 从对象本身方面,我为了保存arr 的初始值,我可以复制一个arr 把那个复制品作为参数传进temp1 方法,arr 没有被传进去,当然值是不变的。
                                          2. 从方法方面(函数),改变算法,当arr 传进来的时候,我先复制一个arr ,然后把那个arr 的副本改变执行原来的方法并返回,arr 值也是保持不变的。
                       个人比较认同第2种方法。                           

         

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-1 08:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
嗯,谢谢hehex ,我就是一直用第一种方法来写的程序,我记得之前好像看过在 Function 前面加个什么东西 privet static  什么的,但是我试了,好像也不行的.突然想不起来了.也不知道不是vba语言. 总记得好像有什么声明  可以让形参不改变实参的值.

TA的精华主题

TA的得分主题

发表于 2012-11-1 09:01 | 显示全部楼层
VBA 还真不清楚,其他语言真是有。不过我只是一个泛泛了解,比如Java 里面对固定形参不需变可用final 关键字,C++ 不记得了。
不过以楼主程序为例,假设有一个关键字我们为了举例姑且认为就是final 吧,你的Function (final brr) 然后把arr 传进来
那么执行到brr(2)=6 语句时是会报错的,程序编译会提示你final 的不容改变,因此你还是要修改方法的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-2 13:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
嗯,明白了,说的很有道理,非常感谢hehex 的帮助.让我明白了很多.受教了.....谢谢头像是大美女的不知道是美女还是帅哥的你.

TA的精华主题

TA的得分主题

发表于 2012-11-2 17:37 | 显示全部楼层
我试验了一下如果传一个const 的值进fuction, 那么是不会改变的。
需要在sub 外面用const 关键字定义一个值,比如:private const i=5 as integer
但是,const 关键字不能作用于数组,而且也没找到其他办法让VB6 传一个静态常量数组进fuction。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-22 19:35 , Processed in 0.028907 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表