使用 VBA 退出 Excel 会导致运行时错误 424

Posted

技术标签:

【中文标题】使用 VBA 退出 Excel 会导致运行时错误 424【英文标题】:Quitting Excel using VBA causes run-time error 424 【发布时间】:2008-12-30 18:15:27 【问题描述】:

我一直在编写一个 VBA 宏,它可以在 Excel 中打开一个 html 文档(以便对其执行各种计算)。 Excel 将在当前文件夹中搜索 HTML 文档。如果在那里找不到它,它将产生一个文件打开框,用户可以在其中手动浏览到 HTML 文档的位置。到目前为止一切都很好。但是,如果用户选择取消(而不是选择文件),我希望 Excel 显示一条消息并退出。

消息已生成,但随后代码停止并出现以下错误:

运行时错误“424”:需要对象。

这听起来并不麻烦,但我一直在碰壁,试图找出导致问题的原因。

似乎不起作用的子是:

Sub ExitWithoutPrompt()

MsgBox "You failed to select a file, therefore Excel will now close.  Please refer to the readme file."
Excel.Application.DisplayAlerts = False
Excel.Application.Quit

End Sub

我正在使用 MS Excel 2002,但我希望该解决方案能够处理尽可能多的 Excel 变体。

任何关于我哪里出错的帮助都非常感激。顺便说一句,我是一个完全的新手,所以如果可能的话,请多多指教你可能对我的任何指导......

我在宏中使用的另外两个 subs 可能会在下面使用(冒着使这篇文章变得笨拙的风险):

第一个子:

Sub Endurance()

Call OpenHTML

Range("G27").Value = "Category"
Range("G28").Value = "Meat"
Range("G29").Value = "Veg"
Range("G30").Value = "PRP"
Range("F27").Value = "Fleet"
Range("E27").Value = "Consumption"

Range("E32").Value = "Endurance"

Range("E33").Value = "Lowest Category"
Range("E34").Value = "Fleet"
Range("E35").Value = "Consumption"

Range("E27, F27, G27, E32").Font.Bold = True
Range("F28").Value = WorksheetFunction.Sum(Range("E8,E9,E11,E14,E21"))
Range("E28").Value = WorksheetFunction.Sum(Range("G8,G9,G11,G14,G21"))
Range("F29").Value = WorksheetFunction.Sum(Range("E10,E16"))
Range("E29").Value = WorksheetFunction.Sum(Range("G10,G16"))
Range("F30").Value = WorksheetFunction.Sum(Range("E20,E22"))
Range("E30").Value = WorksheetFunction.Sum(Range("G20,G22"))

Columns("E:F").EntireColumn.AutoFit

Range("G28:G30, E27, F27, G27, G33").Select
    With Selection
        .HorizontalAlignment = xlRight
    End With

Range("E27:G30, E32:G35").Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    Selection.Borders(xlInsideVertical).LineStyle = xlNone
    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone


Dim Endurance As Double
Endurance = WorksheetFunction.Min(Range("F28:F30"))
Range("G34").Value = WorksheetFunction.RoundDown(Endurance, 0)

Endurance = WorksheetFunction.Min(Range("E28:E30"))
Range("G35").Value = WorksheetFunction.RoundDown(Endurance, 0)

Range("G33").Value = Endurance

Dim LowCat As String

LowCat = WorksheetFunction.VLookup(Endurance, Range("E28:G30"), 3, False)
Range("G33").Value = LowCat

ActiveSheet.PageSetup.PrintArea = "$A$1:$G$35"
ActiveSheet.PageSetup.Orientation = xlLandscape

Range("G36").Select

If MsgBox("Print endurance statement?", vbYesNo + vbDefaultButton2, "Print endurance") = vbYes Then
    ActiveWindow.SelectedSheets.PrintOut Copies:=1
    Else
    Range("G36").Select
    End If


End Sub

还有第二个子:

Sub OpenHTML()

On Error GoTo MissingFile

Workbooks.Open FileName:=ThisWorkbook.Path & "\TRICAT Endurance Summary.html"


Exit Sub

MissingFile:

Dim Finfo As String
Dim FilterIndex As Integer
Dim Title As String
Dim FileName As Variant

' Set up list of file filters
Finfo = "HTML Files (*.html),*.html," & _
        "All Files (*.*),*.*,"

' Display *.html by default
    FilterIndex = 1

' Set the dialog box caption
Title = "Select TRICAT Endurance Summary"

' Get the filename
FileName = Application.GetOpenFilename(FInfor, FilterIndex, Title)

' Handle Return info from dialog box
If FileName = False Then
    Call ExitWithoutPrompt
    Else
    MsgBox "You selected" & FileName
    Workbooks.Open FileName

End If

End Sub

如果你已经到了这一步,感谢阅读......

【问题讨论】:

哪一行导致了错误?通常 VBA for Excel 的调试器会告诉你。 感谢您提供所有代码以及对问题的完整描述! 【参考方案1】:

添加对ActiveWorkbook.Close的呼叫到ExitWithoutPrompt

Sub ExitWithoutPrompt()
    MsgBox "You failed to select a file, therefore Excel will now close.  Please refer to the readme file."
    Excel.Application.DisplayAlerts = False
    Excel.Application.Quit
    ActiveWorkbook.Close False
End Sub

这适用于我在 Excel 2003 下。

出于某种原因,调用Application.QuitActiveWorkbook.Close 的顺序很重要。与直觉相反,至少对我而言,如果您在 Application.Quit 之前调用 ActiveWorkbook.Close,您仍然会收到错误消息。

【讨论】:

哇。多年来,我一直在谷歌上搜索它,只需要一行。感谢您的帮助,非常感谢。 说实话,我只是偶然发现了它。我在想你必须先关闭工作簿,所以我在退出之前添加了 ActiveWorkbook.Close 调用。那没有用,所以我玩了一下,让它工作了。我无法解释为什么...... 虽然是明显定向的绊脚石,而不是像我这样盲目的绊脚石。你是明星。

以上是关于使用 VBA 退出 Excel 会导致运行时错误 424的主要内容,如果未能解决你的问题,请参考以下文章

在Excel VBA中,如何测试Excel.Range对象变量是否丢失其引用而不会引发运行时错误424 ..?

将 Excel 2007 中的文本写入 Sharepoint 站点上的 .txt 文件会导致运行时错误“76”找不到路径

VBA excel英语2007导致excel 2016法语错误消息

从 C# 运行 Excel 宏:从 VBA 捕获运行时错误

excel vba 运行时错误

奇怪的 excel-vba 运行时错误,不会删除现有工作表