C#创建自定义类列表时值未正确保存的解决方法求助
解决VBA中自定义类实例存入列表后属性同步修改的问题
这个问题我之前帮人排查过好多次,本质是踩了VBA对象引用类型的坑——你一直复用同一个Actions实例,列表里存的全是指向这个对象的"引用指针",所以每次修改它的属性,列表里所有元素看起来都跟着变了。
问题根源
VBA里的自定义类属于引用类型,和数值、字符串这类值类型不一样。如果你只创建一次Actions对象,然后反复修改它的属性再添加到列表,列表里的每一项其实都是同一个对象的引用,而非独立的副本。就像你把同一个文件的快捷方式复制了一堆,改原文件内容,所有快捷方式打开的内容都会同步变化。
解决方案:每次循环新建一个类实例
核心思路很简单:每找到一个新的Range,就创建一个全新的Actions对象实例,而不是复用之前的那个。
直接上代码对比:
错误示例(复用同一个实例)
Dim currentAct As Actions Dim actList As New Collection ' 只创建一次实例 Set currentAct = New Actions Do While Not rng Is Nothing ' 修改同一个实例的属性 Set currentAct.range = rng ' 注意Range是对象,赋值必须用Set currentAct.Action = "匹配到的目标内容" ' 添加同一个引用到列表 actList.Add currentAct ' 继续查找下一个匹配项 Set rng = rng.FindNext(rng) Loop
修正后的代码(每次新建实例)
Dim currentAct As Actions Dim actList As New Collection Do While Not rng Is Nothing ' 关键:每次循环都新建一个独立的Actions实例 Set currentAct = New Actions ' 给新实例单独赋值属性 Set currentAct.range = rng currentAct.Action = "匹配到的目标内容" ' 将独立的实例添加到列表 actList.Add currentAct ' 继续查找下一个匹配项 Set rng = rng.FindNext(rng) Loop
额外注意点
- 如果你的
range属性是Excel原生的Range对象,赋值时一定要加Set关键字,否则会报错或者只复制单元格值,而非对象引用。 - 后续如果需要修改列表中某一个实例的属性,直接通过列表索引访问即可,比如
Set actList(2).range = newTargetRng,这只会修改指定位置的实例,不会影响其他元素。
内容的提问来源于stack exchange,提问作者user3494110
相关产品推荐
相关产品推荐

