Открытие Word (из Outlook VBA) в безопасном режиме - PullRequest
2 голосов
/ 23 июля 2010

У меня есть документ Word в виде вложения в электронное письмо, из которого мне нужно получить некоторые данные для передачи на URL. Для этого я сохраняю вложение в локальном временном файле, затем открываю документ и затем использую объектную модель Word для извлечения данных из таблиц в документе.

У меня возникла пара проблем при открытии документа в VBA: во-первых, он очень медленный, потому что у нас есть некоторые корпоративные макросы, которые загружаются при открытии Word; и, во-вторых, если при открытии Word появляются какие-либо сообщения (например, восстановление документов), код просто зависает и Word никогда не закрывается.

Итак, мой вопрос: могу ли я открыть Word в безопасном режиме из VBA, чтобы ничего, кроме простого документа, не было (потому что это все, что мне нужно)? Или есть ли лучший способ управления Word, который помогает решить проблемы, с которыми я сталкиваюсь?

1 Ответ

2 голосов
/ 23 июля 2010

Возможно, используйте shell для открытия в безопасном режиме, скажем:

"C: \ Program Files \ Microsoft Office \ Office11 \ Winword.exe" / a

Затем используйте GetObject, чтобы получить экземпляр.

Подробнее:

Dim wd As Object
Dim strWord As String, strDoc As String
Dim intSection As Integer
Dim intTries As Integer

    On Error GoTo ErrorHandler

    strWord = "C:\Program Files\Microsoft Office\Office11\WinWord.Exe"
    strDoc = "C:\Docs\ADoc.doc"

    Shell """" & strWord & """ /a", vbMinimizedFocus

    ''Set focus to something other than the word document
    ''See http://support.microsoft.com/kb/238610
    Forms!MyForm.SetFocus

    intSection = 1 ''attempting GetObject...
    Set wd = GetObject(, "Word.Application")
    intSection = 0 ''resume normal error handling

    wd.Documents.Open strDoc

    ''Code here

    Set wd = Nothing

    ''Exit procedure:
    Exit Sub

ErrorHandler:
    If intSection = 1 Then
        intTries = intTries + 1
        If intTries < 20 Then
            Sleep 500 '' wait 1/2 seconds
            Resume ''resume code at the GetObject line
        Else
            MsgBox "GetObject still failing. Process ended.", _
                vbMsgBoxSetForeground
        End If
    Else ''intSection = 0 so use normal error handling:
        MsgBox Error$
    End If

Для сна это должно идти в верхней части модуля:

Private Declare Sub Sleep Lib "kernel32" _
    (ByVal dwMilliseconds As Long)

/ a Запускает Word и предотвращает автоматическую загрузку надстроек и глобальных шаблонов (включая шаблон Normal).

Переключатель / a также блокирует файлы настроек; то есть файлы настроек не могут быть прочитаны или изменены, если вы используете этот переключатель.

...