Удалить одну строку над кнопкой, НО не разрешать ее удалять, если - PullRequest
0 голосов
/ 25 мая 2018

Я использую кнопки управления формой, чтобы добавлять и удалять строки над кнопкой.На листе есть несколько разделов, поэтому функция find.

Добавление строки не вызывает проблем.Вопрос об удалении строк ... до предела.

Код:

Sub Button4_Click()
    ActiveSheet.Unprotect
    Dim Found  As Range
    Set Found = Columns("B").EntireRow.Find(what:="          Remove Row ", LookIn:=xlValues, Lookat:=xlWhole)
    If Not Found Is Nothing Then
        Rows(Found.Row - 1).EntireRow.Delete
    End If
    ActiveSheet.Protect
End Sub

Проблема в том, что я не хочу, чтобы конечный пользователь удалял строки, содержащие заголовки.Я хотел бы добавить что-то, что остановит подпрограмму, если строка над Found.Row содержит текст «Расходы на поездки».

Я подозреваю, что это "если", но я застрял.

Есть предложения?

(Начинающий пользователь)

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

вы можете Intersect строк и столбцов с ActiveSheet.UsedRange для ограничения сканируемых диапазонов

и вот код с методом Application.Match, который, я считаю, быстрее, чем Range.Find (), но это такнечувствительный:

Sub Button4_Click()
    Dim iRow As Variant

    iRow = Application.Match("          Remove Row ", Intersect(ActiveSheet.UsedRange, Columns("B")), 0)
    If Not IsError(iRow) Then
        If IsError(Application.Match("Travel Expenditures", Intersect(ActiveSheet.UsedRange, Rows(iRow - 1).EntireRow), 0)) Then
            ActiveSheet.Unprotect
            Rows(iRow - 1).Delete
            ActiveSheet.Protect
        End If
    End If
End Sub
0 голосов
/ 25 мая 2018

Вы были на правильном пути.Пара комментариев:

  1. Вам нужны все пробелы вокруг "Remove Row"?
  2. Columns("B").EntireRow - это весь лист - я полагаю, вы хотели просто Columns("B").

Я пересмотрел ваш код на основе этих 2 проблем.

Sub ConditionalDelete()
    Dim Found As Range, Found2 As Range

    ActiveSheet.Unprotect

    Set Found = Columns("B").Find(what:="*Remove Row*", LookIn:=xlValues, Lookat:=xlWhole)
    If Not Found Is Nothing Then
        Set Found2 = Rows(Found.Row - 1).Find(what:="Travel Expenditures")
        If Found2 Is Nothing Then
            Rows(Found.Row - 1).Delete
        End If
    End If

    ActiveSheet.Protect
End Sub
...