Excel:允许用户删除包含受保护单元的行

我需要保留一些单元格,包含公式,对用户进行accadantally修改它们。 为此,我保护了单元格并locking了工作表。 这样做,将不允许用户删除这些行。

我怎么能检测用户是否删除整个行,并允许这个行动不依赖如果该行包含受保护的单元格?

我想用VBA触发“右键单击 – >删除行”操作,但是我找不到任何关于这个的文档…

此外,我不想使用专用的面具或button,不要复杂的UI …

你可以试试这个简单的代码:

Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address Like "$" & Target.Row & ":$" & Target.Row Then ActiveSheet.Unprotect Else ActiveSheet.Protect End If End Sub 

Afaik没有办法来捕捉“删除行”事件。 你可以回应Worksheet.BeforeRightClick ,虽然这不能帮助你,因为你不知道在这一点上用户将要做什么。

解决您的问题的一种方法是在右键单击菜单上创build一个自定义菜单项,这将删除受保护的行。 您可以在Workbook_Activemacros中执行此操作,以便每次用户打开工作簿时都会出现这个问题。 您也应该在工作簿被停用时将其删除(否则它将出现在用户打开的不相关的电子表格中)。 例如 – 将以下代码添加到ThisWorkbook

 Private Sub Workbook_Activate() modManageMenus.addMenuItems End Sub Private Sub Workbook_Deactivate() modManageMenus.removeMenuItems End Sub 

然后添加一个新的模块modManageMenus与以下内容:

 Public Sub addMenuItems() With Application.CommandBars("cell").Controls.Add(msoControlButton, , , 1, True) .Caption = "Delete protected row" .OnAction = "modManageMenus.deleteRow" End With With Application.CommandBars("row").Controls.Add(msoControlButton, , , 1, True) .Caption = "Delete protected row" .OnAction = "modManageMenus.deleteRow" End With End Sub Public Sub removeMenuItems() Dim ctrl As CommandBarControl For Each ctrl In Application.CommandBars("cell").Controls If ctrl.Caption = "Delete protected row" Then ctrl.Delete Next For Each ctrl In Application.CommandBars("row").Controls If ctrl.Caption = "Delete protected row" Then ctrl.Delete Next End Sub Public Sub deleteRow() ActiveSheet.Unprotect Selection.EntireRow.Delete ActiveSheet.Protect End Sub 

您可能需要修改deleteRow的代码(例如,通过添encryption码,限制用户可以/不能删除的行等),但这应该给你一个想法。