IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Word Discussion :

macro word lancée par excel ne répond pas correctement [WD-2003]


Sujet :

VBA Word

  1. #1
    Membre expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 477
    Points : 3 865
    Points
    3 865
    Par défaut macro word lancée par excel ne répond pas correctement
    Bonjour à Tous et Toutes,

    J'ai un problème dans la conception d'une macro vba. J'espère trouver de l'aide auprès de Vous.

    En word, j'ai créé un modèle avec une Sub Autonew (word détecte quels sont les documents word ouverts) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub UserForm_Initialize() 
    Dim agentvérif(20) 
    r = 1 
    For Each adoc In Documents 
    If adoc.Name = "aaaNormal.dot" Then GoTo line963 
    If adoc.Name = "itinera_aaanormal.dot" Then GoTo line963 
    agentvérif(r) = adoc.Name 
    ComboBox1.AddItem agentvérif(r) 
    r = r + 1 
    line963: 
    Next adoc 
    ComboBox1.Value = agentvérif(1) 
    End Sub
    Quand je lance word directement, la macro fonctionne bien .

    Mais quand elle est lancée via excel avec cette macro, word ne me donne aucun résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...… 
    Application.WindowState = xlMinimized 
    Set appwrd = CreateObject("Word.Application") 
    appwrd.Visible = True 
    Set docword = appwrd.documents.Add(template:="i:...\itinera_aaanormal.dot", newtemplate:=False, documenttype:=0) 
    Application.Quit
    Avez-vous une idée de mon plantage?

  2. #2
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    J'ai repris ton code, mis à part le chemin du modèle que je n'ai pas mis.

    Je n'ai pas rencontré de problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub olivier()
    Dim appwrd As Object
    Dim docword As Object
    Application.WindowState = xlMinimized
    Set appwrd = CreateObject("Word.Application")
    appwrd.Visible = True
    Set docword = appwrd.documents.Add
    Application.Quit
     
    End Sub
    Si c'est possible, essaie de ajouter la référence à la bibliothèque Word dans ton projet Excel.

    Tu pourras bénéficier de l'intellisense qui est une aide à la saisie du code.

  3. #3
    Membre expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 477
    Points : 3 865
    Points
    3 865
    Par défaut Voir sujet
    Merci beaucoup pour les infos.

    En fait, comme je le disais, quand les macros sont lancées directement via word, j'ai un résultat différent que si c'est lancé via excel. J'ai joint les deux messages reçus.

    Pourquoi ne veut-il pas? Parce que excel est toujours actif?....
    Fichiers attachés Fichiers attachés

  4. #4
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    J'ai lancé ton code depuis Excel.
    Word s'ouvre correctement.

    Si il y a du code qui s'ouvre derrière, tu ne l'avais pas encore signalé.

    Essaie de fermer Excel plus vite.
    On peut aussi penser à un DoEvent

  5. #5
    Membre expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 477
    Points : 3 865
    Points
    3 865
    Par défaut macro word lancée par excel ne répond pas correctement
    Re-Bonjour,

    Evidemment, je n'ai pas été aussi clair que souhaité. Je vais donc revenir en arrière et essayer de ne rien oublier. Effectivement, une bonne question entraîne une bonne réponse et une question vague ...

    Donc, au début, j'ai ajouté un modèle via "modèles et compléments" et créer un bouton qui permet d'ouvrir une macro Autonew:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub Main()
       altern.Show
    End Sub
    "Altern.Show" permet à l'utilisateur soit de choisir un formulaire type soit d'insérer un texte type dans un document déjà ouvert. Mon problème se situe au niveau de l'insertion texte (attaché).

    Comme je le disais, quand je lance word directement, tout se passe bien avec la macro. Je clique par exemple sur "Mail: coordonnées"; voici la macro. Il supprime altern de l'écran et lance Insert.show (voir par apès)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    Private Sub OptionButton379_Click()
        altern.Hide
        Insert.Show
     
     Set adoc = ActiveDocument
            If adoc.ProtectionType <> wdNoProtection Then Protection = 1
            If adoc.ProtectionType <> wdNoProtection Then
                adoc.Unprotect
        End If
     
        Selection.Find.ClearFormatting
        With Selection.Find
            .Text = "Les conditions d'octroi n'étaient pas remplies parce que"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        Selection.Find.Execute
     
     
        ActiveDocument.MailMerge.OpenDataSource Name:="C:\temp\Lien_Itinera.xls", _
            ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
            AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="", _
            WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False, _
            Format:=wdOpenFormatAuto, Connection:= _
            "Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data Source=C:\temp\Lien_Itinera.xls;Mode=Read;Extended Properties=""HDR=YES;IMEX=1;"";Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database Password="""";Jet OLEDB:Engine Type=35;Jet OLE" _
            , SQLStatement:="SELECT * FROM `wfl$`", SQLStatement1:="", SubType:= _
            wdMergeSubTypeAccess
        Selection.Font.Bold = wdToggle
        Selection.TypeText Text:="Concerne :"
        Selection.TypeParagraph
        Selection.TypeParagraph
        Selection.Font.Bold = wdToggle
        ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField _
            , Text:="""SIGLE_DEST"""
        Selection.TypeText Text:=" "
        ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField _
            , Text:="""NOM_DEST"""
        Selection.TypeText Text:=" "
        ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField _
            , Text:="""PRENOM_DEST"""
        Selection.TypeText Text:="   ---   "
        Selection.Font.Bold = wdToggle
        ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField _
            , Text:="""NUMN"""
        Selection.Font.Bold = wdToggle
        Selection.TypeParagraph
        ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField _
            , Text:="""ADRESSE_DEST"""
        Selection.TypeText Text:=" "
        ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField _
            , Text:="""CBOITE_DEST"""
        Selection.TypeText Text:=" "
        ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField _
            , Text:="""BOITE_DEST"""
        Selection.TypeText Text:=" - "
        ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField _
            , Text:="""CP_DEST"""
        Selection.TypeText Text:=" "
        ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField _
            , Text:="""LOCALITE_DEST"""
        Selection.TypeParagraph
        Selection.TypeParagraph
        Selection.TypeText Text:="Nos références : "
        ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField _
            , Text:="""DOSSIER_NRO"""
        Selection.TypeText Text:="/"
        ActiveDocument.Fields.Add Range:=Selection.Range, Type:=wdFieldMergeField _
            , Text:="""NUMERO_AGT"""
        Selection.TypeParagraph
        Selection.Font.Bold = wdToggle
        Selection.TypeText Text:="Vos références : "
        ActiveDocument.MailMerge.ViewMailMergeFieldCodes = wdToggle
        Selection.TypeParagraph
        Selection.Font.Bold = wdToggle
        Selection.TypeParagraph
     
        Selection.MoveUp Unit:=wdLine, Count:=7, Extend:=wdExtend
        Selection.Fields.Unlink
        Selection.MoveRight Unit:=wdCharacter, Count:=1
     
        Selection.TypeParagraph
     
        If Protection = 1 Then WordBasic.ToolsProtectDocument DocumentPassword:="", NoReset:=1, Type:=2
     
        Documents("Itinera_aaaNormal.dot").Activate
        ActiveDocument.Close False
    End Sub
    Inser.show: elle permet de voir quel document [document word et/ou message sans titre Outlook] est déjà ouvert par l'utilisateur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub UserForm_Initialize() 
    Dim agentvérif(20) 
    r = 1 
    For Each adoc In Documents 
    If adoc.Name = "aaaNormal.dot" Then GoTo line963 
    If adoc.Name = "itinera_aaanormal.dot" Then GoTo line963 
    agentvérif(r) = adoc.Name 
    ComboBox1.AddItem agentvérif(r) 
    r = r + 1 
    line963: 
    Next adoc 
    ComboBox1.Value = agentvérif(1) 
    End Sub
    Un combobox demande à l'utilisateur de choisir le document dans lequel l'insertion doit se faire.

    Mais, mon soucis est toujours que si je lance mon modèle et l'AutoNew via excel, la combobox est vide; comme si word devenait aveugle!

    Et c'est là que je ne sais pas comment procéder.

    Si je ferme excel trop tôt, je n'ai pas eu le temps de lancer ma macro autonew. J'ai aussi essayé de fermer excel et de créer un raccourci clavier pour lancer ma macro autonew mais là aussi word est aveugle.

    Je tourne je tourne et j'espère beaucoup de ce forum...
    Fichiers attachés Fichiers attachés

  6. #6
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    J'ai fait des tests, mais au lieu de mettre AutoNew que je n'aime pas, j'ai utilisé Document_New et Document_Open.

    Le code contenu dans le document est exécuté lors de l'ouverture sans aucun problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Sub ouvertureDocument()
    Dim appwrd As Object
    Dim docword As Object
    Application.WindowState = xlMinimized
     
    Set appwrd = CreateObject("Word.Application")
    appwrd.Visible = True
    Set docword = appwrd.documents.Add(template:="C:\temp\a.docm")
    DoEvents
     
     
    Application.Quit
     
     
     
     
    End Sub
    Avec ou sans le DoEvents, tout fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Document_Open()
    'MsgBox "Ok pour l'ouverture"
    Debug.Print "Ouverture"
     
    End Sub
    Sub document_New()
    'MsgBox "Ok pour la création"
    Debug.Print "Création"
    End Sub

  7. #7
    Membre expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 477
    Points : 3 865
    Points
    3 865
    Par défaut [WD-2003] macro word lancée par excel ne répond pas correctement
    Bon, j'essaie mais c'est pas encore cela.

    J'ai suivi tes conseils en créant une sub "Document_New"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Document_New()
        MsgBox "Ouverture"
        Insert.Show
    End Sub
    Quand je "lance" le document en double-clique, j'ai la MessageBox ("Ouverture") et ensuite, l'insert.show (attaché) dont code suit :

    Code quand on appuye sur OK
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub CommandButton1_Click()
            coucou = ComboBox1.Value
            Unload Insert
            Documents(coucou).Activate
    End Sub
    Code d'initialisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub UserForm_Initialize()
        Dim agentvérif(20)
        r = 1
          For Each adoc In Documents
            agentvérif(r) = adoc.Name
            ComboBox1.AddItem agentvérif(r)
            r = r + 1
        Next adoc
        ComboBox1.Value = agentvérif(1)
    End Sub
    Code fermeture croix
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
        If CloseMode <> 1 Then Cancel = 1
    End Sub
    L'insert.show me montre tous les documents ouverts (document et message sans titre).

    Mais quand je lance via Excel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub ouvertureDocument()
    Dim appwrd As Object
    Dim docword As Object
    Application.WindowState = xlMinimized
     
    Set appwrd = CreateObject("Word.Application")
    appwrd.Visible = True
    Set docword = appwrd.documents.Add(template:="C:\temp\testi.dot")
    DoEvents
     
    Application.Quit
     
    End Sub
    L'insert.show est vide! As-tu le même résultat ou bien suis-je bête ou moi-même aveugle. J'ai du mal... Au secours...

  8. #8
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Salut,

    Il n'est pas vide, il contient le document qui vient d'être créé.
    La raison est simple, tu crées une nouvelle instance de Word et tu affiches les documents qui sont contenus dans cette instance.
    Comme elle est vide, tu n'as rien.

    Ce que tu dois faire, c'est intercepter l'instance de Word qui est ouverte.

    C'est plus facile en déclarant la bibliothèque de Word dans ton projet.


    Outils => Références => Microsoft Office Word X.XX

    Dans ton code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Dim appwrd As Word.Application
    Dim docword As Word.Document
    Application.WindowState = xlMinimized
     
    Set appwrd = Word.Application
    appwrd.Visible = True
    Tu auras l'instance ouverte et les documents qu'elle contient.

  9. #9
    Membre expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 477
    Points : 3 865
    Points
    3 865
    Par défaut Sujet
    C'est génial.

    Merci beaucoup pour l'aide avec cela, ça fonctionne super bien.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Arrêt de la macro lorsque lancée par un raccourcis clavier
    Par Korleone dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/08/2011, 08h33
  2. Macro word paramétrée par excel, erreur
    Par marrek209 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/11/2009, 09h33
  3. Réponses: 9
    Dernier message: 17/01/2008, 16h16
  4. lancer macro word à partir d'excel
    Par tonnick dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/06/2007, 11h29
  5. [VBA] exécuter macro Word à partir d'excel
    Par le_niak dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/05/2007, 09h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo