Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 保护特定的工作表按钮?_Vba_Excel - Fatal编程技术网

Vba 保护特定的工作表按钮?

Vba 保护特定的工作表按钮?,vba,excel,Vba,Excel,您好,我有一个按钮,允许我的老板根据他输入的工作表名称删除工作簿中许多工作表中的一张。“删除工作表”按钮受密码保护,因为其他人使用工作簿,我不希望他们删除任何内容 现在,这并不能阻止他们右键单击特定工作表并删除,因此我需要一种方法,在未按下“删除工作表”按钮时保护所有工作表,并在正确输入该按钮的密码后取消对所有工作表的保护,因为该按钮无法删除受保护的工作表 删除图纸按钮代码: Private Sub CommandButton4_Click() Dim delSheet As Stri

您好,我有一个按钮,允许我的老板根据他输入的工作表名称删除工作簿中许多工作表中的一张。“删除工作表”按钮受密码保护,因为其他人使用工作簿,我不希望他们删除任何内容

现在,这并不能阻止他们右键单击特定工作表并删除,因此我需要一种方法,在未按下“删除工作表”按钮时保护所有工作表,并在正确输入该按钮的密码后取消对所有工作表的保护,因为该按钮无法删除受保护的工作表

删除图纸按钮代码:

    Private Sub CommandButton4_Click()

Dim delSheet As String
Dim response As String
Dim SheetFound As Boolean
Dim MyPass As String
Dim MyPasswrd As String, answ As String

 MyPasswrd = "test"                                                             'password verification puts trigger in cell A100, an deletes when file close
 If Range("A101").Value <> "OK" Then
     answ = InputBox("Please Enter The Password To Continue.", "Enter Password")
        If answ <> MyPasswrd Then
             MsgBox "Incorrect Password!", vbExclamation, "Warning"
            Exit Sub
        End If
    Range("A101").Value = "OK"
End If

delSheet = InputBox("Please Enter The LAST NAME Of The DTS You Want To Remove", "Remove A DTS")                     'user input

If delSheet = "" Then
MsgBox "You Did Not Complete The Entry.", vbOKOnly + vbInformation, "Warning"                       'if NULL input displays this message
Exit Sub

Else
  If IsLetter(delSheet) = False Then GoTo Display                                                   'checks the user input

response = MsgBox("WARNING!! This Action Cannot Be Undone, Do You Still Want To Continue?", vbExclamation + vbYesNo, "Warning")     'verfies user input


If response = vbYes Then                                                                'if input is yes  selects sheet IF ITS FOUND
On Error Resume Next

        ActiveWorkbook.Sheets(delSheet).Select
        If Err = 0 Then SheetFound = True                                               'searches for sheet

    On Error GoTo 0

    If SheetFound = False Then                                                      'if sheet not found displays this message

        MsgBox prompt:="The sheet '" & delSheet & "' Could Not Be Found In This File!", Buttons:=vbExclamation, Title:="Search Result"
        Exit Sub

    Else

 Application.DisplayAlerts = False                                                  'Finally deletes sheet and bypass xcel warning for sheet deletion
 Sheets(delSheet).Delete
 Application.DisplayAlerts = True

MsgBox ("The DTS " & delSheet & " Was Successfully Removed")                                    'message for sucessfully deleting the sheet
Application.Goto Reference:=Worksheets("Control Center").Range("B1"), Scroll:=True
End If

Else

response = vbNo                                                                         'if user does not want to delete sheet exits window
Exit Sub

Display:
     MsgBox "Invalid Character In Last Name. Please Only Use Letters And Numbers(1-9), NOT Spaces and Specail Characters (! @ # $ % ^ & * - + = \ _ .)", vbExclamation, "Warning"

End If
End If
End Sub
Private子命令按钮4\u单击()
将数据表变为字符串
作为字符串的暗淡响应
找到的值为布尔值
将MyPass设置为字符串
Dim MyPasswrd作为字符串,answ作为字符串
MyPasswrd=“test”'密码验证将触发器放在单元格A100中,在文件关闭时删除触发器
如果范围(“A101”)。值为“OK”,则
answ=InputBox(“请输入密码以继续。”,“输入密码”)
如果是我的密码,那么
MsgBox“密码不正确!”,VBE感叹号,“警告”
出口接头
如果结束
范围(“A101”)。值=“确定”
如果结束
delSheet=InputBox(“请输入要删除的DTS的姓氏”,“删除DTS”)'用户输入
如果delSheet=“”,则
MsgBox“您没有完成输入。”,vbOKOnly+vbInformation,“警告”'如果NULL input显示此消息
出口接头
其他的
如果Isleter(delSheet)=False,则转到显示“检查用户输入”
response=MsgBox(“警告!!此操作无法撤消,是否仍要继续?”,VBEQUOTION+vbYesNo,“警告”)“验证用户输入
如果响应=vbYes,则“如果输入为yes,则在找到工作表时选择工作表”
出错时继续下一步
ActiveWorkbook.Sheets(delSheet)。选择
如果Err=0,则SheetFound=True'搜索工作表
错误转到0
如果SheetFound=False,则“如果未找到工作表”显示此消息
MsgBox提示符:=“在此文件中找不到工作表”“&delSheet&”“”,按钮:=VBEQUOTION,标题:=“搜索结果”
出口接头
其他的
Application.DisplayAlerts=False“最终删除工作表并绕过工作表删除的xcel警告”
工作表(delSheet)。删除
Application.DisplayAlerts=True
成功删除工作表的MsgBox(“DTS”&delSheet&“已成功删除”)消息
Application.Goto参考:=工作表(“控制中心”)。范围(“B1”),滚动:=真
如果结束
其他的
如果用户不想删除工作表出口窗口,则响应=vbNo
出口接头
显示:
MsgBox“姓氏中的字符无效。请仅使用字母和数字(1-9),而不使用空格和特殊字符(!@$%^&*-+=\\)”,VBEquipment,“警告”
如果结束
如果结束
端接头

如果您有Excel-2013或Excel-2016,则可以在删除事件之前使用
工作簿。
在工作簿模块中添加以下代码:

Option Explicit

Public IsPasswordOK  As Boolean
Public IsDeleteOK    As Boolean

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    If Not IsDeleteOK Then
        MsgBox "You deleted a sheet without permission. Can't save the file."
        Cancel = True
    End If
End Sub

Private Sub Workbook_Open()
    IsDeleteOK = True
End Sub

Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object)
    If IsDeleteOK Then
        IsDeleteOK = IsPasswordOK
    End If
End Sub

命令按钮4中,单击(
工作表(delSheet)后的代码。删除该行

ThisWorkbook.IsPasswordOK=True

适用于Excel-2013之前的版本

首先将模块名称添加到它
mdlSheetWatch
。在该模块中添加以下代码

Option Explicit

Public IsPasswordOK  As Boolean
Public dctSheets
Public Function IsSheetsOk()

    Dim wks As Worksheet
    Dim lCtr    As Long
    Dim bResult As Boolean

    If IsPasswordOK Then
        bResult = True
        Exit Function
    Else

       bResult = True
        For Each wks In ThisWorkbook.Worksheets
           If Not dctSheets.exists(wks.CodeName) Then
            bResult = False
            Exit For
           End If
        Next

    End If

    IsSheetsOk = bResult

End Function

Public Function LoadSheetList() As Object
     Dim wks As Worksheet
     Dim dctTemp As Object

     Set dctTemp = CreateObject("Scripting.Dictionary")

      For Each wks In ThisWorkbook.Worksheets
        dctTemp.Add wks.CodeName, wks.Name
      Next

    Set LoadSheetList = dctTemp

End Function

现在在工作簿模块中,添加以下代码

Option Explicit

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    If Not mdlSheetWatch.IsSheetsOk Then
        MsgBox "You deleted/renamed a sheet without permission. Can't save the file."
        Cancel = True
    End If
End Sub

Private Sub Workbook_Open()
   Set dctSheets = mdlSheetWatch.LoadSheetList
End Sub

最后,在
命令按钮4中,单击行后的代码()
工作表(delSheet)。删除
添加这一行

ThisWorkbook.IsPasswordOK=True
mdlSheetWatch.IsPasswordOK=True



这将防止没有密码的用户在删除/重命名/添加工作表后保存工作簿。

工作表类的事件
BeforeDelete
没有
Cancel
选项,但这是执行取消操作的变通方法

1-在普通模块中,执行以下例行程序:

Sub unprotectThis()
    ThisWorkbook.unprotect
End Sub
2-在要防止删除的工作表的代码模块中,添加此事件处理程序:

Private Sub Worksheet_BeforeDelete()
    ThisWorkbook.Protect
    MsgBox "This sheet can be deleted only by the administrator through the dedicated button", vbExclamation
    Application.OnTime Now + TimeSerial(0, 0, 1), "unprotectThis"
End Sub
我们以某种方式“模拟”了取消选项。一秒钟后,工作簿将再次取消保护

3-最后,在按钮的处理程序中,您需要密码,只需在实际执行删除之前禁用事件。这将不会调用上述工作表\u BeforeDelete处理程序。在离开前还原事件:

Private Sub CommandButton4_Click()
    On Error goto RestoreEvents
    Application.EnableEvents = false
    ...
    ' your routine that checks for password and performs the delete...
    ...
RestoreEvents:
    Application.EnableEvents = true
End Sub

请注意,此解决方案甚至不需要保护工作簿,它只保护给定的工作表。

无法停止工作表删除,至少在没有大量代码/结构保护的情况下是如此。但在保存工作簿之前,您始终可以确定工作表是否存在,如果不存在,则可以阻止保存工作簿。这是最简单的方法。我做了一些研究,发现了这一点,但我不知道如何在我的代码中实现这一点。基本上,您创建一个包含所有图纸名称的控制图纸,然后当您单击控件中的图纸时,它会运行一个宏来取消对所有图纸的保护,以便将其删除,然后工作簿中的工作表会恢复到受保护状态。当你说用户没有密码时,你是说他们需要密码才能打开工作簿吗?不,我是说没有密码“测试”的人可以删除工作表。它将如何工作。第一个存储表列表。第二,当代码删除工作表时,存储一个跳过任何检查的标志。第三,在保存文件时,它将检查当前工作表列表是否与实际工作表匹配(如果标志为true,则跳过此标记)。如果是,则允许保存。如果否,则不允许保存。在“SheetBeforeDelete”中,我将