【问题标题】:Skipping single line of code in loop: entirerow.delete in another workbook在循环中跳过单行代码:另一个工作簿中的 wholerow.delete
【发布时间】:2019-01-18 13:10:43
【问题描述】:

对 VBA 来说相当新,但我正在尝试将所选工作簿中的数据导入(复制/粘贴)到我的主工作簿中(包含代码),但首先需要删除所选工作簿中不可用的行。

如果 C 列为空,那么我想在将数据复制到主工作簿之前使用从下到上的循环删除整行(因此需要更明确地引用每个 wb)。

它目前在我的循环中跳过“wb.Sheets(1).Rows(r).EntireRow.Delete”行代码,但执行循环的次数正确。请帮忙,还在学习中。

之前,它错误地删除了每一行:当我的 if then 子句引用了一个不同的单元格时(其中一个包含一个值,而不是空白)。

Dim wb As Workbook
Dim r As Integer

With wb.Sheets(1)       
     For r = wb.Sheets(1).UsedRange.Rows.Count To 1 Step -1
         If wb.Sheets(1).Cells(r, "C") = "0" Then
             wb.Sheets(1).Rows(r).EntireRow.Delete 
         End If
     Next

【问题讨论】:

标签: excel vba loops delete-row


【解决方案1】:

这样的事情应该可以工作。您已经为代码使用了 With 块,但实际上并没有使用它。您不需要对同一对象的其他引用。在此我测试了单元格是否为空不使用IsEmpty

Dim wb As Workbook
Dim r As Integer

With wb.Sheets(1)
    For r = .UsedRange.Rows.Count To 1 Step -1
        If IsEmpty(.Cells(r, 3)) Then
            .Rows(r).Delete
        End If
    Next
End With

【讨论】:

  • 效果很好!谢谢你的帮助,让我看到了一些新的东西。是的,我不需要在此处包含“with”,我稍后在代码中使用它,但没有意识到在这种情况下会造成混淆。
  • 没问题 - 是一个好的开始,只是需要一些技巧。如果现在解决了,请不要忘记在答案左侧打勾
  • 也很高兴你告诉我。你真棒汤姆
【解决方案2】:

删除行(条件列)

联合版

Sub DelRows()

    Const cSheet As Variant = 1     ' Worksheet Name/Index
    Const cFirst As Long = 1        ' First Row Number
    Const cColumn As Variant = "C"  ' Criteria Column Letter/Number

    Dim rngU As Range   ' Union Range
    Dim LastUR As Long  ' Last Used Row
    Dim r As Long       ' Row Counter

    With ThisWorkbook.Worksheets(cSheet)

        ' Check if worksheet is empty.
        If .Cells.Find("*", .Cells(.Rows.Count, .Columns.Count), -4123, , 1) _
                Is Nothing Then Exit Sub
        ' Calculate Last Used Row.
        LastUR = .Cells.Find("*", , , , , 2).Row

        ' Add found criteria first (can be any) column cells to Union Range.
        For r = cFirst To LastUR ' Rows
             If IsEmpty(.Cells(r, cColumn)) Then
                 If Not rngU Is Nothing Then
                     Set rngU = Union(rngU, .Cells(r, 1))
                   Else
                     Set rngU = .Cells(r, 1)
                 End If
             End If
        Next

    End With

    ' Delete rows in one go.
    If Not rngU Is Nothing Then
        rngU.EntireRow.Delete ' .Hidden = True
        Set rngU = Nothing
    End If

End Sub

【讨论】:

    猜你喜欢
    • 2020-05-23
    • 2020-10-20
    • 2021-01-11
    • 2017-11-13
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    相关资源
    最近更新 更多