Sai*_*int 7 excel vba excel-vba
我有一个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
Run Code Online (Sandbox Code Playgroud)
所以,给你一些提示:
1.(根据评论)
添加为您的sub的第一行:Application.ScreenUpdating = false并在之前添加另一行End Sub:Application.ScreenUpdating = true
第2位.移动此行(它的设置常量参考):
Set wb = Workbooks("Equipment Further Documentation List.xls")
Run Code Online (Sandbox Code Playgroud)
之前:
Do Until txtStream.AtEndOfStream
Run Code Online (Sandbox Code Playgroud)
第三个只是一个提示.
要查看sub的进度,请添加以下行:
Application.StatusBar = file.Name
Run Code Online (Sandbox Code Playgroud)
在这一行之后:
Workbooks.Open strNextLine & Application.PathSeparator & file.Name
Run Code Online (Sandbox Code Playgroud)
在End Sub添加此代码之前:
Application.StatusBar = false
Run Code Online (Sandbox Code Playgroud)
因此,您可以在Excel应用程序中,在状态栏中看到当前正在处理的文件名.
请记住,使用500个文件必须非常耗时.
我终于解决了我的问题......
解决方案是添加一行代码:
Application.Wait (Now + TimeValue("0:00:01"))
Run Code Online (Sandbox Code Playgroud)
行后:
sh.Copy After:=wb.Sheets(wb.Sheets.Count)
Run Code Online (Sandbox Code Playgroud)
这允许时间将工作表复制到新的Excel文件.
到目前为止,它一直像一个魅力.
我要感谢帮助我解决这个问题的每个人.
非常感谢.