我想知道是否有人可以阐明为什么从Excel中打开Word文档要花几秒钟的时间?下面的代码使用InStr快速查找/打开特定的子文件夹,即该子文件夹名称的debug.print是立即的,但是打开特定的Word文档大约需要4秒钟。我尝试在Word本身中测试类似的过程,它几乎立即打开了文档。我仍在学习VBA,我不确定是什么原因,而不是与最后一个restrFile有关。 任何建议,将不胜感激。
Sub LoopSubfolderAndFiles()
Dim fso As Object
Dim folder As Object
Dim subfolder1 As Object
Dim strTextFind1 As String
Dim strFileFound As String
Dim CurrFile As Object
Dim myFile As Object
Dim strFile As String
Dim strExtension As String
Dim wordApp As New Word.Application
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder("Enter FILEPATH name..........")
Set subfolder1 = folder.subfolders
strTextFind1 = "useful"
strFileFound = "test"
strExtension = ".doc"
For Each subfolder1 In subfolder1
If InStr(1, subfolder1.Name, strTextFind1, vbTextCompare) > 0 Then
Set CurrFile = fso.GetFolder(subfolder1)
Debug.Print subfolder1.Name
Exit For
End If
Next
For Each CurrFile In CurrFile.Files
If InStr(1, CurrFile.Name, strFileFound, vbTextCompare) > 0 Then
Set myFile = fso.GetFile(CurrFile)
strFile = myFile.Path
wordApp.Visible = True
wordApp.Documents.Open (strFile)
Debug.Print strFile
End If
Next
Set fso = Nothing
Set folder = Nothing
Set subfolder1 = Nothing
Set CurrFile = Nothing
End Sub
答案 0 :(得分:2)
您的代码没有任何实质性错误。言语很慢。
差异可能是进程内还是进程外。 “进程外”调用是使用RPC网络远程调用过程进行的。隐藏的窗口被创建,以便可以接收消息。这都是非常复杂的,因此在所有情况下,进程外调用都可以工作。处理中调用只是机器代码跳转指令。几个时钟周期与成千上万个时钟周期有关。
有一些小问题。
这些行毫无意义。对于隐式变量,在每行的末尾进行处理;对于显式变量,在每个end function
等行中进行处理。参见Declaring Variables Memory Leaks
Set fso = Nothing
Set folder = Nothing
Set subfolder1 = Nothing
Set CurrFile = Nothing
如果要执行此间接操作,则它们必须为const
。编译器会将它们放在用作文字的行中。仅在需要的地方使用变量。
strTextFind1 = "useful"
strFileFound = "test"
strExtension = ".doc"
所以
const strTextFind1 = "useful"
const strFileFound = "test"
const strExtension = ".doc"
您要晚于FSO。像对Word一样使用早期绑定。参见Pointers needed for speeding up nested loop macro in VBA。然后不要像Dim folder As Object
那样在输入文字时将其变暗。