Ouverture/Activation de Documents Word dans une macro VBA
J'espère VB/VBA expert peut m'aider. Considérez les points suivants:
L'utilisateur ouvre un document dans Word 2003, et à l'intérieur de la Normale.dot AutoOpen
macro, nous nous tournons à présent document, et s'il a été ouvert en cliquant sur un lien sur une page web, et répond à certaines autres de l'application des critères spécifiques, fermer le flux de "copie" et ouvrir le document source (qui se trouve sur un lecteur partagé, on peut supposer que l'utilisateur a accès à l'):
Documents.Open origDoc
Documents(ActiveDocument.FullName).Close SaveChanges:=wdDoNotSaveChanges
Documents(origDoc).Activate
With ActiveDocument
''# Do work
End With
Je pensais que j'avais besoin d'appeler Activate
pour s'assurer que le document original a été la ActiveDocument
, mais je suis un 4160 'nom de fichier incorrect" erreur sur la .Activate
appel. Si j'en commentaire l'appel à .Activate
, il semble que ActiveDocument
est définie à l'origDoc document, même si il y avait d'autres documents déjà ouverts (je ne suis pas vraiment sûr de savoir comment les Documents de la Collection est gérée, et la façon dont Word détermine ce que la prochaine ActiveDocument
serait si vous en programmant fermer le ActiveDocument)
Donc, n'appelant .Open
sur un document de définir explicitement le Document à l' ActiveDocument
? En outre, le fait d'appeler .Activate
sur le document actif causer une erreur?
Je n'ai pas vraiment été en mesure de trouver beaucoup de documentation à ce sujet, donc merci d'avance pour toutes les suggestions et perspicacité!
OriginalL'auteur echoesofspring | 2009-04-01
Vous devez vous connecter pour publier un commentaire.
La réponse simple est oui. En ouvrant le document avec votre code vous rendre le document actif, ce qui permet ensuite à proximité de la ligne suivante et essayez de l'activer dans le prochain, et cela échoue, car le document n'est plus ouverte. VBA en général semble travailler de cette façon.
Il est important d'être prudent avec ActiveDocument, parce que c'est pas toujours évident que les actions, dans le code, ou d'ailleurs, va faire un document "active" (je n'ai pas de preuve, mais même une sauvegarde automatique peut le faire). SI il n'y a aucun doute que vous êtes mieux se référant à un document par le biais des Documents de la collection, mais cela peut aussi provoquer des erreurs si le document n'est plus possible d'ouvrir, et vous pourriez avoir à recourir à une itération à travers la collection, pour être sûr que le document est, en fait, ouvert. Je rencontre ce beaucoup avec VBA excel et Word VBA semble fonctionner de manière identique à cet égard.
Aussi, VBA est feuilletée sur la libération des objets de l'application. Si vous ne faites pas attention, vous vous retrouverez avec de multiples WINWORD processus,visible dans le gestionnaire des tâches, indépendamment de savoir si vous Fermez ou de le Quitter dans votre code. Le code que j'ai trouvé pour contourner ce qui revient à simuler le processus de sélection en FIN de PROCESSUS dans le gestionnaire des tâches. Il fonctionne, mais il devrait y avoir une meilleure solution.
OriginalL'auteur akw
Vous avez une erreur ici:
Devrait être le Documents.
Oui, vous pouvez activer le document actif. Rien ne se passe ensuite.
Oui, document ouvert devient actif.
Si vous n'êtes pas sûr, utilisez
Documents.Open(origDoc).Activate
.Qu'est-ce exactement ne origDoc contenir?
OriginalL'auteur GSerg
Vous ne devriez pas être à l'aide de la
ActiveDocument
objet, en premier lieu, sauf si c'est absolument nécessaire car il est très peu fiable. L'approche privilégiée est celle-ci:ActiveDocument
, mais vous allez de l'avant et à utiliser dans votre exemple de code?OriginalL'auteur guillermooo
Méfiez-vous qu'il existe une variété de problèmes qui peuvent être rencontrés:
si vous voulez ré-ouvrir le document après la fermeture
une fois....Word/Windows NE prend PAS en
"libération" le nom du fichier et vous obtenez un "fichier occupé message ou message sur " création d'
une copie temporaire'.
pour faire face à ce problème, j'ai eu à développer un système élaboré de créer/sauvegarder et
la remise en place de plusieurs versions de tous autres documents, j'ai ouvert/manipuler dans ma Parole applications
en raison de ce défaut de conception dans le Bureau
Open
/Close
/Save
méthodes.Utiliser le
ReadOnlyRecommended
propriété définie àFalse
avec l'.Open
méthodese référant à l'objet de document (nommé doc ci-dessus) peuvent causer des
de graves erreurs si vous n'assurent pas
que le
doc
objet existe toujours avant d'essayer de le manipuler. Rappelez-vous toujours, queWord est un "ouvert" plate-forme d'application....et l'utilisateur peut faire des choses que vous ne comptez pas
...dans la dernière milliseconde. Ce conseil vaut pour n'importe quel autre objet ou une propriété que vous pouvez
souhaitez manipuler dans Word.
si vous manipulez la collection de Documents (ou autre) sans
en s'assurant que le document ou autre objet est toujours là, et
valide avant de le supprimer ou de le déplacer à l'intérieur de la collection, vous pouvez
get 'débordement de pile' erreurs. En particulier si vous essayez et
fermer/supprimer des objets dans une collection de commencer à
.item(1)
. Vousdoit supprimer des éléments dans une collection de la dernière, et n'oubliez pas
que la collecte idicies et les pointeurs de changer à chaque fois que vous
.ajouter/.supprimer/.près des éléments.
OriginalL'auteur user2649016