删除不同工作表上的行(无循环)

删除不同工作表上的行(无循环)

我是一名编码初学者,正在尝试弄清楚一些事情。

我想删除输入框中定义的不同工作表上的行。

我的代码仅适用于工作表 1。而不适用于工作表 2。谁能告诉我我在这里做错了什么?

Sub RemovingRowsFromDifferentSheets()
    Dim rng As Range
    Dim xTxt As String
    Dim Wsheet As Worksheet

    On Error Resume Next
    Set Wsheet = ActiveSheet
    Set rng = Application.InputBox("Please select the range you want to delete across multiple sheets:", "Removing defined range", xTxt, , , , , 8)
    If rng Is Nothing Then Exit Sub

    Sheets("Worksheet 1 ").Select
    rng.Delete


    ThisWorkbook.Worksheets("Worksheet2").Select
    rng.Delete
End Sub

答案1

从头编写代码或清理宏记录的代码时,最好尽可能避免以下情况:

  • On Error Resume Next可以允许代码运行,但这就像把灰尘扫到地毯下一样 - 错误仍然存​​在,但您看不到它们。结果可能难以预测!最好是允许错误被发现并在错误发生之前解决它们。
  • ActiveSheet可能不是您认为的工作表。它甚至可能不在您认为的工作簿中!
  • Select还会产生不可预测的结果。您的代码中ThisWorkbook.Worksheets("Worksheet2").Select确实执行了Worksheet2 的Select操作Activate,但对对象却没有任何影响rng

设置或定义变量以及对其应用方法时要具体。

总是在每个模块的顶部声明Option Explicit。您可以通过转到“工具”->“选项...”并单击“要求变量声明”框来强制 VBA 执行此操作。这不是追溯性的 - 它不适用于现有模块。

要通过删除特定工作表上的行来使代码按预期工作,您需要对象的Addressrng请注意,rng当您在输入框中单击“确定”时,它特定于工作表和选择。当输入框处于活动状态时,您(或用户)可以选择不同的工作表。您实际需要处理的是rng.Address可以将其放入变量中的,该变量在删除String后仍可使用。rng

Option Explicit

Sub RemovingRowsFromDifferentSheets()
    Dim rng As Range
    Dim rngAddr As String
    Dim Wsheet As Worksheet

    'On Error Resume Next  **Use with extreme care**
    Set Wsheet = ActiveSheet  'Set but never used.
    Set rng = Application.InputBox("Please select the range you want to delete across multiple sheets:", "Removing defined range", Type:=8)
    'Make sure the selection is in the expected workbook.
    'The parent of a range is its worksheet object
    'The parent of a worksheet object is its workbook object
    If rng.Parent.Parent.Name = ThisWorkbook.Name Then
        rngAddr = rng.Address
        'Specify which workbook will be modified
        With ThisWorkbook
            'Delete rows
            .Sheets("Worksheet 1 ").Range(rngAddr).EntireRow.Delete
            .Sheets("Worksheet2").Range(rngAddr).EntireRow.Delete
        End With
    End If

End Sub

代码假设“Worksheet 1”(尾部有空格)和“Worksheet2”(无空格)实际上存在于 ThisWorkbook 中。如果它们不存在,您可能可以构建一些错误处理,但这是另一个问题。

此外,您不需要进行测试,If rng Is Nothing因为Application.InputBox不会让您单击“取消”,如果您在未做出选择的情况下单击“确定”,它会弹出一条错误消息,将您重定向回输入框。

答案2

这个简单的 VBA 代码(宏)将帮助您删除多张工作表上的所需行,而无需任何循环。

Sub DelRowMulSht()
    Dim xWs As Worksheet
    Set xWs = ActiveSheet
    ThisWorkbook.Worksheets.Select
    Rows("1:15").Select
    Selection.Delete
    xWs.Select
End Sub

笔记:

使用此代码作为标准模块

要删除的行Rows("1:15").select是可编辑的,您可以根据需要设置任意尺寸。

相关内容