【问题标题】:Excel VBA - Loop to copy row beneath certain valueExcel VBA - 循环复制低于特定值的行
【发布时间】:2016-06-26 14:04:12
【问题描述】:

我有一个电子表格,其中包含多个标题样式的行。我想使用脚本复制每个标题下方的行。我目前有一个 3 岁的 StackOverflow 答案:

Private Sub CommandButton4_Click()

    Dim i As Range

    For Each i In Sheet1.Range("A1:A1000")
        Select Case i.Value
            Case "HERE"
                Sheet3.Range("A" & Sheet3.Rows.Count).End(xlUp).Offset(1, 0).EntireRow.Value = i.EntireRow.Value
            Case Else

        End Select
     Next i

End Sub

这可行,除了它复制标题本身(HERE),而不是它下面的数据。我还是 VBA 的新手,所以我不知道如何调整它。我尝试过类似Dim j As Integer,然后是j = i + 1 和j.EntireRow 等,但这不起作用,因为i 是Range 而不是Integer。我对 VBA 的了解还不够,无法使其正常工作。

有什么建议吗?谢谢!

编辑:除了复制标题下方第一行的情况之外,我还可以修改它以复制标题下方的x 行吗?例如,一旦找到标题,复制接下来的三行。再次感谢!

【问题讨论】:

  • 你能显示你的标题吗?以及要复制到工作表 3 的数据?以便于理解
  • @NanAvanIllai 我相信标题中的第一个单元格将始终是“项目编号”。那将是我的指示,即下一行将是我想要复制的内容。另请参阅我的编辑。

标签: excel vba


【解决方案1】:

使用Offset(1, 0) 属性和范围i 来获取i 的下一行:

Sheet3.Range("A" & Sheet3.Rows.Count).End(xlUp).Offset(1, 0).EntireRow.Value = i.Offset(1, 0).EntireRow.Value

编辑:您可以使用它来复制所有行,直到遇到下一个“HERE”:

Private Sub CommandButton4_Click()

    Dim i As Range

    For Each i In Sheet1.Range("A1:A5")

        If i.Value = "HERE" Then
            Sheet3.Range("A" & Sheet3.Rows.Count).End(xlUp).Offset(1, 0).EntireRow.Value = i.Offset(1, 0).EntireRow.Value
        ElseIf i.Value <> "" Then
            Sheet3.Range("A" & Sheet3.Rows.Count).End(xlUp).Offset(1, 0).EntireRow.Value = i.EntireRow.Value
        Else
            'Else is optional, feel free to remove if not required
        End If

     Next i

End Sub

表 1:

 A   |   B  |  C
HERE |      |   
11   |  11  |  11
33   |  33  |  33

HERE |      |    
22   |  22  |  22

表 3:

 A   |   B  |  C
11   |  11  |  11
33   |  33  |  33 
22   |  22  |  22

Edit2:它复制所有行紧接着单词“here”(不区分大小写,注意使用UCase):

Private Sub CommandButton4_Click()

    Dim i As Long
    Dim j As Long
    Dim lastRow As Long
    Dim blankRow As Long

    i = 1
    lastRow = Sheet1.Range("A" & Sheet1.Rows.Count).End(xlUp).Row
    blankRow = Sheet3.Range("A" & Sheet3.Rows.Count).End(xlUp).Row + 1

    Do While True

        If UCase(Sheet1.Range("A" & i).Value) = "HERE" Then

            j = Sheet1.Range("A" & i).End(xlDown).Row

            Union(Sheet1.Range("A" & i + 1).EntireRow, Sheet1.Range("A" & j).EntireRow).Copy
            Sheet3.Range("A" & blankRow).PasteSpecial xlValue

            blankRow = Sheet3.Range("A1").End(xlDown).Row + 1
            i = j + 1

        Else
            i = i + 1
        End If

        If i >= lastRow Then
            Exit Do
        End If

    Loop

End Sub

表 1:

 A   |   B  |  C
HERE |      |   
11   |  11  |  11
33   |  33  |  33

55   |  55  |  55

HERE |      |    
22   |  22  |  22

44   |  44  |  44    

表 3:

 A   |   B  |  C
11   |  11  |  11
33   |  33  |  33 
22   |  22  |  22

【讨论】:

  • 看起来不错,我会尽快测试并通知您。不知道可以这样使用偏移量
  • 您的编辑效果很好,除了一个小问题 - ElseIf 将复制工作簿中在 A 列中具有非空白值的其他行。我只希望 ElseIf 复制如果 A 列中具有非空白值的行位于 A 列中具有“HERE”的行的正下方。有什么想法吗?谢谢。
  • This 和 this 可能是理解 Edit2 的好读物。我希望它能满足您的要求。
  • 请注意Edit2中的重要修改:i &gt;= lastRow
【解决方案2】:

根据我的理解,我修改如下。

Private Sub CommandButton4_Click()
    Dim i As Long
    lastcolumn = Cells(1, Columns.Count).End(xlToLeft).Column
    For i = 1 To lastcolumn
        If Cells(1, i) = "HERE" Then
            Range(Cells(2, i), Cells(4, i)).Copy Sheet3.Range("A" & Sheet3.Range("A" & Rows.Count).End(xlUp).Row + 1) ' Here i have copied 2nd row to 4th row. Modify this as per your wish
        End If
    Next i
End Sub

表 1:

表 3:

编辑 1

如果要将行复制到列中的另一个 HERE,请替换以下代码。它会起作用的。

Private Sub CommandButton4_Click()
    Dim i As Long
    lastcolumn = Cells(1, Columns.Count).End(xlToLeft).Column
    For i = 1 To lastcolumn
        If Cells(1, i) = "HERE" Then
            'lastrow = Columns(i).SpecialCells(xlLastCell).Row
            lastrow = Columns(i).Find("HERE").Row
            Range(Cells(2, i), Cells(lastrow, i)).Copy Sheet3.Range("A" & Sheet3.Range("A" & Rows.Count).End(xlUp).Row + 1)
        End If
    Next i
End Sub

【讨论】:

  • 这看起来不错,谢谢。您知道如何修改它然后复制“HERE”下的所有行,直到它到达另一个“HERE”?此时它将继续该过程
  • 通过更改此Range(Cells(2, i), Cells(4, i)).Copy
  • 如果您想将第二行复制到 1000,那么它将是 Range(Cells(2, i), Cells(1001, i)).Copy。希望对你有帮助
猜你喜欢
  • 1970-01-01
  • 2018-03-02
  • 2017-02-12
  • 1970-01-01
  • 2018-04-05
  • 2012-12-17
  • 2015-12-02
  • 2017-08-08
  • 1970-01-01
相关资源
最近更新 更多