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

时间:2015-08-13 08:06:24

标签: excel vba excel-vba

我需要保留一些包含公式的单元格,以防止用户意外修改它们。为此,我保护单元格并锁定工作表。这样做,将禁止用户删除这些行。

如何检测用户是否正在删除整行,并允许此操作不依赖于该行是否包含受保护的单元格?

我想触发"右击 - >删除行"使用VBA的行动,但我找不到任何关于此的文件...

另外,我不想使用专用的面具或按钮来使UI复杂化......

2 个答案:

答案 0 :(得分:1)

Afaik没有办法捕获“删除行”事件。您可以回复Worksheet.BeforeRightClick,但这对您没有多大帮助,因为您当时不知道用户将要做什么。

解决问题的一种方法是在右键单击菜单上创建自定义菜单项,这将删除受保护的行。您可以在Workbook_Active宏中执行此操作,以便每次用户打开工作簿时都可以使用它。您也应该在取消激活工作簿时将其删除(否则它将显示在用户打开的不相关电子表格中)。例如 - 将以下代码添加到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中的代码(例如,通过添加密码,限制用户可以/不能删除哪些行等),但这应该会给您一个想法。

答案 1 :(得分:0)

您可以尝试这个简单的代码:

MsBuildToolsPath