Excel错误,停止运行宏

时间:2016-02-25 19:35:15

标签: excel excel-vba vba

我在Excel上遇到了一个奇怪的错误。当我按CTRL + m(宏快捷方式)时,我有一个显示非模态用户窗体的宏。每隔一段时间,它就不那么频繁了(白天一次或两次显示,我每隔5分钟左右使用一次),Excel不会运行宏,赢得了#。 t显示用户形式并且只会发出蜂鸣声(如"错误,无法继续执行代码")。

我进入微距窗口尝试按下"运行"并手动执行,但所有按钮都被禁用,除了"创建"。如果单击它,则表示宏名称无效。正如您在下面的屏幕截图中看到的,宏的名称显示了代码所在的实例(工作簿的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

Edit2:为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

2 个答案:

答案 0 :(得分:2)

似乎问题不是从(Unload(UserForm))卸载表单
这导致memory leak.
Even the official documentation - 这是指Access,但是,Excel的行为应该相同(那里没有Form对象或userform文档) - 说明生命周期是卸载 - &gt;取消激活 - &gt;关闭,这也应该在关闭用户窗体时发生,每日使用情况表明,关闭用户窗体时可能不会触发未加载时卸载。
生命周期有时不是严格监控的,但是,这可能会导致内存泄漏和奇怪的行为,总是在处理对象时,如果没有指定,你不应该依赖垃圾收集器清理它们。可能添加一些内容以确认terminate正确处理将会有所帮助。
修改
如果您在记住卸载时遇到问题 - 或者仍然存在记忆问题 - 那么执行以下操作将是一个好习惯:

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 :(得分:0)

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

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