You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

额外注意点

  1. 如果你的range属性是Excel原生的Range对象,赋值时一定要加Set关键字,否则会报错或者只复制单元格值,而非对象引用。
  2. 后续如果需要修改列表中某一个实例的属性,直接通过列表索引访问即可,比如Set actList(2).range = newTargetRng,这只会修改指定位置的实例,不会影响其他元素。

内容的提问来源于stack exchange,提问作者user3494110

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:41:45