【发布时间】: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% 准确 -