首页 > 解决方案 > 关闭不同工作簿中的源范围后,包含范围的 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

标签: excelvba

解决方案


Set cls.myrange = ThisWorkbook.Worksheets(1).Range("E9:E12")

这会分配对变量范围的引用myrange而不是副本。

当你myrange的参考消失时,你的参考也是如此RangeRange

您不能单独存储 a 的实例Range- 它只能相对于 a 存在WorkSheet,如果您想要该范围内的数据副本,您可以将其复制到不同的工作表或使用 Variant获取2D 数组包含数据。


推荐阅读