Excel错误,停止运行宏。

5
我在Excel上遇到了一个奇怪的错误。我有一个宏,当我按下CTRL+m(宏快捷键)时,会显示一个非模态用户窗体。偶尔会出现一次或两次(一天中出现一两次,我每5分钟左右使用宏),Excel不会运行宏,不会显示用户窗体,只会发出嘟声(表示“错误,无法继续执行代码”)。
我进入宏窗口尝试按“运行”手动执行,但所有按钮都被禁用,除了“创建”按钮。如果您单击它,它会说宏名称无效。如下面的屏幕截图所示,宏的名称显示代码实例(工作簿的Sheet1)。
有时可以通过保存工作簿并重新尝试来解决,但有时候不行。在这种情况下,我运行另一个宏(通过双击特定列),显示一个模态用户窗体,并执行其代码。然后我的第一个宏就恢复正常了。
非常感谢任何帮助。

Macro run window

编辑:根据评论要求添加代码

Sub ShowCommentWindow()
    Dim myCell As Range
    Dim companyColumn As Long
    Dim wbk as Workbook
    Dim company as String
    Dim phone as Long

    Set wbk = ActiveWorkbook

For Each myCell In wbk.Worksheets(1).Range("A1:Q1")

   If myCell.Text = "Company" Then
        companyColumn = myCell.Column
        company = ActiveCell.Text
        phone = ActiveCell.Offset(0, 4).Value
        Exit For
    End If
Next myCell

If ActiveCell.Column = companyColumn Then

    If EmailForm.Visible Then
        GoTo ExitProc
    Else
        If Not ActiveCell.Row < 4 Then
            ActiveWindow.ScrollRow = ActiveCell.Row - 3
        Else
            ActiveWindow.ScrollRow = ActiveCell.Row
        End If
        If CommentWindow.Visible Then
            CommentWindow.AddButton.SetFocus
            CommentWindow.CommentBox.SetFocus
            Exit Sub
        Else
            CommentWindow.Show
            ManageComments
            AddComment
        End If
    End If
End If

ExitProc:
End Sub

编辑2:发布更多代码,用于QueryClose:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

Dim myCell As Range
Dim isCompany As String

    If Not CommentWindow.CommentBox.Text = CommentWindow.TextCopy.Text Then
        saveConf = MsgBox("Changes have not been saved yet. Do you want to save?", vbExclamation + vbYesNoCancel + vbDefaultButton2, "Save changes?")
        If saveConf = vbYes Then
            Call SaveComment
            GoTo ExitProc
        ElseIf saveConf = vbCancel Then
            changed = True
            Cancel = 1
            CommentWindow.AddButton.SetFocus
            CommentWindow.CommentBox.SetFocus
            'CommentWindow.CommentBox.Text = CommentWindow.TextCopy.Text
        Else
            CommentWindow.TextCopy.Text = CommentWindow.CommentBox.Text
            GoTo ExitProc
        End If
    Else
        If Not changed = True Then
            GoTo ExitProc
        End If
    End If

ExitProc:
End Sub

没有,完全没有。刚刚检查了一下,什么都没有。 - Andres Felipe Martinez
我有一个类似的问题,涉及到一个包含几个表单(是模态的)的Excel工作簿。我认为这可能与我正在引用的某个COM对象或Windows Defender以某种方式锁定了工作簿有关(此时我甚至无法保存我的工作簿),但这只是我自己的猜测。 - Tim
也许有一个流氓线程在您的脚本中循环。下次发生这种情况时,建议您进入Visual Basic编辑器(ALT + F11),中断代码并查看它是否卡在脚本的某个特定部分。希望这可以帮到您。干杯! - nbayly
谢谢nbayly,但我不认为是那个问题,因为当我进入代码并运行它时,它可以正常工作。然后我返回Excel,快捷键仍然无法正常工作。我还是被难住了。 - Andres Felipe Martinez
1
Close不会卸载用户窗体,它只是关闭它(预期行为),如果在保存后显示用户窗体,则可以确认该行为(它将具有之前保存的值-可能会在某处引发错误)。最好的方法是始终卸载用户窗体-close应该小心处理,因为它与unload不同,close将保留元素在内存中,而excel中的“垃圾回收器”并不完全准确。 - Sgdva
显示剩余11条评论
2个回答

2
似乎问题不在于从(Unload(UserForm))卸载表单。 这会导致内存泄漏。 即使是官方文档 - 这是指Access,但应该对Excel产生相同的影响(那里没有Form对象或用户窗体文档)-声明生命周期为Unload-> Deactivate-> Close,并且当关闭用户窗体时也应该发生这种情况,日常使用表明,如果未指定,则可能不会触发卸载。 生命周期有时不是那么严格监控的,但这可能会导致内存泄漏和奇怪的行为,总是在使用对象时不应该依赖垃圾收集器在未指定的情况下清理它们。可能添加一些内容以确认已正确处理终止将很有帮助。 编辑 如果您遇到记忆卸载的问题或仍然存在内存问题,则执行以下操作将是一个好习惯:
Sub MyMainProcess()
Dim myform As UserForm1: Set myform = UserForm1 'this is your UserForm name
myform.Show
'my stuff needed...
Unload myform
Set myform = Nothing
End Sub

尽可能使用编码卸载和清理无用内容。

1
不错的发现@Sgdva!我检查了我的代码,发现有一个用户窗体很少被加载,但从未卸载。这可能解释了为什么我的代码可以连续工作几周,然后变得无响应和无法保存。我可能需要寻找改进垃圾收集的方法。 - Tim
始终连续声明“对象”,这样您就可以更容易地在最后将其设置为无,始终记得在从子程序中检索所需行为后卸载用户窗体。 - Sgdva
我确实有一些要补充的,尽管在添加了Unload部分后,代码到目前为止一直没有出现问题:这个问题甚至发生在我创建宏的第一个版本时,那个版本根本没有使用任何表单。真是匪夷所思。 - Andres Felipe Martinez
你确定没有使用其他对象吗?这可能会发生在所有未在调用后设置为nothing的对象上 - 我不知道什么会触发它,哪些情况是可以的,哪些情况超出了范围 - 这就是为什么我们不让垃圾收集器来解决它并将其设置为nothing的原因。 - Sgdva

0

我看到你在调用一个“外部”宏(它不在活动工作簿内)- 是否有可能是因为那大约每天2次它不起作用的时候,工作簿(Database 2 Lumber.xlsm)正在被其他人使用(八个运行该工作簿或另一个宏)?

如果是这样,我以前做过的是在每次运行宏时保存工作簿的本地副本。


这不应该是一个因素,即使被其他人使用也不会影响宏的运行-因为它加载存档的最后已知阶段。OT:我在共享驱动器上有一个宏,每个人都可以使用而不会干扰其他人的工作,只限制在共享驱动器中保存(再次提醒,只有我能够进行代码更新;这主要是为了适应用户信息的模板,但对于每个人来说都是个人的)。 - Sgdva
这有点晚了,我知道,但出于某种原因,我没有收到这些答案的通知。无论如何,对于Jeremy来说:那是最令人困惑的事情。这个宏并不在另一个工作簿上。Database 2 Lumber.xlsm是代码所在的工作簿;当错误发生时,Excel会显示该宏不存在。无论如何,通过逐行检查确保表单在适当的时间被卸载,并且在完成后将对象设置为“Nothing”来解决了这个问题。 - Andres Felipe Martinez
很酷,很高兴你解决了这个问题 - 老实说,如果没有尝试重现,我不会想到那个问题。 - Jeremy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接