XL 2016 [resolu] CreateObject("Word.Application") et Word.Application

naecofranck

XLDnaute Nouveau
Bonjour,

J'essaie d'appliquer des bouts de code que je peux trouver en ligne, et j'ai souvent un problème de typage.

Par exemple, quand je prend le code de cette page :

Je cite le code :

VB:
' You must pick Microsoft Word Object Library from Tools>References
' in the VB editor to execute Word commands.
Sub ControlWord()
    Dim appWD As Word.Application
    ' Create a new instance of Word and make it visible
    Set appWD = CreateObject("Word.Application.12")
    appWD.Visible = True

    ' Find the last row with data in the spreadsheet
    FinalRow = Range("A9999").End(xlUp).Row
    For i = 1 To FinalRow
        ' Copy the current row
        Worksheets("Sheet1").Rows(i).Copy
        ' Tell Word to create a new document
        appWD.Documents.Add
        ' Tell Word to paste the contents of the clipboard into the new document.
        appWD.Selection.Paste
        ' Save the new document with a sequential file name.
        appWD.ActiveDocument.SaveAs Filename:="File" & i
        ' Close the new Word document.
        appWD.ActiveDocument.Close
    Next i
    ' Close the Word application.
    appWD.Quit
End Sub

Cela me donne l'erreur :
Erreur de compilation : Type défini par l'utilisateur non défini.

Par contre, quelque chose comme :

Code:
Dim objWord As Object
Set objWord = CreateObject("Word.Application")

Fonctionne.
Comment se fait-il que le code fourni sur le site de Microsoft ne fonctionne pas ? Où est l'astuce ?
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Ne mélangez pas des façons de programmer en liaison tardives et en liaisons anticipées au risque de perdre les bénéfices de l'un et de l'autre.
Liaisons anticipées:
— Une référence vers un fichier contenant une bibliothèque décrivant le type d'objet à utiliser doit être cochée dans les références.
— Ne pas utiliser Object mais le nom du type défini, éventuellement précédé du nom de bibliothèque suivi d'un point.
— Un nouvel exemplaire d'un objet de ce type se définit par New suivi du type explicite.
À ces condition la frappe d'une variable de ce type suivi d'un point propose dans une liste toutes les propriété et méthodes de l'objet, et les liaisons vers elles sont résolues au moment de la compilation, laquelle aboutit à du code légèrement plus performant.
Liaisons tardives:
— Pas de référence nécessaire.
— On utilise Object comme type d'objet.
— Un nouvel exemplaire d'un objet de ce type se définit par CreateObject("bibliothèque.classe")
Aucune assistance à la programmation, tout le truc est démerdé exclusivement à l'exécution. Personnellement j'abhorre complètement cela, au point de préférer me réécrire complètement de quoi fabriquer un objet bien connu plutôt qu'une aberration telle qu'un objet JSON par exemple.
 
Dernière édition:

naecofranck

XLDnaute Nouveau
Merci de ta réponse Dranreb,

Hum, je crois comprendre ce que vous m'expliquez, et en tant qu'informaticien, j'approuve vos goûts ^^
Ceci dit, là c'est le code prêt à emporter donné par le site de microsoft, je n'ai rien touché. Et ils semblent bien donc, mélanger les deux versions...

Je suis dans le désarroi, si même la doc officielle ne peut pas être suivie...

Du coup, si je peux me permettre, comment écririez vous le bout de code pour que ça fasse ce qu'annonce le site de microsoft ?
Ils disent :
l’exemple de code suivant crée un nouveau fichier Microsoft Office Word pour chaque ligne de données d’une feuille de calcul.

Cordialement,
Willy
 

naecofranck

XLDnaute Nouveau
En effet, j'ai lu trop vite, et j'ai confondu "Office Object Library" et "Word Object Library".

Ceci dit, ça plante quand même, j'ai maintenant l'erreur "Erreur d'exécution 429, Un composant Active X ne peut pas créer l'objet.".
Mais j'ai une piste :

A priori, on va pas être copain, le VBA et moi... Les erreurs ne sont pas explicite, les comportements non logique (genre objShell.CurrentDirectory qui se ballade parfois, il faut faire "enregistrer sous", sans aller jusque au bout pour qu'ils soit réinitialisé...) Enfin, j'ai pas le choix !

Merci de votre aide.

En tout cas, ce topic peut être considéré comme résolu.
 

Dranreb

XLDnaute Barbatruc
J'ignore ce qu'est objShell.CurrentDirectory, ça me semble étranger à VBA. Lui connait CurDir et il y a ChDrive et ChDir pour les changer, et aussi l'API SetCurrentDirectory, plus indiquée pour des chemins de réseaux. Des méthodes Excel telles que GetOpenFilename peuvent s'appuyer dessus comme dossier ou démarrer la recherche et le changer aussi si l'utilisateur décide d'aller voir ailleurs.
 

Discussions similaires