![删除不同工作表上的行(无循环)](https://linux22.com/image/1577697/%E5%88%A0%E9%99%A4%E4%B8%8D%E5%90%8C%E5%B7%A5%E4%BD%9C%E8%A1%A8%E4%B8%8A%E7%9A%84%E8%A1%8C%EF%BC%88%E6%97%A0%E5%BE%AA%E7%8E%AF%EF%BC%89.png)
我是一名编码初学者,正在尝试弄清楚一些事情。
我想删除输入框中定义的不同工作表上的行。
我的代码仅适用于工作表 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 执行此操作。这不是追溯性的 - 它不适用于现有模块。
要通过删除特定工作表上的行来使代码按预期工作,您需要对象的Address
。rng
请注意,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
是可编辑的,您可以根据需要设置任意尺寸。