excel - 如何在 VBA 中克隆范围对象

标签 excel vba

我正在使用 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

Result

关于excel - 如何在 VBA 中克隆范围对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33932000/

相关文章:

excel - VBA 创建突出显示的单元格列表

excel - WorksheetFunction.Transpose 更改数据类型

mysql - 如何使用 VBA 来展平 Excel 中数据在行之间拆分的表格?

excel - Visual Basic for Applications(VBA)编译错误: Procedure declaration does not match description of event or procedure having the same name

vba - 循环通过文件夹更改文件扩展名VBA

excel - 重新排列单元格Excel VBA

excel - 如何将基于列 A 重复名称的整行复制到 VBA 中的相应工作表中?

excel - 棘手的 Excel 查找

excel - 查找太小而无法显示内容的文本单元格

vba - 通过 GetTickCount 获取代码运行时并以特定方式格式化它