ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 我用set把一个数组的内容赋值给另一个数组,为什么一旦一个改变另一个也改变?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-12-17 22:07 | 显示全部楼层
试了下,其他不会,字典果然如此

  1. Public arr, brr, crr, rng As Range, ran As Range
  2. Public d, dd
  3. Sub settest()
  4. arr = Range("B2:C3").Value
  5. Set rng = Range("B2:C3")
  6. Let brr = arr
  7. Set ran = rng
  8. arr = Range("B6:C7").Value
  9. Set rng = Range("B6:C7")
  10. MsgBox brr(1, 1)
  11. MsgBox ran.Address
  12. End Sub
  13. Sub test()
  14. Dim i%, ar, br
  15. Set d = CreateObject("scripting.dictionary")
  16. Set dd = CreateObject("scripting.dictionary")
  17. ar = Array("张三", "李四", "王五", "赵六", "韩七")
  18. br = Array("张三三", "李四四", "王五五", "赵六六", "韩七七")
  19. For i = 0 To UBound(ar)
  20.     d(ar(i)) = ar(i)
  21. Next
  22. MsgBox d(ar(0))
  23. Set dd = d
  24. d.RemoveAll
  25. For i = 0 To UBound(br)
  26.     d(br(i)) = br(i)
  27. Next
  28. MsgBox dd(ar(0))
  29. MsgBox dd(br(0))
  30. d.RemoveAll
  31. For i = 0 To UBound(ar)
  32.     d(ar(i)) = ar(i)
  33. Next
  34. MsgBox dd(ar(0))
  35. MsgBox dd(br(0))
  36. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2022-12-17 22:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
弄不好是个BUG,弄的好,说不定是个巧妙的应用

TA的精华主题

TA的得分主题

发表于 2022-12-18 15:36 | 显示全部楼层
aman1516 发表于 2022-12-17 22:09
弄不好是个BUG,弄的好,说不定是个巧妙的应用

弄不好是个BUG....不是的~~
字典是物件(object), range也是...其它大部份用set也是,
set RA = range("B1:B9")
set RB = RA

不管是對RA或RB操作改變, 都是同一對象~~
同一個人, 不管給他穿哪件衣服, 或叫他哪一個外號, 他還是他~~

李白..李太白..青蓮居士, 都同一人, 月下對影成三人...對月人還是只李白一人~~

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-12-19 23:00 | 显示全部楼层
joforn 发表于 2022-12-17 17:34
如果需要创建一个新的对象,应该使用New而不是Set,或是Let。
另外,数组应该使用Let而不是Set,Set只能针 ...

谢谢指点,d 和 dd是我事先建好的两个字典,如果想让dd字典的内容与d字典内容完全一样,最简单的方法是什么呢?不知道new或者let怎么用?能不能一句实现赋值操作?我现在只会循环

TA的精华主题

TA的得分主题

发表于 2022-12-20 09:47 | 显示全部楼层
renahu 发表于 2022-12-19 23:00
谢谢指点,d 和 dd是我事先建好的两个字典,如果想让dd字典的内容与d字典内容完全一样,最简单的方法是什 ...

首先,你得理解对象,由于系统内置核心的约定,你不可能创建两个完全一样的对象,所有的对象都是唯一的。
所以你只能创建两个对外接口数据完全一样的对象。

对象是什么,对象其实就是一块内存空间,在这内存空间内,定义了执行代码片断和数据区。在同一个系统进程内,所有相同类的代码片断内存应该是同一个内存区域,而所有的对象内的接口定义模块中,接口跳转都指向那一块程序运行区的各个函数接口,而数据定义区则指向各自专有的数据区内存。所以通常我们在编写代码时都只是写类代码,代码编译时只完成了接口定义和代码二进制化,而在代码真正执行到创建对象时,就会把类实例化,也就是申请一块内存地址,这块内存中包含了代码跳转接口以及数据初始化(使内存可读可写),这些操作都是内置运行约定,一般情况下是不可人为操控的,所以不可能创建两个相同的对象,至少对象指针都是唯一的。而对象赋值语句(Set),说白了,就只是复制了一个对象指针,所以不管一个对象被赋值到多少个变量中,实际被修改的都是同一片内存。
你的需求是得到两个数据相同的不同对象,那么对象克隆是唯一的选择,嗯,你用的是字典对象的话,那么把第一个字典的值全部写入一个新的字典是最简单的方式了,因为VBA没有单一个对象克隆语句。

TA的精华主题

TA的得分主题

发表于 2022-12-20 15:41 | 显示全部楼层
准提部林 发表于 2022-12-18 15:36
弄不好是个BUG....不是的~~
字典是物件(object), range也是...其它大部份用set也是,
set RA = range("B ...

是我的测试方法代码有问题吗,ran 并不会像字典那样同步更新

QQQQQQQQQ.png


TA的精华主题

TA的得分主题

发表于 2022-12-20 16:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
aman1516 发表于 2022-12-20 15:41
是我的测试方法代码有问题吗,ran 并不会像字典那样同步更新

我的意思是//
set rngA = range("A1:B5")
set rngB = rngA
rngA 與 rngB 都指向同一位址, 它們屬同一身份~~
'=====================
字典也同樣
set A = 字典物件
set B = A
A/B 只是翻個身~~兩者無異

TA的精华主题

TA的得分主题

发表于 2022-12-20 16:42 | 显示全部楼层
aman1516 发表于 2022-12-20 15:41
是我的测试方法代码有问题吗,ran 并不会像字典那样同步更新

字典就這樣//
Sub TEST_A99()
Dim A, B
Set A = CreateObject("Scripting.Dictionary")
Set B = A
A(1) = ""
A(2) = ""
B.Remove 1
MsgBox A.Count
End Sub

TA的精华主题

TA的得分主题

发表于 2022-12-20 19:58 | 显示全部楼层
所以,这种“量子字典”,只存在于字典中,
还有没有其他对象具有类似“量子纠缠” 的特性呢




您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-20 04:18 , Processed in 0.040888 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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