Существует множество стратегий для обработки ситуации, когда код должен ссылаться на конкретный объект, который может присутствовать или не присутствовать.Какой подход является «лучшим», отчасти философское соображение.Основные подходы:
- Запуск ошибки и ее обработка.Вот как разработан код в вопросе.При использовании VBA это также правильный подход, поскольку он может быть относительно быстрым.Однако для любого языка .NET он значительно замедлит код и не должен использоваться, если есть какая-либо другая возможность.
- Итерация коллекции для определения доступности рассматриваемого объекта.Если коллекция содержит много элементов, это может быть медленнее в VBA, чем подход к обработке ошибок.С другой стороны, это делает код более понятным (на мой взгляд).
Стратегия для обоих подходов изложена ниже, на основе кода в вопросе.
Обработка ошибок
В процедуре можно использовать более одной «метки» (цель для обработчика ошибок, к которой можно перейти), поэтому можно иметь «метку» для каждой отдельнойдокумент.Таким образом, для каждого документа доступен отдельный обработчик ошибок с собственной «веткой» кода.
On Error GoTo PROBLEM_CEEMA
Windows("CEEMEA & LATAM").Activate ''''' Here checking CEEMEA & LATAM status
On Error GoTo General
'''' after checking STATUS do some work on CEEMEA & LATAM '''''
On Error GoTo PROBLEM_TICKER
Set doc = Application.Windows("Ticker Graveyard").Document ''''' Here checking Ticker Graveyard status
On Error GoTo General
'''' after checking do some work on Ticker Graveyard '''''
Exit Sub
PROBLEM_CEEMA:
If Err.Number = 5941 Then
Documents.Open FileName:="C:\Users\dell\Desktop\EMEA CEEMEA\Ticker Graveyard.docx" --- handling only Ticker document
Else
MsgBox "UNEXPECTED ERROR = " & Err.Number
Exit Sub
End If
Resume Next
PROBLEM_TICKER:
If Err.Number = 5941 Then
Documents.Open FileName:="C:\Users\dell\Desktop\EMEA CEEMEA\CEEMEA & LATAM.docx" --- handling only CEEMEA & LATAM document
Else
MsgBox "UNEXPECTED ERROR = " & Err.Number
Exit Sub
End If
Resume Next
PROBLEM_General:
'General, non-document-related error handling
End Sub
Итерация коллекции документов
Приложение Word сохраняеттекущий список открытых документов в коллекции Documents
.Можно использовать цикл For...Each
(или For
) для запуска коллекции и сравнения имени документа.Это можно сделать в отдельной функции, чтобы код не нужно было повторять.
Sub Test
Dim doc1 as Document, file1 as String
Dim doc2 as Document, file2 as String
file1 = "C:\Users\dell\Desktop\EMEA CEEMEA\CEEMEA & LATAM.docx"
file2 = "C:\Users\dell\Desktop\EMEA CEEMEA\Ticker Graveyard.docx"
If not IsDocumentOpen(file1) Then
Set doc1 = Documents.Open(FileName:=file1)
End If
If not IsDocumentOpen(file2) Then
Set doc2 = Documents.Open(FileName:=file2)
End If
End Sub
Function IsDocumentOpen(fileName as String) as Boolean
Dim doc as Word.Document
Dim isOpen as Boolean
isOpen = false
For Each doc in Documents
IF doc.Name = fileName Then
isOpen = true
End If
Next
IsDocumentOpen = isOpen
End Function