VBA数组元素赋值疑问:修改原变量为何不影响数组内元素?
VBA自定义Type赋值数组后修改原变量不影响数组元素的原因
你定义的User是自定义值类型(UDT),而非引用类型的对象,这是问题的核心:
- VBA中值类型的赋值逻辑是复制完整数据副本:当执行
userList(0) = user1时,VBA会把user1里的所有字段值(firstName="Tom"、lastName="Hanks")完整复制到userList(0)的独立内存区域,两者从此是完全无关的两个数据实体。 - 后续修改
user1.lastName = "Cruise",只会改变user1自身内存里的字段值,不会对userList(0)的内存区域产生任何影响,所以数组元素的lastName不会跟着变化。
如果想要实现修改原变量后数组元素同步变化的效果,需要改用类模块(引用类型):
- 插入类模块,命名为
clsUser,在类中编写代码:
Public firstName As String Public lastName As String
- 修改测试代码(引用类型需用
New创建实例,Set赋值):
Sub test() Dim userList(1) As clsUser Dim user1 As clsUser Set user1 = New clsUser user1.firstName = "Tom" user1.lastName = "Hanks" Set userList(0) = user1 Debug.Print "0 userList(0).firstName=" & userList(0).firstName & " userList(0).lastName=" & userList(0).lastName user1.lastName = "Cruise" Debug.Print "1 userList(0).firstName=" & userList(0).firstName & " userList(0).lastName=" & userList(0).lastName End Sub
此时运行代码,数组元素的lastName会同步变为Cruise,因为userList(0)和user1指向的是同一个内存对象,修改其中一个会影响所有指向该对象的变量。
内容的提问来源于stack exchange,提问作者Lomic Legone
相关产品推荐
相关产品推荐

