【问题标题】:Running VBA script causes excel to stop responding运行 VBA 脚本导致 excel 停止响应
【发布时间】:2018-04-30 15:30:11
【问题描述】:

我有一个 VBA 脚本,可以将工作表添加到大约 500 个 excel 文件中。 我在运行 VBA 脚本和添加简单的工作表时没有遇到任何问题,但是当我尝试添加一个包含 VBA 脚本以及图形和按钮的工作表时,它会工作一段时间,然后就冻结了。

这里是代码。我知道它没有错误处理 - 有什么建议可以解决这个问题,或者是什么导致 excel 冻结?

Sub FindOpenFiles()

Const ForReading = 1
Set oFSO = New FileSystemObject

Dim txtStream As TextStream

Dim FSO As Scripting.FileSystemObject, folder As Scripting.folder, file As Scripting.file, wb As Workbook, sh As Worksheet
Dim directory As String

'The path for the equipement list. - add the desired path for all equipement or desired value stream only.
Set txtStream = oFSO.OpenTextFile("O:\SiteServices\Maintenance\Maintenance Support Folder\Maintenance Department Information\HTML for Knowledgebase\Excel for Knowledgebase\Equipement paths-all.txt", ForReading)

Do Until txtStream.AtEndOfStream
    strNextLine = txtStream.ReadLine
    If strNextLine <> "" Then

    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set folder = FSO.GetFolder(strNextLine)


    For Each file In folder.Files
        If Mid(file.Name, InStrRev(file.Name, ".") + 1) = "xls" Then
            Workbooks.Open strNextLine & Application.PathSeparator & file.Name

        Set wb = Workbooks("Equipment Further Documentation List.xls")
    For Each sh In Workbooks("Master File.xls").Worksheets
        sh.Copy After:=wb.Sheets(wb.Sheets.Count)
    Next sh

     ActiveWorkbook.Close SaveChanges:=True
     ActiveWorkbook.CheckCompatibility = False

        End If


    Next file
    End If

    Loop
txtStream.Close

End Sub

【问题讨论】:

  • 作为第一行添加到您的子:Application.ScreenUpdating = false 并在 End Sub 之前添加另一行:Application.ScreenUpdating = true
  • 崩溃发生在哪里? (哪一行等)
  • 我没有机会检查它在哪里崩溃...它会将工作表添加到前 4 或 5 个文件中,然后崩溃而没有机会检查它在哪里失败...
  • 您正在复制的工作表中是否有任何可能自动触发的内容?如果是,请您也将 VBA 发布到您正在复制的工作表中。
  • 没有什么,有两个由按钮触发的宏 - 一个通过电子邮件发送图表,一个用于打印。

标签: vba excel


【解决方案1】:

所以,给你一些提示:

第一。 (根据评论)

作为第一行添加到您的子:Application.ScreenUpdating = false 并在 End Sub 之前添加另一行:Application.ScreenUpdating = true

第二。移动这一行(它是设置 constance 参考):

Set wb = Workbooks("Equipment Further Documentation List.xls")

之前:

Do Until txtStream.AtEndOfStream

第 3 次只是一个提示。

要查看子进程的进度,请添加以下行:

Application.StatusBar = file.Name

在这一行之后:

Workbooks.Open strNextLine & Application.PathSeparator & file.Name

在End Sub 之前额外添加以下代码:

Application.StatusBar = false

因此,您可以在 Excel 应用程序的状态栏中看到当前正在处理的文件名。

请记住,处理 500 个文件肯定很耗时。

【讨论】:

  • 第三点很重要——它会让你知道你的潜艇是否正在运行。
  • 另外,在每个循环之前添加 DoEvents。这将确保 excel 继续刷新并保持一定的响应速度。
  • @Cor_Blimey - 稍后会试试这个……告诉你发生了什么……谢谢
  • @Saint,这个子在运行吗?你能在状态栏中看到文件名的变化吗?
  • @KazJaw - 是的,它正在运行......但同样的事情发生了,在 4 个文件之后,宏冻结,我必须重置 PC 以关闭 excel,即使在任务管理器中我也无法关闭它。
【解决方案2】:

我的问题终于解决了……

解决方法是添加一行代码:

Application.Wait (Now + TimeValue("0:00:01"))

行后:

sh.Copy After:=wb.Sheets(wb.Sheets.Count)

这样可以有时间将工作表复制到新的 excel 文件中。

到目前为止,它一直在发挥作用。

我要感谢所有帮助我解决这个问题的人。

非常感谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 2023-03-13
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多