根据列中的值复制和插入行

时间:2013-10-21 21:07:31

标签: excel excel-vba if-statement next vba

我正在尝试设置一个查找列“G”中单元格的过程,如果值大于1,则复制整个表格行,插入一行(多次 - 基于该值为1)和将该值粘贴到每个新插入的行中。

因此,如果单元格“G4”中的数量为3,那么我想复制该单元格的行并在其下方插入一行2次并粘贴复制的值。

以下是我到目前为止......

**请注意,所有这些都在Excel中的表格中。 (不确定这是否与我的代码有关)

Dim Qty As Range

 For Each Qty In Range("G:G").cells
  If Qty.Value > 1 Then
   Qty.EntireRow.cell
   Selection.Copy
   ActiveCell.Offset(1).EntireRow.Insert
   Selection.Paste
   Selection.Font.Strikethrough = True

 End If

 Next

 End Sub

1 个答案:

答案 0 :(得分:1)

您的方法和代码存在许多问题

  1. 您说数据位于Excel表格中。利用这个优势
  2. 从下向上将行插入范围循环时。这可以防止插入的行干扰循环索引
  3. 不要使用Selection(即使你的逻辑没有操纵ActiveCell)
  4. 不要遍历整个列(即一百万行)。将其限制为表格大小
  5. 以下是这些想法的演示

    Sub Demo()
        Dim sh As Worksheet
        Dim lo As ListObject
        Dim rColumn As Range
        Dim i As Long
        Dim rws As Long
    
        Set sh = ActiveSheet ' <-- adjuct to suit
        Set lo = sh.ListObjects("YourColumnName")
    
        Set rColumn = lo.ListColumns("YourColumnName").DataBodyRange
        vTable = rColumn.Value
    
        For i = rColumn.Rows.Count To 1 Step -1
            If rColumn.Cells(i, 1) > 1 Then
                rws = rColumn.Cells(i, 1) - 1
                With rColumn.Rows(i)
                    .Offset(1, 0).Resize(rws, 1).EntireRow.Insert
                    .EntireRow.Copy .Offset(1, 0).Resize(rws, 1).EntireRow
                    .Offset(1, 0).Resize(rws, 1).EntireRow.Font.Strikethrough = True
                End With
            End If
        Next
    End Sub