我需要保留一些包含公式的单元格,以防止用户意外修改它们。为此,我保护单元格并锁定工作表。这样做,将禁止用户删除这些行。
如何检测用户是否正在删除整行,并允许此操作不依赖于该行是否包含受保护的单元格?
我想触发"右击 - >删除行"使用VBA的行动,但我找不到任何关于此的文件...
另外,我不想使用专用的面具或按钮来使UI复杂化......
答案 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