VBA:根据单元格值将Excel行移动和删除到其他工作表

时间:2018-09-11 10:55:00

标签: excel vba excel-vba

我当前正在创建一个工作表,该工作表将Excel中包含文本“ Voltooid”单元格的行移动到第二个工作表。我想根据单元格值移动行,或复制+粘贴并删除它们。

到目前为止,我已经能够构建一个删除表中行的函数。请查看下面的代码:

Sub DeleteCompleted()
Dim Test1 As ListObject
Dim Test2 As Variant
Dim Rowcount As Integer

Set Test1 = Sheets("To Do Lijst").ListObjects("Table2")
Test2 = Test1.ListRows.Count

For Rowcount = 1 To Test2 Step 1
    If Test1.DataBodyRange(Rowcount, 4) = "Voltooid" Then
    Test1.DataBodyRange(Rowcount, 4).Delete Shift:=xlUp
    Rowcount = 0
    End If
Next Rowcount

您能为我建议一种更好的格式吗?

亲切的问候,

Pim

1 个答案:

答案 0 :(得分:1)

  1. 使用描述性变量名称使您的生活更轻松
  2. 总是使用Long作为行计数变量,Excel的行数超过Integer不能处理。除非确实需要,否则也不要使用Variant
  3. 如果删除/添加行,则必须向后循环,因为删除/添加会更改行数。
  4. 要移动一行,请使用Range().Cut并定义一个目的地,例如另一个工作表中的下一个空闲行。

所以您最终会得到类似...

Sub DeleteCompleted()
    Dim ToDoList As ListObject
    Dim ListRowCount As Long
    Dim iRow As Long

    Set ToDoList = Sheets("To Do Lijst").ListObjects("Table2")
    ListRowCount = ToDoList.ListRows.Count

    Dim NextFreeRow As Range

    For iRow = ListRowCount To 1 Step -1
        With ToDoList
            If .DataBodyRange(iRow, 4).Value = "Voltooid" Then
                Set NextFreeRow = Worksheets("Destination").Cells(Rows.Count, 4).End(xlUp).Offset(1, -3)
                ToDoList.ListRows(iRow).Range.Copy Destination:=NextFreeRow
                ToDoList.ListRows(iRow).Range.Delete Shift:=xlUp
            End If
        End With
    Next iRow
End Sub