Я новичок в программировании, и я пытаюсь что-то придумать.

Я хочу удалить строки на разных листах, определенных в поле ввода.

Мой код работает только на листе 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

2 ответа2

0

Этот простой код VBA (Macro) поможет вам удалить желаемые строки на нескольких листах, без каких-либо циклов.

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 доступен для редактирования, вы можете установить любое измерение по своему усмотрению.

0

При написании кода с нуля или при очистке макро-записанного кода рекомендуется избегать некоторых вещей, если это возможно:

  • 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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .