我正在使用 Excel Visual Basic 编辑器在 VBA 中编写 Excel 宏。我不知道如何复制/克隆范围对象,而不是创建对同一对象的第二个引用。
MemberwiseClone() 函数似乎不可用。我认为它将针对内置类型实现。我需要自己实现吗?
在尝试解决这个问题时,我可能有点迷失了 VBA、Visual Basic 和 Visual Basic .Net 之间的区别。
最佳答案
虽然不一定是同一件事,但您可以通过根据范围的值 创建一个Variant
对象来涵盖大多数用例。这会产生一个变体数组,您可以在内存中对其进行随心所欲的操作。
Dim originalRange As Range, rangeCopy As Variant
' ...
rangeCopy = originalRange.Value
要实现这一点,需要考虑一些事项:
- 对象必须声明为
Variant
- 不要声明 Variant 数组,否则会失败。 - 您显然只会获得原始范围内的值。
- 生成的 Variant 数组始终是二维的 - 即使只复制单个行或列(如果范围只是单个单元格,则 Variant 不是数组)。将您的值作为
rangeCopy(row, column)
处理。 - 将数组写回工作表时,请确保写回与变体数组大小相同的范围。您可能还需要调整单元格编号格式。
完整示例:
Sub RangeCopyTest()
Dim originalRange As Range, rangeCopy As Variant
With ActiveWorkbook.Worksheets(1).ListObjects(1)
' Range object
Set originalRange = .ListRows(1).Range
' Make a copy (into an array) - values only
rangeCopy = originalRange.Value
' Manipulate array
' Note: resulting array is ALWAYS 2-dimensional (row, column)
rangeCopy(1, 1) = 2
rangeCopy(1, 2) = "copy"
rangeCopy(1, 3) = rangeCopy(1, 3) - 1
rangeCopy(1, 4) = rangeCopy(1, 4) / 2
' Insert the copy back in
.ListRows.Add
.ListRows(2).Range.Value = rangeCopy
End With
End Sub
关于excel - 如何在 VBA 中克隆范围对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33932000/