VBA - Почему Word открывается из Excel медленно? - PullRequest
0 голосов
/ 12 сентября 2018

Интересно, может кто-нибудь пролить свет на то, почему открытие документа Word займет несколько секунд из Excel?Приведенный ниже код быстро находит / открывает определенную подпапку, используя InStr, т.е. debug.print с именем подпапки выполняется немедленно, однако открытие определенного документа Word занимает около 4 секунд.Я попробовал протестировать аналогичную процедуру в самом Word, он почти сразу открыл документ.Я все еще изучаю VBA, и я не уверен, в чем причина, кроме как что-то связанное с последним битом re-strFile. Любые предложения будут оценены.

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

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

В вашем коде нет ничего неправильного. Слово медленно.

Разница может быть в процессе и вне процесса. Вызовы вне процесса выполняются с использованием процедуры удаленного вызова сети RPC. Скрытые окна создаются, чтобы сообщения могли быть получены. Это все очень сложно, поэтому внеплановые вызовы работают при любых обстоятельствах. В Process Calls это просто инструкция перехода по машинному коду. Несколько тактов против десятков тысяч и более.

Есть небольшие проблемы.

Эти строки бессмысленны. Это обрабатывается в конце каждой строки для неявных переменных и каждые end function и т. Д. Для явных переменных. См. Объявление утечек памяти переменных

Set fso = Nothing
Set folder = Nothing
Set subfolder1 = Nothing
Set CurrFile = Nothing

Если вы хотите сделать это косвенное обращение, тогда они должны быть const. Компилятор поместит их в строку, где они используются как литералы. Используйте переменные только там, где это необходимо.

strTextFind1 = "useful"
strFileFound = "test"
strExtension = ".doc"

So

const strTextFind1 = "useful"
const strFileFound = "test"
const strExtension = ".doc"

Вы опоздали с FSO. Используйте раннее связывание, как и для Word. См. Указатели, необходимые для ускорения макроса вложенного цикла в VBA . Затем вместо Dim folder As Object уменьшите его, как вы делаете слово.

0 голосов
/ 12 сентября 2018

Глядя на ваш код, вы не просто открываете документ, но и запускаете новый экземпляр приложения Word *. Так что есть ряд факторов, которые требуют времени:

  1. Стартовое слово. Вы когда-нибудь рассчитывали, сколько времени потребуется Word для запуска, когда вы нажимаете на значок? Во-первых, само приложение необходимо загрузить. Затем может произойти загрузка любого количества надстроек, что займет время.
  2. Когда внешнее приложение «автоматизирует» другое приложение, для «межбарьерного» обмена данными наступает момент времени. VBA в приложении Office обычно довольно быстрая; те же команды, выполняемые из другого приложения, будут (заметно) медленнее.

'* Вы никогда не должны объявлять и создавать экземпляры приложения в одной строке в VBA. Вы должны изменить свой код на:

Dim wordApp as Word.Application
Set wordApp = New Word.Application
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...