При написании кода с нуля или при очистке макро-записанного кода рекомендуется избегать некоторых вещей, если это возможно:
On Error Resume Next
может разрешить выполнение кода, но это похоже на пыль под ковром - ошибки все еще есть, но вы не можете их видеть. Результаты могут быть непредсказуемыми! Намного лучше, чтобы ошибки были видны и устраняли их до того, как они возникнут.
ActiveSheet
возможно, не тот лист, который вы считаете. Это может даже не быть в книге, вы думаете, что это так!
Select
может также обеспечить непредсказуемые результаты. В вашем коде ThisWorkbook.Worksheets("Worksheet2").Select
делает Select
и Activate
Worksheet2, но ничего не делает с объектом rng
.
Будьте конкретны при установке или определении переменных и применении к ним методов.
Всегда объявляйте Option Explicit
в верхней части каждого модуля. Вы можете заставить VBA сделать это, перейдя в Инструменты -> Параметры ... и щелкнув поле Требовать объявление переменной. Это не ретроспективно - это не относится к существующим модулям.
Чтобы заставить ваш код работать так, как задумано, удаляя строку (и) на определенных листах, вам нужен Address
вашего объекта rng
. Обратите внимание, что rng
относится к листу и выбору, когда вы нажимаете OK в InputBox. Вы (или пользователь) можете выбрать другой лист, пока активен InputBox. То, с чем вам действительно нужно работать, это 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
Код предполагает, что "Рабочий лист 1" (с завершающим пробелом) и "Рабочий лист2" (без пробелов) действительно существуют в ThisWorkbook. Вы могли бы, вероятно, построить некоторую обработку ошибок, если это не так, но это другой вопрос
Кроме того, вам не нужно проверять, If rng Is Nothing
потому что Application.InputBox
не позволит вам нажать кнопку «Отмена», и если вы нажмете «ОК», не делая выбора, появится сообщение об ошибке, перенаправляющее вас обратно на InputBox.