Конфликт Excel между заблокированными ячейками и удалением строки - PullRequest
0 голосов
/ 10 июля 2020

Это продолжение предыдущего обсуждения ( Worksheet.Protect AllowDeletingRows не позволяет удалять строки ). Я не смог прокомментировать это сообщение, поэтому это сообщение.

Вкратце, проблема заключается в необходимости заблокировать определенные c ячеек / столбцов, одновременно позволяя конечному пользователю удалять строки (хотя строки содержат заблокированные ячейки). Эти два требования кажутся взаимоисключающими вне использования VBA.

Следующее решение было предложено @Louis в упомянутом выше потоке:

Sub Setup()
    ws.Protect Password:="password", UserInterFaceOnly:=True, _
    AllowFormattingColumns:=True, AllowFormattingRows:=True, _
    AllowInsertingColumns:=True, AllowInsertingRows:=True, _
    AllowDeletingColumns:=True, AllowDeletingRows:=False
End Sub

'Connect this Sub to a button.
Sub DeleteRow()
    Dim userInput As String
    Dim row As Long

    userInput = InputBox("Please enter the row number you want to delete:", "Delete Row")
    If Not IsNumeric(userInput) Then
        MsgBox "Provided input is not numeric. Please insert a valid row number", vbExclamation
        Exit Sub
    End If

    row = userInput

    ws.rows(row).Locked = False
    ws.rows(row).Delete

End Sub

Я попытался запустить этот код, однако после ввода желаемого номера строки во всплывающем окне я получил сообщение об ошибке «Ошибка выполнения '424': требуется объект». Использование отладчика на этом этапе показывает выделение строки «ws.rows (row) .Locked = False».

Прошло много лет с тех пор, как я пытался кодировать VBA, поэтому я не уверен, что делать дальше. Кроме того, в идеале было бы полезно удалить диапазон строк (например, строки 7-103 или 150-200) за один проход, а не построчно.

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

1 Ответ

0 голосов
/ 10 июля 2020

Вы можете разрешить пользователю выбирать строку (строки) для удаления перед запуском чего-то вроде этого:

Sub DeleteRow()
    With Selection.EntireRow
        .Locked = False
        .Delete
    End With  
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...