【问题标题】:Excel VBA macro for opening files crashes without any error message用于打开文件的 Excel VBA 宏崩溃而没有任何错误消息
【发布时间】:2020-04-15 00:05:58
【问题描述】:

几年来,我在互联网某处有一个宏,它可以打开选定文件夹中的所有文件并对其进行处理(更改所有文件,将它们合并为一个,更改列顺序等)。

由于某种原因,对于某些文件,宏会崩溃而没有任何错误消息。有一天它崩溃了,另一天它没有。它在我的电脑和其他电脑上崩溃,或者它不会在我的电脑上崩溃,它在我的电脑上崩溃等等......

如果文件夹中有 50 个文件或只有两个小文件,它会崩溃。

我可以让宏运行到最后的唯一方法是在 Set wb = Workbooks.Open(Pathname & Filename) 上创建一个断点,有时甚至在 Do Work wb 。然后当宏在这个断点处停止时,我只按 F5,它会做它应该做的一切,直到它再次到达断点。

Public LastLine As Long
Public final_file As String
Public my_directory As String

Sub ProcessFiles()
Dim Filename, Pathname As String
Dim wb As Workbook


Application.AskToUpdateLinks = False
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual
 Application.EnableEvents = False

final_file = ActiveWorkbook.Name


my_directory = InputBox("What's the name of the folder with the files?:", "What's the name of the folder with the files", "New files")
Pathname = ActiveWorkbook.Path & "\" & my_directory & "\"
Filename = Dir(Pathname & "*.xlsx")

Do While Filename <> ""
    Set wb = Workbooks.Open(Pathname & Filename)
    DoWork wb
    ActiveWindow.Close
    Filename = Dir()
Loop

    LastLine = 0
Application.ScreenUpdating = True
Application.AskToUpdateLinks = True
Application.DisplayAlerts = True
Application.TransitionNavigKeys = False
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub



Sub DoWork(wb As Workbook)
   With wb
       'Here it does the tricks with each opened file

End Sub

您知道这有什么问题吗? 谢谢

【问题讨论】:

  • 你应该注释掉,在行前添加',application.screenupdating,application.displayalerts。这将使 excel 显示所有消息,并可以帮助您识别手头的问题。
  • 试试这个 - Dim Filename As String, Pathname As String
  • wb.Close替换ActiveWindow.Close
  • Excel 文件可能会随着时间的推移而损坏。您应该使用 MZTools Clean Project 功能。它将重建项目,删除多年来积累的任何代码残留。
  • @Luuklag:即使我禁用这两个也没有错误消息。

标签: excel vba crash


【解决方案1】:

我也遇到过类似的情况,当依次打开多个工作簿执行技巧时,Excel 会无缘无故地崩溃而没有任何错误消息。

尝试添加Application.WaitWorkbook.OpenWorkbook.Close 之后再次添加到您的代码 - 至少 3 秒。从那以后就没有问题了。

newHour = Hour(Now()) 
newMinute = Minute(Now())
newSecond = Second(Now()) + 3
waitTime = TimeSerial(newHour, newMinute, newSecond) 
Application.Wait waitTime

我从https://docs.microsoft.com/en-us/office/vba/api/excel.application.wait得到这个

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多