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”中,我将