我有一个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工作簿中删除行的宏吗?
谢谢:)
答案 0 :(得分:4)
不要重新发明轮子,这已经是Excel对象模型的功能。您可以通过保护直接在工作表中执行此操作(虽然我不会打扰密码,但它很容易被打/散列):
通过编程,这是通过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代码中对密码进行硬编码是非常幼稚的,从安全角度来看:工作表保护不是一项安全功能。
答案 1 :(得分:-1)
如果要避免从Parking
WorkSheet中删除行,则在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
对象中键入此代码。
一旦donde,您就不需要传递参数,它将自己运行。事件在发生特定操作时触发,不需要用户传递参数(它们可以立即获取)。在这种情况下,事件在用户从1个工作表更改为另一个工作表时触发,并且参数是目标工作表(存储在参数Sh
中),但是您无需使用代码行来调用它。它会自行触发。
您可以在此处阅读有关此事件的更多信息:
如果您想进一步了解其他事件,请检查:
重要:在任何事件中都有代码后,该事件随时可以在 上触发。在这种情况下,如果您的任何其他宏都激活工作表Parking
,则会被触发。
而且,正如其他用户所发布的那样,您的代码仅阻止从命令栏中删除行,但是可能用户仍然可以通过右键单击鼠标,键盘快捷键或其他宏来删除行。
如果您真的想保护该工作表免受任何删除,最好的选择确实是@MathieuGuindon答案,即保护工作表。这样会更安全。