Есть ли способ ограничить удаление строк на листе с помощью VBA? - PullRequest
0 голосов
/ 07 июня 2019

У меня есть лист Excel, в котором я хочу предотвратить удаление любых строк. У меня есть этот фрагмент кода, который на самом деле делает то, что я хочу, но как только я запускаю макрос, я не могу удалить строку из любой книги Excel.

Sub DeleteRowsRestrictions()
Dim xBarControl As CommandBarControl
For Each xBarControl In Application.CommandBars.FindControls(ID:=293)
    xBarControl.Enabled = False
Next
For Each xBarControl In Application.CommandBars.FindControls(ID:=294)
    xBarControl.Enabled = False
Next
End Sub

Есть ли способ предотвратить удаление строк только из одного листа Excel? А не макрос, который отключает удаление строки во всех книгах Excel, как мой код?

Спасибо :)

Ответы [ 2 ]

4 голосов
/ 07 июня 2019

Не изобретайте велосипед, это уже особенность объектной модели Excel.Вы можете сделать это непосредственно на рабочем листе, защищая его (хотя я не стал бы беспокоиться с паролем, он легко разбит / хеш-коллизирован):

Protect Sheet dialog

Программно, это делается с помощью метода Worksheet.Protect - вы управляете тем, что включено, предоставляя значение Boolean для каждого разрешения - AllowDeletingRows, являясь одним из них:

Sheet1.Protect Password:=vbNullString, _
               DrawingObjects:=False, _
               Contents:=False, _
               Scenarios:=False, _
               UserInterfaceOnly:=True, _
               AllowFormattingCells:=True, _
               AllowFormattingColumns:=True, _
               AllowFormattingRows:=True, _
               AllowInsertingColumns:=True, _
               AllowInsertingRows:=False, _
               AllowInsertingHyperlinks:=True, _
               AllowDeletingColumns:=False, _
               AllowDeletingRows:=False, _
               AllowSorting:=True, _
               AllowFiltering:=True, _
               AllowUsingPivotTables:=True

По моему опытузащита сама по себе является достаточным сдерживающим фактором для подавляющего большинства пользователей;пароль служит только для того, чтобы в конечном итоге быть утерянным / забытым, плюс жесткое кодирование пароля в коде VBA довольно наивно с точки зрения безопасности: защита листа не является функцией безопасности.

0 голосов
/ 07 июня 2019

Если вы хотите избежать удаления строк из Parking Рабочего листа, в случае Workbook_SheetActivate вы должны указать что-то вроде этого:

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    If Sh.Name = "Parking" Then
        'CODE TO BLOCK DELETING ROWS
    Else
        'CODE TO ALLOW DELETING ROWS
    End If
End Sub

Sh - это Рабочий лист, который вы активируете при переходе с1 лист к другому, поэтому при активации Parking код будет блокировать удаление строк.Если это не PArking, тогда это позволит удалить строки.

ОБНОВЛЕНИЕ: Этот код необходимо ввести в редакторе VBA в ThisWorkbook Object.

enter image description here

Как только donde, вам не нужно передавать параметр, он будет работать сам по себе.События инициируются, когда происходит конкретное действие, и пользователю не нужно передавать параметр (они получают его мгновенно).В этом случае событие срабатывает, когда пользователь переключается с одного рабочего листа на другой, а этот параметр является целевым рабочим листом (он хранится в параметре Sh), но вам не нужно вызывать его с помощью строк кода.Он сработает сам по себе.

Подробнее об этом событии можно прочитать здесь:

Событие Workbook.SheetActivate

Если вы хотите узнать больше о других событиях, отметьте:

События Excel VBA

ВАЖНО : Если у вас есть код в любом событии, это событие будет готово к срабатыванию в в любое время .В этом случае, если любой другой макрос из вас активирует лист Parking, он будет запущен.

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

Если вы действительно хотите защитить этот лист от любого удаления, лучшим вариантом, действительно, является ответ @MathieuGuindon, защищающий лист.Этот путь будет более безопасным.

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