有没有一种方法可以限制使用VBA删除工作表中的行?

时间:2019-06-07 13:52:14

标签: excel vba rows

我有一个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 个答案:

答案 0 :(得分:4)

不要重新发明轮子,这已经是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代码中对密码进行硬编码是非常幼稚的,从安全角度来看:工作表保护不是一项安全功能。

答案 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对象中键入此代码。

enter image description here

一旦donde,您就不需要传递参数,它将自己运行。事件在发生特定操作时触发,不需要用户传递参数(它们可以立即获取)。在这种情况下,事件在用户从1个工作表更改为另一个工作表时触发,并且参数是目标工作表(存储在参数Sh中),但是您无需使用代码行来调用它。它会自行触发。

您可以在此处阅读有关此事件的更多信息:

  

Workbook.SheetActivate event

如果您想进一步了解其他事件,请检查:

  

Excel VBA Events

重要:在任何事件中都有代码后,该事件随时可以在 上触发。在这种情况下,如果您的任何其他宏都激活工作表Parking,则会被触发。

而且,正如其他用户所发布的那样,您的代码仅阻止从命令栏中删除行,但是可能用户仍然可以通过右键单击鼠标,键盘快捷键或其他宏来删除行。

如果您真的想保护该工作表免受任何删除,最好的选择确实是@MathieuGuindon答案,即保护工作表。这样会更安全。