如何在VBA中克隆Range对象

时间:2015-11-26 06:34:55

标签: excel-vba vba excel

我正在使用Excel Visual Basic编辑器在VBA中编写Excel宏。我无法弄清楚如何复制/克隆一个Range对象,而不是创建对同一个Object的第二个引用。

MemberwiseClone()函数似乎不可用。我认为它将用于内置类型。我需要自己实施吗?

在尝试解决这个问题时,我可能会在VBA,Visual Basic和Visual Basic .Net之间的区别中迷失方向。

1 个答案:

答案 0 :(得分:1)

虽然不一定是同一件事,但您可以通过根据范围的创建一个Variant对象来涵盖大多数用例。这样就产生了一个可变数组,您可以在内存中根据心脏的内容对其进行操作。

Dim originalRange As Range, rangeCopy As Variant
' ...
rangeCopy = originalRange.Value

要使其正常工作,需要考虑以下几点:

  • 该对象必须声明为Variant-不要声明Variant数组,否则它将失败。
  • 您显然只会从原始范围获得值。
  • 生成的Variant数组始终为二维-即使仅复制单个行或列(如果range仅是单个单元格,则Variant也不是数组)。将您的值命名为rangeCopy(row, column)
  • 将数组写回到工作表时,请确保将其写入与Variant数组大小相同的Range中。潜在地,您还需要调整单元格编号格式。

完整示例:

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

Result