我在Excel上遇到了一个奇怪的错误。当我按CTRL + m(宏快捷方式)时,我有一个显示非模态用户窗体的宏。每隔一段时间,它就不那么频繁了(白天一次或两次显示,我每隔5分钟左右使用一次),Excel不会运行宏,赢得了#。 t显示用户形式并且只会发出蜂鸣声(如"错误,无法继续执行代码")。
我进入微距窗口尝试按下"运行"并手动执行,但所有按钮都被禁用,除了"创建"。如果单击它,则表示宏名称无效。正如您在下面的屏幕截图中看到的,宏的名称显示了代码所在的实例(工作簿的Sheet1)。
有时可以通过保存工作簿并重新尝试来修复,但有时它不会;当它没有时,我运行一个不同的宏(通过双击特定列),显示模态用户表单,并执行其代码。然后我的第一个宏恢复正常。
非常感谢任何帮助。
编辑:根据评论中的要求添加代码
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
答案 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)正在被其他人使用(八个正在运行那个,或另一个宏?)。
如果是这样,我以前做的是每次运行宏时保存工作簿的本地副本