【问题标题】:Error 91 when unloading form after Error Handling错误处理后卸载表单时出现错误 91
【发布时间】:2015-11-18 18:03:57
【问题描述】:

各位开发者您好,

我目前正在为我的 VBA for Excel 实习做一个小项目(这是我第一次在 VBA 中做一个项目)。 该程序包括几个模块和用户表单,并且几乎是完整的,所以我实现了错误处理。

我用过:

Sub .......
ModName = "NameOfTheModule"
SubName = "NameOfTheSub/Function"
On Error GoTo PROC_ERR

/code

Exit Sub
PROC_ERR:
Call LogGenerator(ModName, SubName, Erl, Err.Number, Err.Description)
Exit Sub

End Sub

(对不起,我不能发布整个文件,这是相当机密的)

我在每个子或函数中编写了该代码以及行号,因此如果出现错误,它会转到 PROC_ERR,调用 LogGenerator 生成一个带有模块名称、子/函数名称的 .txt 文件,行号,错误号。我不知道这是否是最好的方法,但它确实是一种享受。

到现在为止。

现在,当此代码在用户窗体代码中运行时,会生成日志,但用户窗体不会关闭。这是非常危险的,因为它仍然是“活动的”,这意味着用户仍然可以放置数据并进行验证,即使之前出现了错误。

我尝试将“Unload Me”放入 PROC_ERR,(我尝试将它放在“Exit Sub”之后/之前,在 LogGenerator 调用之后/之前),但我收到错误 91(无法发布图片,我需要更多的声誉...)。但是,它可以工作,并卸载 UserForm...

我编写了一个 Sub UnloadAllUserForm,我用 LogGenerator Sub 调用它,但得到了同样的错误。

我没有访问任何调试帮助的权限,就像通常在 VBA 编辑器中那样(突出显示错误行),但我通过 Debug.Print 管理,发现是带有“Unload”的行引发了错误。

我在那个 UnloadAllUserform Sub 中添加了一个错误处理,甚至尝试了“On Error Resume Next”,但错误仍然显示!!!

Sub UnloadAllUserForm() 
  On Error GoTo PROC_ERR 
  ModName = "Errhandler" 
  SubName = "UnloadAll"  
  Dim frm As UserForm  
  For Each frm In UserForms 
    frm.Hide 
  Next frm 
  Exit Sub 
  PROC_ERR: 
    Call LogGenerator(ModName, SubName, Erl, Err.Number, Err.Description)
  Exit Sub 
End Sub

只有在 UserForm_Initialize 子程序中出现错误时,我才会收到 error91。但是,无论 UserForm 是什么,我都会在任何 UserForm_Initialize 子中收到错误 91。我仍然在这里放了一个 UserForm_initialize 的样本:

'Initialisation de l'UserForm
Private Sub UserForm_Initialize()

ModName = "UserFormAjoutItem"
SubName = "UserFormAjoutItem_Initialize"
On Error GoTo PROC_ERR


10  'On définit la page "Ajout pièce comme la page par défaut à l'ouverture
20  MultiPage.Value = 0
30
40  'Pour chaque objet de type TextBox présent dans l'UserForm, on       initialise à valeur vide
50  Dim z As Control
60  For Each z In UserFormAjoutItem.Controls
70  If TypeName(z) = "TextBox" Then
80      z.Value = vbNullScript
90  End If
100 Next z

Exit Sub

PROC_ERR:
Unload Me
Call LogGenerator(ModName, SubName, Erl, Err.Number, Err.Description)
Exit Sub


End Sub

我从来没有过这样的事情,而且我已经没有想法了。

非常感谢您的帮助,非常感谢!

【问题讨论】:

  • 能否请您发布unloadalluserform 订阅者的代码?因为这也是一个主要问题?而且您不需要在end sub 之前直接使用exit sub 而不是unload 在用户窗体的子中使用me.hide
  • 我尝试删除无用的 Exit Sub,但它并没有改变任何东西。我也尝试使用 Me.Hide 或 NameOfUserForm.Hide ;我没有收到错误,但它也没有关闭用户表单(奇怪?)。
  • @Seb.D 我建议你把代码放在你的问题中,这样会更容易阅读。
  • 与其中一种表单关联的事件处理程序可能有问题,但如果没有MCVE,我只能说这些
  • 你不能在它的初始化事件中卸载一个表单。

标签: excel vba userform


【解决方案1】:

如 Me 和 user3964075 所述,您无法在 Initialize 事件中卸载。

您必须传递一个Boolean,在 Initialize 事件被签入子后
如果TRUE= Unload 如果False = 继续

【讨论】:

    猜你喜欢
    • 2016-04-03
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 2016-06-12
    • 2016-03-23
    • 1970-01-01
    • 2016-10-15
    • 2018-11-27
    相关资源
    最近更新 更多