首页 > 解决方案 > 在不连续的范围内向下移动行

问题描述

我正在使用由多个区域组成的范围,例如,

Dim rng As Range
Set rng = Application.Union(Range("A1:C5"),Range("A11:C15"))

该范围将在顶部有一些非空行,在底部有一些空行,我希望能够将非空行向下移动 1 以允许第一行中的新条目。编辑:移位应该跨越区域中的“中断”,即第一个区域的最后一行应该向下移动到第二个区域的第一行。

如果我有一个连续的范围,那么我可以这样做:

Dim rng1 As Range
Set rng1 = Range("A1:C10")
Dim j as Integer
[Some code to set j equal to the index of the last non-empty row]
With rng1
    .Parent.Range(.Cells(2,1), .Cells(j+1,3)).Value2 = .Parent.Range(.Cells(1,1), .Cells(j,3)).Value2
    .Parent.Range(.Cells(1,1), .Cells(1,3)).ClearContents
End With

但是,当范围分为两个区域时,我很难弄清楚如何干净地做到这一点。我的一个想法是rowindex(1 To 10)rowindex(1)=1,..., rowindex(5)=5, rowindex(6)=11,... 定义一个数组,rowindex(10)=15然后rowindex(j)j. 这不允许我像上面那样一步一步地向下移动所有内容,但我可以逐行进行:

Dim i as Integer
With rng
    For i = j To 1 Step -1
        .Parent.Range(.Cells(rowindex(i+1),1), .Cells(rowindex(i+1),3).Value2  = _
            .Parent.Range(.Cells(rowindex(i),1), .Cells(rowindex(i),3)).Value2
    Next i
    .Parent.Range(.Cells(rowindex(1),1), .Cells(rowindex(1),1)).ClearContents
End With

我的问题是:

  1. 有没有办法一步完成转变(即移除For i =循环)?
  2. 有没有比我的rowindex数组“更好”的解决方案(即运行速度更快、代码更少、可读性更强等)?我的解决方案的一个缺点是我对 的值进行硬编码,rowindex而不是从rng. 我认为这可以通过执行以下操作来解决:
Dim k As Integer
k = 1
For Each row In rng.Rows
    rowindex(k) = row.Cells.Row
    k = k + 1
Next

标签: excelvba

解决方案


您可以使用对象的Areas属性,该属性Range列出了 a 的每个组件Range

此代码提供了一个示例多范围。

Dim myRange As Range
Cells.Clear
Range("a1:c3") = 1
Range("e5:f6") = 2
Set myRange = Union(Range("a1:c3"), Range("e5:f6"))
myRange = 5

Areas之后,我们使用集合一次一个地遍历每个区域,并使用您的代码单独移动每个区域Area

For Each a In myRange.Areas
With a
j = a.Rows(1).Row + a.Rows.Count - 1
    .Parent.Range(.Cells(2, 1), .Cells(j + 1, 3)).Value2 = .Parent.Range(.Cells(1, 1), .Cells(j, 3)).Value2
    .Parent.Range(.Cells(1, 1), .Cells(1, 3)).ClearContents
End With
Next a

j变量存储子范围中的最后一行索引(第一行索引 + 行数 - 1)。


推荐阅读