2010-07-23 15 views
2

J'ai un document Word en tant que pièce jointe à un e-mail dont j'ai besoin pour transmettre des données à une URL. Pour ce faire, je suis en train d'enregistrer la pièce jointe dans le fichier temporaire local, puis d'ouvrir le document, puis d'utiliser le modèle d'objet Word pour extraire des données des tables du document.Ouverture de Word (à partir d'Outlook VBA) en mode sans échec

Je rencontre quelques problèmes lors de l'ouverture du document dans VBA: tout d'abord, il est très lent car nous avons des macros d'entreprise qui se chargent lorsque Word s'ouvre; et deuxièmement s'il y a des messages qui cinglent lorsque Word s'ouvre (comme des trucs de récupération de document), le code se bloque et Word n'est jamais fermé. Donc, ma question est: est-ce que je peux ouvrir Word en mode sans échec de VBA afin que rien d'autre que le document bare Bones soit disponible (parce que c'est tout ce dont j'ai besoin)? Ou, y a-t-il une meilleure façon de contrôler Word qui contourne les problèmes que j'ai?

Répondre

2

Peut-être utiliser shell pour ouvrir en mode sans échec, dire:

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

Ensuite, utilisez GetObject pour obtenir l'instance.

Plus de détails:

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 

Pour sommeil, il a besoin d'aller en haut du module:

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

/a Démarrer Word et empêche les compléments et modèles globaux (y compris le modèle Normal) d'être chargé automatiquement.

Le commutateur/a verrouille également les fichiers de paramètres; c'est-à-dire que les fichiers de paramètres ne peuvent pas être lus ou modifiés si vous utilisez ce commutateur.

+0

merci pour cela. Je n'ai pas encore essayé (d'où le retard dans cette réponse) mais il ressemble exactement à ce que je veux. Merci encore. –