【发布时间】: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,我只能说这些
-
你不能在它的初始化事件中卸载一个表单。