【问题标题】:Copy and insert rows based off of values in a column根据列中的值复制和插入行
【发布时间】:2013-10-30 13:09:47
【问题描述】:

我正在尝试设置一个查找列“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

【问题讨论】:

    标签: excel if-statement next vba


    【解决方案1】:

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

    1. 您说数据在 Excel 表中。充分利用这一点
    2. 从下往上将行插入范围循环时。这可以防止插入的行干扰循环索引
    3. 不要使用Selection(即使你这样做了,你的逻辑也不会操纵 ActiveCell)
    4. 不要循环遍历整个列(即一百万行)。将其限制为表格大小

    这里是这些想法的演示

    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
    

    【讨论】:

    • 完美运行。谢谢克里斯
    • Chris 如果我想将这些新添加的单元格的数量更改为零,我该怎么做?
    • 不确定qty 是什么意思 - 这是列标题吗?
    • Yes QTY 将是列标题。它是 rColumn 中的值,当它插入新行并复制和粘贴数据时,我希望新行的数量变为 0。
    • QTY 是数量,根据该值,宏知道复制该特定行的次数。
    猜你喜欢
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 2019-09-19
    • 1970-01-01
    • 2018-12-09
    相关资源
    最近更新 更多