J'essaie d'exécuter un sous-programme Excel VBA pour enregistrer un document Word.
Version linguistique: Word / Excel version 16.41
Système d'exploitation: Mac OS Mojave 10.14.6
J'ai essayé: ( https://www.reddit.com/r/vba/comments/ivwxlw/trouble_with_path_when_saving_basic_word_document/ )
Je pars de zéro sur un ordinateur et un système d'exploitation différents. J'utilise maintenant Mac OS Majave 10.14.6 et Word / Excel version 16.41. J'ai pu ouvrir des outils-références-et sélectionner la bibliothèque Word, mais maintenant les références ne sont pas mises en surbrillance et ne peuvent pas être cliquées. (c'était brièvement avant aussi)
Je rencontre:
Erreur d'exécution -2146959355 (80080005) Erreur d'automatisation.
La ligne à déboguer:
Option Explicit Sub CreateBasicWordReportEarlyBinding() Dim wdApp As Word.Application Set wdApp = New Word.Application With wdApp .Visible = True .Activate .Documents.Add With .Selection .ParagraphFormat.Alignment = wdAlignParagraphCenter .BoldRun .Font.Size = 18 .TypeText "Best Movies Ever" .BoldRun .Font.Size = 12 .TypeText vbNewLine .ParagraphFormat.Alignment = wdAlignParagraphLeft .TypeParagraph End With Range("A2", Range("A2").End(xlDown).End(xlToRight)).Copy .Selection.Paste .ActiveDocument.SaveAs2 Environ("UserProfile") & "\Desktop\MovieReport.docx" .ActiveDocument.Close .Quit End With Set wdApp = Nothing End Sub
Set wdApp = New Word.Application
3 Réponses :
Voir le commentaire de freeflow , qui devrait être posté comme réponse. Dans VBE, choisissez Outils> Références> Bibliothèque d'objets Microsoft Word 16.0.
Il existe 2 façons d'automatiser Word à partir d'Excel:
Dans votre cas, j'utiliserais la liaison anticipée pour avoir accès à intellisense. entrez la description de l'image ici
sub test () Dim wordApplication As Word.Application Dim wordDocument As document Set wordApplication = New Word.Application wordApplication .Visible = True Set wordDocument = wordApp.Documents.Add wordDocument.SaveAs Filename: = "C: \ myDocumentTest.docx" end sub
Il y a eu des problèmes lors de l'utilisation de COM Automation (ce que font New Word.Application
", CreateObject
etc.) sur les versions Mac d'Office depuis quelques années maintenant. Vous avez peut-être vu des questions similaires ailleurs.
Le problème est que tout le monde ne semble pas rencontrer ces problèmes, ce qui suggère qu'ils pourraient résulter d'un problème de configuration. Le suspect habituel serait "quelque chose à voir avec Mac OS Sandboxing". Cependant, je n'ai jamais vu de document de support par qui que ce soit, y compris Microsoft, qui vous explique comment résoudre ce problème. J'ai effectué des installations propres d'Office sur des installations propres de Mac OS et rencontré et signalé les problèmes, et c'est à ce moment que je pense que l'auteur du logiciel devrait vraiment enquêter sur le problème et fournir un correctif ou une solution de contournement.
Ici, (même version d'Office, mais Mac OS Catalina 10.15.6) ce que je trouve, c'est que ...
Les problèmes sont un peu différents selon l'application que vous exécutez ou que vous essayez d'automatiser.
Dans Excel, essayer d'utiliser un objet à liaison anticipée de type Word.Application
échoue toujours. Donc vous ne pouvez pas utiliser
Dim theApp As Object Debug.Print AppleScriptTask("myStartWordScript","myStartWord","") 'On Error Goto problem ' you need to set this up Set theApp = GetObject(,"Word.Application") ' just be careful If theApp Is Nothing Then Debug.Print "theApp Is Nothing" Else Debug.Print TypeName(theApp) ' get on with what you need to do End If
ou
on myStartWord(dummy as text) tell application id "com.microsoft.Word" activate end tell return "Word has started" end myStartWord
(Peu importe que vous ayez défini ou non la référence correcte dans VBE Tools-> References. Si vous ne le faites pas, vous verrez quand même une erreur de compilation et VBA n'exécutera pas réellement le code).
Alors tu as besoin
~/Library/Application Scripts/com.microsoft.Excel
et d'utiliser CreateObject (si Word n'est pas déjà en cours d'exécution ou lorsque vous avez besoin d'une nouvelle instance de Word, au moins sous Windows) ou GetObject (lorsque vous souhaitez vous connecter à une / l'instance existante de Word.
Cependant, ici, je trouve que CreateObject ne fonctionne que parfois, et je n'ai pas été en mesure de comprendre pourquoi. Il démarre toujours Word s'il n'a pas démarré, mais parfois il attend le démarrage de Word et renvoie une référence à l'objet Word et parfois non. Les tests ne sont pas complètement concluants, mais il semble en fait que cela fonctionne au maximum "toutes les deux fois que vous l'appelez dans une session Excel", il me semble qu'Excel conserve certaines informations d'état qu'il ne devrait pas et pense qu'il "sait "ce WOrd a commencé alors qu'en fait il ne l'a pas fait.
En revanche, GetObject semble fonctionner correctement. Normalement, il renvoie une erreur si Word n'a pas démarré, mais renvoie une référence à l'objet Word si c'est le cas. Alors j'ai essayé d'utiliser quelque chose comme ça
Dim myApp As Word.Application Set myApp = theApp 'or Set myApp = theApp.Application
Mais alors j'obtiens encore parfois l'erreur 429 Le composant ActiveX ne peut pas créer d'objet dans la ligne GetObject - dans ces cas, il semble que CreateObject n'attend pas le démarrage de Word.
J'ai donc examiné la possibilité de démarrer Word sans utiliser COM. Il existe plusieurs façons d'essayer de le faire sur Mac, mais la plus simple est d'utiliser la fonction MacScript pour exécuter un peu d'AppleScript pour le faire. C'est le plus simple car tout le code peut être dans la sous / fonction VBA - vous n'avez besoin d'aucun fichier externe.
MacScript est en fait obsolète en raison de problèmes de sandboxing sous Mac OS. Vous êtes vraiment censé utiliser AppleScriptTask à la place. Mais MacScript semble actuellement faire le travail, sauf qu'il génère toujours une erreur VBA (ce que l'OMI ne devrait pas), nous devons donc jouer avec le piégeage d'erreur VBA.
Ici, le code suivant fonctionne toujours. Pour l'instant.
Dim theApp As Object On Error Resume Next MacScript "tell application id ""com.microsoft.Word"" to activate" Err.Clear 'On Error Goto problem ' you need to set this up Set theApp = GetObject(,"Word.Application") ' just be careful If theApp Is Nothing Then Debug.Print "theApp Is Nothing" Else Debug.Print TypeName(theApp) ' get on with what you need to do End If
L'autre chose que j'ai essayé de faire était de voir si je pouvais alors profiter de la liaison anticipée (pour Intellisense, etc.) en ajoutant ce code aux points appropriés:
Dim wdApp As Object On Error Resume Next Set wdApp = CreateObject("Word.Application") Err.Clear If wdApp Is Nothing Then Set wdApp = GetObject(,"Word.Application") End If
Mais cela n'a jamais fonctionné. Je semble donc être coincé avec une reliure tardive.
si vous constatez que vous ne pouvez pas utiliser MacScript, vous pouvez utiliser AppleScriptTask. Dans sa forme la plus simple, vous placez un fichier texte appelé myStartWordScript.scpt dans un dossier de la "Bibliothèque" de l'utilisateur, ici
Dim wdApp As Object
J'ai utilisé un script comme celui-ci:
Dim myApp As Word.Document Set myApp = New Word.Document
Ensuite, vous pouvez abandonner certains de ces trucs d'erreur et utiliser le code VBA comme ceci:
Dim wdApp As New Word.Document
Si votre application hôte est Excel, vous devez vous assurer que vous disposez d'une référence à Word pour utiliser des objets Word liés au début. c'est-à-dire Tools.References et assurez-vous que la bibliothèque d'objets Microsoft Word XX.X est cochée. Sinon, utilisez Get / CreateObject.