Comportement GetObject et CreateObject des serveurs Office Automation
Résumé
Cet article décrit les différents comportements qui se produisent lorsque vous utilisez les fonctions GetObject et CreateObject avec différentes versions des applications Microsoft Office.
GetObject et CreateObject sont des fonctions fournies par Microsoft Visual Basic et Microsoft Visual Basic pour Applications (VBA). Toutefois, les informations s’appliquent également à Microsoft Visual C++ si vous traitez les références à GetObject comme des appels à l’API GetActiveObject, et les références à CreateObject en tant qu’appels à l’API CoCreateInstance.
Informations supplémentaires
GetObject
GetObject est utilisé pour attacher un instance en cours d’exécution d’un serveur Automation. Il existe plusieurs façons d’appeler GetObject, mais la syntaxe recommandée pour les applications Microsoft Office est la suivante :
set xlApp = GetObject(, "Excel.Application")
Si un instance de Microsoft Excel est en cours d’exécution lors de l’exécution de ce code, vous avez accès au modèle objet de l’instance en cours d’exécution via la variable xlApp. Si aucune instance n’est en cours d’exécution, vous recevez le message d’erreur d’exécution interceptable suivant :
Run-time error '429':
ActiveX component can't create object
Si plusieurs instances de Microsoft Excel sont en cours d’exécution, GetObject s’attache au instance qui est lancé en premier. Si vous fermez ensuite la première instance, un autre appel à GetObject s’attache à la deuxième instance qui a été lancée, et ainsi de suite.
Vous pouvez joindre à un instance spécifique si vous connaissez le nom d’un document ouvert dans ce instance. Par exemple, si une instance d’Excel s’exécute avec un classeur ouvert nommé Book2, le code suivant s’attache correctement à cette instance même s’il ne s’agit pas du premier instance qui a été lancé :
Set xlApp = GetObject("Book2").Application
CreateObject
CreateObject est utilisé pour démarrer une nouvelle instance d’un serveur Automation. Par exemple :
set xlApp = CreateObject("Excel.Application")
Selon que le serveur est conçu comme SingleUse ou MultiUse, un autre processus serveur peut ou non être lancé. Il peut s’agir d’une distinction importante pour décider si vous devez arrêter de force une instance Automation. Par exemple, avec un serveur Multi-Utilisation, si une instance est déjà en cours d’exécution avant de l’attacher, vous pouvez éviter d’arrêter le serveur par programmation lorsque vous avez terminé de l’automatiser.
Le tableau suivant sert de référence utile lors de l’implémentation d’une solution avec Microsoft Office. Il répertorie les comportements et les attributs des différentes versions et applications de Microsoft Office, par exemple si le serveur est visible par défaut lors du lancement, s’il est SingleUse ou MultiUse, s’il a une propriété UserControl, s’il a une méthode Quit et le nom de classe de sa fenêtre main.
Application(s) | Visible | Instanciation | A UserControl | Has QuitClassName | Nom de la classe |
---|---|---|---|---|---|
Excel 97, 2000, 2002, 2003, 2007 | Non | SingleUse | Oui | Oui | XlMain |
Word 97, 2000, 2002, 2003, 2007 | Non | SingleUse | Oui | Oui | OpusApp |
PowerPoint 97 | Non | Multi-usages | Non | Oui | PP97FrameClass |
PowerPoint 2000 | Non | Multi-usages | Non | Oui | PP9FrameClass |
PowerPoint 2002 | Non | Multi-usages | Non | Oui | PP10FrameClass |
PowerPoint 2003 | Non | Multi-usages | Non | Oui | PP11FrameClass |
PowerPoint 2007 | Non | Multi-usages | Non | Oui | PP12FrameClass |
Access 97 | Oui | SingleUse | Oui | Oui | OMain |
Access 2000, 2002, 2003, 2007 | Non | SingleUse | Oui | Oui | OMain |
Projet 98, 2000 | Non | Multi-usages | Oui | Oui | JWinproj-WhimperMainClass |
Le nom de classe de fenêtre main est utile pour appeler l’API FindWindow lorsque vous souhaitez savoir facilement si une instance est déjà en cours d’exécution. La propriété UserControl est une propriété booléenne qui indique si l’application serveur s’arrête automatiquement lors de la publication de sa dernière référence (définie sur rien). La méthode Quit vous permet de remplacer la propriété UserControl dans les cas où cela est nécessaire (par exemple, lorsqu’un instance ne s’arrête pas après la publication de la dernière référence).
En règle générale, Microsoft vous recommande d’utiliser une nouvelle instance d’une application Office au lieu de l’attacher à un instance que l’utilisateur peut utiliser. Il est préférable de créer un instance à l’aide du ProgID d’application, puis d’ouvrir ou de créer des objets à partir de là. Autres ProgID, tels que Excel.Sheet et Word. Les documents, et ainsi de suite, sont destinés à être utilisés dans OLE (Liaison d’objets et incorporation) et peuvent donner des résultats incohérents lorsqu’ils sont utilisés avec CreateObject. En utilisant application ProgID, vous évitez les problèmes potentiels en démarrant explicitement le serveur pour Automation (et non l’incorporation).
Lorsque vous avez terminé avec le serveur Automation, relâchez toutes vos références à celui-ci et appelez sa méthode Quit (si disponible) afin que le serveur s’arrête comme prévu. Si vous souhaitez configurer un instance via Automation, puis le laisser ouvert à l’utilisateur, vous devez définir la propriété UserControl sur TRUE, puis libérer toutes vos références. Le serveur reste ensuite en cours d’exécution (car la propriété UserControl a la valeur TRUE) et s’arrête de manière appropriée lorsque l’utilisateur ferme l’application (car il n’y a aucune référence en attente).
Note Par Word, la propriété UserControl est en lecture seule. Il ne peut pas être défini sur True ou False. Word reste toujours en cours d’exécution lorsque la dernière référence est publiée.
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour