gpt4 book ai didi

excel - 处理不正确的密码运行时错误

转载 作者:行者123 更新时间:2023-12-04 20:53:39 24 4
gpt4 key购买 nike

第一次发帖,但是老用户了!首先,我想对你们在帖子上提供的所有代码反馈表示感谢。它对我开发 VBA 代码的帮助超出了您的想象!

好的,所以问题:

背景:
我正在开发一个以 VBA 为重点的插件供我自己和同事使用。其中一部分是包含您在 Excel 中除外但不存在的功能。其中一些很容易做到(即反转过滤器),但有些被证明更难。这是其中一个例子。

问题:
以下代码旨在循环用户选择工作表,应用用户定义的密码或删除现有密码。部分功能是捕获无法删除的密码(即因为用户输入了错误的密码)。它适用于第一个错误发生,但通过第二个运行时错误(1004)和之后重复的错误。我在运行时错误处理方面没有太多经验(尽量避免错误!)但我无法让它工作。任何阻止运行时错误弹出的想法/帮助都会很棒。

代码:

Dim SHT As Worksheet, Password As String, SHT_Names(0 To 30) As String
'PREP
'DISABLE APPLICATION FUNCTIONS
Call Quicker_VBA(False)
Application.EnableEvents = False

'USER PASSWORD OPTION
Password = InputBox("Please enter a password (leave blank for no password)", "Password")

'USER INFORMATION MESSAGES SETUP
MSG_Protect = "Added to-"
Protect_check = MSG_Protect

MSG_Unprotect = "Removed from-"
Unprotect_check = MSG_Unprotect

MSG_unable = "Unable to remove protection from-"
Unable_check = MSG_unable

'ID SHEETS SELECTED
For Each SHT In ActiveWindow.SelectedSheets
a = a + 1
SHT.Activate
SHT_Names(a) = SHT.name
Next

'MAIN
HomeSHT = ActiveSheet.name

'PROTECT SHEETS SELECTED BY USER
For b = 1 To a
Sheets(SHT_Names(b)).Select
Set SHT = ActiveSheet

'ENABLE OR REMOVE PROTECTION FROM SELECTED SHEET
If SHT.ProtectContents Then
On Error GoTo Password_FAIL
Application.DisplayAlerts = False
SHT.Unprotect Password
On Error GoTo 0

MSG_Unprotect = MSG_Unprotect & vbNewLine & Chr(149) & " " & SHT.name
Else:

'ENABLE FILTER CHECK
FilterOn = False
If ActiveSheet.AutoFilterMode Then FilterOn = True

'PROTECT SHEET
SHT.Protect Password, AllowFiltering:=FilterOn

'UPDATE USER MESSAGE
MSG_Protect = MSG_Protect & vbNewLine & Chr(149) & " " & SHT.name & " - Users can: Select locked and unlocked cells"
If FilterOn = True Then MSG_Protect = MSG_Protect & " and use filters"
End If
200 Next

'INFORM USER
If Protect_check <> MSG_Protect Then msg = MSG_Protect & vbNewLine & "___________________" & vbNewLine
If Unprotect_check <> MSG_Unprotect Then msg = msg & MSG_Unprotect & vbNewLine & "___________________" & vbNewLine
If Unable_check <> MSG_unable Then msg = msg & MSG_unable

MsgBox msg, , "Protection summary"

'TIDY UP
Sheets(HomeSHT).Activate
'ENABLE APPLICATION FUNCTIONS
Call Quicker_VBA(True)
Exit Sub
Password_FAIL:
MSG_unable = MSG_unable & vbNewLine & Chr(149) & " " & SHT.name
Application.EnableEvents = False
GoTo 200
End Sub

最佳答案

乍一看,问题似乎出在您处理错误的方式上。您使用 On Error GoTo Password_FAIL 行跳到错误处理程序。错误处理程序记录一些信息,然后跳转到标签“200”。我不知道格式是否关闭,但看起来“200”的标签指向 Next ,表示循环应该继续下一张。

那么,问题出在哪里?您从未真正重置原始错误。 On Error GoTo Password_FAIL 下面三行您明确调用 On Error GoTo 0重置错误处理程序,但实际上永远不会在错误中到达该行。程序将跳转到错误处理程序,然后从那里跳转到循环迭代器。使用 GoTo 语句进行控制流很容易导致这些类型的问题,这就是大多数开发人员不建议使用它的原因。

我将在下面发布一些示例代码,以展示一种不同的(可能更好的)处理代码异常的方法。在下面的示例中,代码简单地遍历工作簿中的所有工作表并切换保护。我没有包含您的大部分日志记录,或者仅切换所选工作表的约束。我想专注于错误处理。此外,通过阅读您的代码,您似乎可以管理更多的外围设备细节。如果仍有一些困惑,请发送消息

Sub ToggleProtectionAllSheets()
Dim sht As Worksheet
Dim password As String

On Error Resume Next

password = InputBox("Please enter a password (leave blank for no password)", "Password")
For Each sht In ActiveWorkbook.Worksheets
If sht.ProtectContents Then
sht.Unprotect password

If Err.Number <> 0 Then
Err.Clear
MsgBox "Something did not work according to plan unprotecting the sheet"
End If
Else
sht.Protect password

If Err.Number <> 0 Then
Err.Clear
MsgBox "Something went wrong with protection"
End If
End If

Next sht
End Sub

关于excel - 处理不正确的密码运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52779447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com