Как запустить этот макрос для конкретной рабочей таблицы, в рабочей книге много рабочих таблиц? - PullRequest
1 голос
/ 24 октября 2019

Я создал несколько кнопок макросов на листе 5, это работает, если я на листе 1, но когда я пытаюсь нажать кнопку для этого макроса на листе 5, это не работает. Что мне нужно добавить, чтобы выбрать лист 1, если я нахожусь на другом листе в той же книге?

Sub Delete_External ()
'
' Delete_External Macro

    Dim LastRow As Long
    Dim i As Long

    LastRow = Range("K1000").End(xlUp).Row
    For i = LastRow To 1 Step -1
        If Range("K" & i) = "External" Then
            Range("K" & i).EntireRow.Delete
        End If
    Next
End Sub

1 Ответ

0 голосов
/ 24 октября 2019

Квалифицируйте свои объекты с рабочим листом.

Sub Delete_External ()
'
' Delete_External Macro

    Dim ws as Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
    Dim LastRow As Long
    Dim i As Long

    LastRow = ws.Range("K1000").End(xlUp).Row
    For i = LastRow To 1 Step -1
        If ws.Range("K" & i) = "External" Then
            ws.Range("K" & i).EntireRow.Delete
        End If
    Next
End Sub

Я бы не стал удалять строки внутри цикла, так как это может занять много времени в зависимости от набора данных и количества совпадений критериев. Рассмотрим эту альтернативу, которая проходит через ваш диапазон и создает коллекцию (Union) ячеек, которые соответствуют вашим критериям. После завершения цикла удалите Union сразу.

Это также было обновлено до более распространенной методологии поиска последней строки и удаляет обратную петлю, поскольку этот метод не требует этого!

Sub Delete_External()
'
' Delete_External Macro

    Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
    Dim LR As Long, i As Long
    Dim DeleteMe As Range

    LR = ws.Range("K" & ws.Rows.Count).End(xlUp).Row

    For i = 2 To LR
        If ws.Range("K" & i) = "External" Then
            If Not DeleteMe Is Nothing Then
                Set DeleteMe = Union(DeleteMe, ws.Range("K" & i))
            Else
                Set DeleteMe = ws.Range("K" & i)
            End If  
        End If
    Next i

    If Not DeleteMe Is Nothing Then
        DeleteMe.EntireRow.Delete
    End If

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...