将复制的单元格从范围插入另一个范围内的空白单元格

时间:2017-03-09 22:39:10

标签: excel vba insert range

描绘数据和基础Excel文件的图像

Ranges example

Underlying excel file

问题以及我尝试过的内容

  • 我在这里有一个名为range 2的表,我想在名为range 1的表中的空白区域中插入,这样总的来说它看起来像是范围3.
  • 我尝试复制范围,然后选择范围1,使用:home - >标记空白区域。查找和选择 - >去特别 - >选择空白,然后插入复制的单元格。这失败了,我收到消息''这不能在多个范围选择上完成。选择单一范围并再试一次''。我进一步尝试使用记录宏工具来尝试VBA,但没有成功。
    • 注意:我有一个类似于范围1的更大的集合,具有完全相同的结构,需要填充空白单元格,否则我当然会手动完成此操作

2 个答案:

答案 0 :(得分:2)

Sub DoIt()
    Dim r1 As Range, r2 As Range, r3 As Range, cel As Range
    With Worksheets("Sheet1") ' <-- your own sheet name here
        Set r1 = .Range("B3", .Cells(.Rows.Count, "B").End(xlUp))
        Set r2 = .Range("G3", .Cells(.Rows.Count, "J").End(xlUp))
        Set r3 = .Cells(.Rows.Count, "L").End(xlUp).Offset(1)

        For Each cel In r1
            If Not IsEmpty(cel) Then
                r3.Resize(1, 4).value = cel.Resize(1, 4).value
                Set r3 = r3.Offset(1)
            Else
                r3.Resize(r2.Rows.Count, r2.Columns.Count).value = r2.value
                Set r3 = r3.Offset(r2.Rows.Count)
            End If
        Next
    End With
End Sub

答案 1 :(得分:0)

有几种方法可以解决您的尝试。如果你不得不重复做这两件事,你可以用VBA做什么

  1. 将范围1和范围2放在不同的工作表上
  2. 删除各自工作表上的范围1和范围2中的所有空行
  3. 然后复制范围1,然后复制范围2以汇总
  4. (这不会填充空隙,但会将它们聚合在一起,然后您可以轻松过滤或转动数据表)

    如果你想以复杂的方式解决它,你将不得不

    1. 遍历您的Range 1数据并记录所有空行
    2. 遍历范围2数据并记录有多少记录
    3. 遍历范围2并剪切每一行并粘贴范围1
    4. 中记录的空行
    5. 如果范围2中有更多行数据,则超出范围1
    6. 如果范围2中的数据行较少,则抛出错误或删除范围1中的其他空行
    7. (这需要比方法1更多的思考和逻辑,但它会像你最初要求的那样填补空白)

      这是让你入门的东西:

      Application.ScreenUpdating = False
      
      'set range limits
      endRange1 = 17
      endRange2 = 5
      Dim rowArray() As Variant
      
      'step 1
      For i = 3 To endRange1
          If Cells(i, 2).Value = "" Then
              range1EmptyRow = range1EmptyRow + 1
              ReDim Preserve rowArray(1 To UBound(rowArray) + 1) As Variant
              rowArray(UBound(rowArray)) = i
          End If
      Next i
      
      'step 2
      For i = 3 To endRange2
          If Cells(i, 7).Value <> "" Then range2Rows = range2Rows + 1
      Next i