0
votes

Comment enregistrer un document Word à l'aide d'Excel VBA sur Mac OS?

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/ )

( https://answers.microsoft.com/en-us/msoffice/forum/all/excel-vba-macro-to-save-as-basic-word-document/df78bf58-ec21-4502-abfe-bc3df1fca7ae )

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


1 commentaires

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.


3 Réponses :


0
votes

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.


0 commentaires

0
votes

Il existe 2 façons d'automatiser Word à partir d'Excel:

  1. Early Binding: ajoutez une référence à la bibliothèque d'objets Microsoft Word.
  2. Late Binding: déclarez vos variables comme des objets.

Dans votre cas, j'utiliserais la liaison anticipée pour avoir accès à intellisense. entrez la description de l'image ici


1 commentaires

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



0
votes

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


0 commentaires