excel - 关闭不同工作簿中的源范围后,包含范围的 Excel 类对象会丢失数据
问题描述
我想将一个范围复制到我编写的类对象中。只要范围源对象(工作簿)处于打开状态,它就可以工作。一旦我关闭范围源对象,我的类就会丢失它对该对象的信息......类中的其他信息被保留。
为什么会这样?范围不应该被复制到类对象中吗?无论如何在源对象关闭的情况下维护类中的范围信息?
这是我的例子。将其复制到模块中:
Sub Test_Class()
Dim cls As Class1
Dim arr
Set cls = New Class1
Set cls.myrange = ThisWorkbook.Worksheets(1).Range("E9:E12")
arr = cls.myrange 'Works
ws01.Range("G9:G12") = arr
Set cls = Nothing
Set cls = New Class1
Set cls.myrange = Workbooks("Other").Worksheets(1).Range("E9:E12")
Workbooks("Other").Close
arr = cls.myrange 'Fails on this line because object is lost
ws01.Range("G9:G12") = arr
End Sub
将其复制到名为 Class1 的类模块中:
Option Explicit
Private m_objmyrange As Object
Public Property Get myrange() As Object
Set myrange = m_objmyrange
End Property
Public Property Set myrange(ByVal objNewValue As Object)
Set m_objmyrange = objNewValue
End Property
解决方案
Set cls.myrange = ThisWorkbook.Worksheets(1).Range("E9:E12")
这会分配对变量范围的引用myrange
而不是副本。
当你myrange
的参考消失时,你的参考也是如此Range
。Range
您不能单独存储 a 的实例Range
- 它只能相对于 a 存在WorkSheet
,如果您想要该范围内的数据副本,您可以将其复制到不同的工作表或使用 Variant获取2D 数组包含数据。
推荐阅读
- list - 从 kotlin 中的字符串中查找对象的最佳方法是什么?
- reactjs - 现在是使用 React refs 的好时机吗?
- mysql - 使用 MySQL,我需要弄清楚如何获取两种数据类型(文本和日期)并以句子形式输出它们
- mysql - 选择已知日期范围内的行
- typescript - 为什么“let readIndex:0”不会导致 TypeScript 编译错误?
- octave - 如何修复:Octave 上的“匿名函数体必须是单个表达式”错误
- c++ - Vulkan.hpp Supbass 附件违反了验证层
- java - 在所有活动中共享数据的最佳方式是什么?
- unity3d - 如何通过一个图像目标随机显示多个视频
- python - 如何简化在 Pygames 中创建多个敌人?