【问题标题】:Excel error, stops running macroExcel 错误,停止运行宏
【发布时间】:2016-02-25 19:35:15
【问题描述】:

我在 Excel 上遇到了一个奇怪的错误。我有一个宏,当我按下 CTRL+m(宏快捷键)时,它会显示一个非模态用户窗体。每隔一段时间,而且不是那么频繁(白天出现一两次,我每 5 分钟左右使用一次宏),Excel 不会运行宏,不会显示用户窗体,只会发出哔哔声(如“错误,无法继续执行代码”)。

我进入宏窗口尝试按“运行”并手动执行,但所有按钮都被禁用,“创建”除外。如果单击它,则表示宏名称无效。正如您在下面的屏幕截图中看到的那样,宏的名称显示了代码所在的实例(工作簿的 Sheet1)。

有时可以通过保存工作簿并重新尝试来修复它,但有时它不会;如果没有,我运行一个不同的宏(通过双击一个特定的列)显示一个模态用户窗体,并执行它的代码。然后我的第一个宏恢复正常。

任何帮助将不胜感激。

编辑:在 cmets 中按要求添加代码

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

【问题讨论】:

  • 在任何时候,您的宏都会禁用事件或屏幕更新,如 Application.EnableEvents = False 和 Application.ScreenUpdating = False`。如果是这样,您的宏在处理您的逻辑时可能处于某种未知状态。尝试在 VBA 编辑器的“立即”窗口中启用其中一个或两个,看看它是否“解锁”了您的宏。
  • 不,一点也不。刚刚检查过,什么都没有。
  • 这发生在我身上一次......忘记我是如何解决它的:/尝试删除并创建新模块。
  • 我的 Excel 工作簿有一个类似的问题,它有几个表单(它们是模态的)。我认为这与我正在引用的一个 COM 对象或 Windows Defender 以某种方式锁定工作簿有关(那时我什至无法保存我的工作簿),但那是 W.A.G.就我而言。
  • Close 不会卸载用户表单,它只是关闭它(预期的行为),如果您在之后显示用户表单,您可以确认该行为(它将具有保存之前的值 - 可能会给出某处出错-)。最好的方法是始终卸载用户表单 - 应小心处理关闭,因为它与卸载不同,关闭会将元素保留在内存中,并且 excel 中的“垃圾收集器”不是 100% 准确 -

标签: excel vba


【解决方案1】:

似乎问题不是从 (Unload(UserForm)) 卸载表单
这导致memory leak.
Even the official documentation -this 指的是 Access,但是对于 Excel 的行为应该相同(那里没有 Form 对象或用户表单文档)- 声明生命周期是 Unload->Deactivate->Close,这应该在您关闭时发生用户表单也是如此,日常使用表明,如果没有说明,则在关闭用户表单时可能不会触发 Unload。
生命周期有时没有被严格监控,但是,这可能会导致内存泄漏和奇怪的行为,总是在处理对象时,如果没有指定,你不应该依赖垃圾收集器来清理它们。可能添加一些内容以确认 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

通过编码尽可能多地卸载和清理

【讨论】:

  • 不错@Sgdva!我浏览了我的代码,发现一个用户表单很少被加载但永远不会被卸载。这可能解释了为什么我的代码在变得无响应和无法保存之前一次工作数周。我可能不得不寻找改进垃圾收集的方法。
  • 始终连续声明“对象”,以便您“记住”并在最后发现更容易设置为空,并始终记住在您的子中检索到所需行为后卸载用户表单
  • 我确实有一些东西要添加,尽管到目前为止代码在添加 Unload 部分之后一直没有问题:即使我创建了我的宏的第一个版本,这个问题也发生在我身上,它使用根本没有表格。去看看。
  • 您确定您没有使用其他对象吗?这可能发生在所有调用后未设置为空的对象上-我不知道什么会触发它什么情况正常以及什么情况超出范围-这就是我们不这样做的原因t 让垃圾收集器计算它并设置为空-
【解决方案2】:

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

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

【讨论】:

  • 这不应该是一个因素,即使它被其他人使用,在运行宏时不会影响 - 因为它加载存档的最后一个已知阶段 -。 OT:我在共享驱动器上有一个宏,每个人都可以使用它而不会干扰其他人的工作,只是限制了共享驱动器中的保存(同样,只有我可以为代码更新执行此操作;这是一个主要适合的模板用户信息,但它是每个人的个人信息)。
  • 我知道这已经很晚了,但由于某种原因,我没有收到这些答案的通知。无论如何,对杰里米:那是最令人困惑的事情。此宏NOT 在不同的工作簿上。 Database 2 Lumber.xlsm WAS 代码所在的工作簿;发生错误时,Excel 会将宏显示为不存在。无论如何,通过遍历每一行并确保在适当的时间卸载表单并在完成后将对象设置为Nothing 来解决它。
  • 酷,很高兴你修复了它 - 老实说,我不会想到这一点,因为我只是在阅读线条而不是尝试复制
猜你喜欢
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 2017-08-15
相关资源
最近更新 更多