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

Macros et VBA Excel Discussion :

aide pour ouvrir une page word [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Points : 16
    Points
    16
    Par défaut aide pour ouvrir une page word
    bonjour

    en cherchant sur le web anglosaxon, j'ai trouvé un petit code fort sympa.
    il necessite par contre de mettre "microsoft word" dans nos préférence sur excel pour fonctionner.

    toutefois, la, je ne le comprend pas trop, et le peu que je veu adapter me laisse perplexe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim wrdApp As Word.Application
    Dim wrdDoc As Word.Document
     
                Set wrdApp = CreateObject("Word.Application")
                wrdApp.Visible = True
                Set wrdDoc = wrdApp.Documents.Open(path)
    ensuite, on nous demande de mettre dans la fonction "document_open()" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selection.GoTo what:=wdGoToPage, Which:=wdGoToNext, Name:=page
    j'ai changé le B-A-BA sur ce code. open(path) pour MON fichier, et Name:=page au lieu de Name:="5" dans l'exemple

    le but de ce petit bout de code est visiblement d'ouvrir un document word a une page determiné. c'est exactement ce que je cherche, avec deux variables seulement (path et page)

    mon soucis (très bete, certe) est le suivant :

    j'ai une seule fonction (open_file(path, page)) dans laquelle je dois tout mettre

    j'ai donc mis ma déclaration de variable et l'instruction "open(path)" dans cette fonction.

    mais que faire du code de document_open ? j'aimerais ne pas le mettre dans cette fonction (document_open) mais bien dans la mienne (open_file())
    cependant, dans l'etat, ca ne fonctionne pas.

    comment retoucher l'instruction selection.goto what:= (...) pour l'adapter a ce cas d'emploi ?


    cordialement.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 200
    Points : 14 346
    Points
    14 346
    Par défaut
    Bonsoir,

    Je ne vois pas ce qui te gêne. "Documents.Open" ouvre le document Word. Ta fonction sera donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function open_file(path, page)
        Dim wrdApp As Word.Application
        Dim wrdDoc As Word.Document
     
        Set wrdApp = CreateObject("Word.Application")
        wrdApp.Visible = True
        Set wrdDoc = wrdApp.Documents.Open(path)
    End Function
    Note que tu vas ouvrir une instance de Word à chaque fois que tu vas appeler ta fonction.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    le soucis n'est pas dans cette structure.
    j'ai effectivement tout collé dans la fonction comme tu le suggere, et ca marche

    ce qui m'interresse, c'est la parti qui force l'ouverture a une page donnée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function document_open()
        Selection.GoTo what:=wdGoToPage, Which:=wdGoToNext, Name:=page
    function
    d'après l'aide que j'ai trouvé, il faut que cette instruction se trouve dans la procédure "document_open"; hors, moi, j'aimerais que cette instruction soit elle aussi dans open_file()
    et dans l'etat ... ca ne marche pas.

    il manque quelque chose pour que cette instruction fonctionne, j'imagine. mais quoi ?

    cordialement.

  4. #4
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    À première vue, il s'agit de cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selection.GoTo what:=wdGoToPage, Which:=wdGoToNext, Name:=page
    Quand cette ligne est lancée depuis Word, VBA pour Word connaît les valeurs numériques des deux constantes wdGoToPage et wdGoToNext. Cependant, quand on pilote par automation, c'est préférable d'utiliser les valeurs numériques des constantes, parce que les noms des constantes des programmes pilotés ne sont pas toujours, pour ne pas dire jamais, connus des programmes qui pilotent.

    Ceci dit, je n'ai pas le temps, ni l'envie, d'ouvrir l'aide de VBA-Word pour trouver les valeurs numériques de ces constantes.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    je sais bien que mes soucis viennent de cette ligne. mais c'est elle et elle seule qui m'interresse, justement, pour ouvrir un word a une page définie.

    quand tu parle de vba word, par contre ... j'ai besoin de mettre un macro dans word aussi ?

    pour les constante tout ca ... je fait confiance dans ce que j'ai lu sur le site d'ou je tire cette source.
    j'ai juste changé la variable du n° de la page, c'est tout. tout le reste n'a pas bougé.

    a mon avis, mon soucis vien de "selection." selection de ? c'est ca qu'il faut, je pense, changer par autre chose pour pouvoir peut etre placer cette instruction dans la fonction de mon choix.

    cordialement.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 200
    Points : 14 346
    Points
    14 346
    Par défaut
    Bonjour,

    Ton code devrait être ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Dim wrdApp As Word.Application
        Dim wrdDoc As Word.Document
     
        Set wrdApp = CreateObject("Word.Application")
        wrdApp.Visible = True
        Set wrdDoc = wrdApp.Documents.Open(path)
        Set rg = wrdDoc.GoTo(what:=wdGoToPage, Which:=wdGoToAbsolute, Name:=page)
        rg.Select
    mais si tu n'interromps pas la liaison entre Word et EXcel, tu vas au devant d'ennuis.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    Ton code fonctionne !!! Merci !!!

    Par contre :

    - fermer la liaison ? Pourquoi ? Et comment ? Quand ?

    Sinon

    PRB 1 : quand je clic plusieurs fois il ouvre le fichier à chaque fois
    Je suis en train de chercher comment détecter si un fichier est ouvert
    Mais quelque chose me dit que ça à voir directement avec ton histoire de liaison

    PRB 2 : word s'affiche en de zoom Max. Le curseur est bien sur la bonne page, donc comment forcer le zoom à 100% ?

    Merci en tout cas déjà !!!

  8. #8
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 200
    Points : 14 346
    Points
    14 346
    Par défaut
    Sors la déclaration de "wrdApp" et mets-la en tête de module :

    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
    Function open_file(path, page)
     
        Dim wrdDoc As Word.Document
        If wrdApp Is Nothing Then
            Set wrdApp = CreateObject("Word.Application")
        Else
            Set wrdApp = GetObject(, "Word.Application")
            wrdApp.ActiveDocument.Close
        End If
        wrdApp.Visible = True
        Set wrdDoc = wrdApp.Documents.Open(path)
        wrdDoc.ActiveWindow.View.Zoom.Percentage = 100
        Set rg = wrdDoc.GoTo(what:=wdGoToPage, Which:=wdGoToAbsolute, Name:=page)
        rg.Select
    End Function
    en ce qui concerne le zoom, je n'ai pas testé; la ligne ne provoque pas d'erreur.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    Je viens de faire ce que tu as dit. Merci

    Concernant le zoom à force de recherche j'ai trouvé une solution simple

    Après le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Set wrdDoc = wrdApp.documents.open(path)
    WrdApp.selection.goto what ...
    J'ai ajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    wrdDoc.activewindow.view.type = wdPrintView
    wrdDoc.activewindow.view.zoom.pagefit = wdPageFitFullPage
    Et ... Ça marche !!!

    Reste donc plus que le problème de l'ouverture de fichier multiple
    C'est plus compliqué que je ne le pensais ...

    j'ai pensé à quelque chose de classique, issue d'une source trouvé sur le web :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function ask_file_open(nom_fichier As String, AppWord As Word.Application) As Boolean
        Dim DocWord As Document
        ask_file_open = False
     
        For i = 1 To AppWord.Documents.Count
            Set DocWord = AppWord.Documents(i)
                                       If DocWord.Name = nom_fichier Then
                                                   ask_file_open = True
                                       End If
            Set DocWord = Nothing
        Next
    End Function
    cette fonction retourne tout simplement "true" si elle trouve le fichier demandé ouvert dans l'instance word ouverte
    et c'est la ou le bas blesse.

    l'objectif etait de tester si le fichier etait ouvert.
    si il ne l'etait pas, on utilisait les fonctions de création de documents
    sinon, on relistait les dit fichier, pour se focaliser sur celui qui nous interresse, et alors envoyer les commandes de page, et de zoom.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                    Set wrdApp = GetObject(, "Word.Application")
                    wrdApp.Visible = True
                       For i = 1 To AppWord.Documents.Count
                           Set wrdDoc = AppWord.Documents(i)
                                If DocWord.Name = nom_fichier Then
                                    wrdApp.Selection.GoTo what:=wdGoToPage, Which:=wdGoToNext, Name:=page
                                    wrdDoc.ActiveWindow.View.Type = wdPrintView
                                    wrdDoc.ActiveWindow.View.Zoom.PageFit = wdPageFitFullPage
                                End If
                            Set DocWord = Nothing
                       Next
    il y a sans doute plus simple. j'imagine que appword.documents doit avoir une procédure pour désigner par son nom la page qui nous interresse. mais je suis au taf, et je n'ai internet que sur mon telephone ... pas toujours simple de trouver des infos
    a defaut de faire dans l'elegance, donc, je me contente parfois de ce qui marche.

    j'appelle la fonction de cette facon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Set AppWord = GetObject(, "Word.Application")
     
    If Not AppWord Is Nothing Then
            word_ouvert = True
    End If
     
        If word_ouvert = True Then
            fichier_ouvert = ask_file_open(path, AppWord)
        End If
    hors, le soucis, donc, c'est comme évoqué ... les instances !
    c'est qu'avec word 2007 (et sans doute supperieur) il n'y a plus de "fenetre midi". une page ouverte = une instance word et une seule.
    donc ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Set AppWord = GetObject(, "Word.Application")
    n'est pas bon

    il ne fait ouvrir qu'une instance (je pense la premiere) de word et aucune autre. il ne liste donc toujours qu'un seul fichier, meme si 18 sont ouvert, et reste desesperement aveugle au reste.

    j'ai donc besoin de remagner mon code "au plus simple" (copier a la main depuis mon smartphone mdr ^^) pour pouvoir scanner toute les instance ouverte, d'une part
    mais aussi pour "pointer" ensuite la bonne instance, si le fichier est ouvert, pour lancer l'ordre de changement de page et de zoom tel qu'evoqué plus haut.


    j'ai trouvé pour le moment qu'une methode, bourrine :
    scanner comme je le fais actuellement. si vide, fermer completement l'instance en court, et relancer le scann, qui se fera donc NECESSAIREMENT sur l'instance suivante, et ainsi de suite
    si il trouve, l'instance suivante sera alors celle qui m'interresse, et je n'ai meme pas a changer mon code pour pointer le fichier
    sinon, il finira par tout avoir fermé, et retournera un AppDoc = nothing. on pourra donc algorithmiquement parlant en déduire qu'il faut ouvrir le fichier, et agir.
    le probleme ? cela sous entend fermer tout les autres fichier ou presque. ou corrolaire, n'avoir qu'un seul document d'ouvert et un seulement pour laisser la macro bosser convenablement.

    pour résumer, je pense bien cerner le soucis, il faut changer le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Set AppWord = GetObject(, "Word.Application")
    par une boucle pour que appword représente tour a tour chacune des instance de word ouverte pour le scann, et enregistrer l'instance (un n° d'index, j'imagine ?) celon la validité d'un test.
    et par l'ouverture d'une instance et une seule ciblé (par l'index ?) pour pointer le fichier et dialoguer avec mon document word deja ouvert.

    tout les autres problèmes évoqué sont réglé.
    je publierais ce soir (ou disons dès qu'une solution me sera proposé) la solution "tout en un" en code final. ca pourra peut etre servir à d'autre à l'avenir.

    cordialement.

  10. #10
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 200
    Points : 14 346
    Points
    14 346
    Par défaut
    Pas le temps de chercher non plus, mais regarde l'aide sur "GetObject", tu dois pouvoir mettre le nom du fichier avant la virgule.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    Effectivement l'aide parle d'un path complet pour la première variable avant la virgule
    J'ai testé ... Que le fichier soit ou non ouvert : err 432, nom fichier introuvable.

    Cordialement

  12. #12
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 200
    Points : 14 346
    Points
    14 346
    Par défaut
    Non, je me suis trompé pour GetObject. Ca permet d'ouvrir un document. Je ne comprends par contre pas comment tu fais pour avoir plusieurs instances de Word ouvertes. Même s'il y a plusieurs fenêtres distinctes ouvertes, il ne s'agit que de la même instance de Word. Dans le gestionnaire des tâches, quand tu "tues" un document, tous les autres se ferment.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    si ce n'est pas du multi instance, qu'est ce ?

    le fait, en pratique, est que si je debugg ligne a ligne mon programme, il ne trouve toujours que 1 seul document dans mon instance word, et toujours le premier que j'ai ouvert (ou disons le plus ancien de ceux que j'ai ouvert)
    ce qui correspond à la réalité physique que je constate : plusieurs pages word ouverte.

    test, ouvre plusieurs word différent, puis fait une boucle pour trouver tout les documents, applique la ligne par ligne, tu verra qu'il n'en liste qu'un seul par document, et que le plus ancien

    ma technique bourrine (fermer les Appwrd au fure et a mesure) fonctionne d'ailleur très bien.


    je suis toujours à la recherche d'une solution concernant mon problème.

    cordialement.

  14. #14
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 200
    Points : 14 346
    Points
    14 346
    Par défaut
    Regarde la macro ci-dessous et remplace les deux documents. "WrdApp" est le nom de l'instance. Les msgboxes affichent les titres des deux fenêtres de l'instance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Demo()
    Set wrdApp = CreateObject("Word.Application")
    Set wrdDoc1 = wrdApp.Documents.Open("C:\Users\Daniel\Documents\Donnees\Daniel\mpfe\test1.docx")
    Set wrdDoc2 = wrdApp.Documents.Open("C:\Users\Daniel\Documents\Donnees\Daniel\mpfe\test2.docx")
    MsgBox wrdApp.Windows(1).Caption
    MsgBox wrdApp.Windows(2).Caption
    wrdApp.Quit
    Set wrdApp = Nothing
    End Sub
    "wrdApp.Quit" ferme l'instance et les deux documents.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    oui, j'ai constaté aussi cette histoire de mono instance, et compris pourquoi j'en avais plusieurs. regarde ce qui suit :

    voici un code qui fonctionne.
    en commentaire, une zone qui permet éventuellement de "stopper" la boucle sur le fichier souhaité

    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
            Dim objWordDocument As Word.Document
            Dim objWordApplication As Word.Application
     
            Set objWordApplication = GetObject(, "Word.Application")
     
               Do While Not objWordApplication Is Nothing
                            For i = 1 To objWordApplication.Documents.Count
                               Set objWordDocument = objWordApplication.Documents(i)
     
                               ' Recherche du fichier
                               'If docword.Name = tabl(UBound(tabl)) Then
                               '    TEST_FICHIER_WORD_OUVERT = True
                               'End If
                                liste_doc_ouvert = objWordDocument.Name & ";" & liste_doc_ouvert
                               Set objWordDocument = Nothing
                           Next
                    objWordApplication.Quit False
                    Set objWordApplication = Nothing
                    Set objWordApplication = GetObject(, "Word.Application")
     
               Loop
    je l'evoquais plus haut.
    celui ci FONCTIONNE, mais a le désavantage de quitter toute les fenetre word ancienne.
    concernant le multi instance, j'ai fait quelque test : ce qui a été dit (une seule instance) est vraie en ouvrant les fichier depuis l'instance en court.
    mais si on ouvre (comme moi) tout ses fichier depuis l'exterieur (l'explorateur windows, par exemple), une nouvelle instance est généré

    à noter que visuellement, rien ne différencie x fichiers ouvert dans une mono instance des y fichiers indépendant.
    toutefois, en executant mon code séparément, on voit très bien les fichiers unique qui ont été ouvert séparément, avec "objWordApplication.Documents.Count" figé à 1, des fichiers mono instancié dont la valeur objWordApplication.Documents.Count est alors plus importante (que 1)

    à noter que ce petit algo, arrivé à la fin, génère forcément une erreure dans l'etat. un "on error resume next" marchera très bien



    donc, quelqu'un a-t-il une structure équivalente a celle ci MAIS QUI NE FERME PAS LES FICHIERS ?
    ou au lieu de tout lister, qui permet de prendre le focus sur un document en particulier, en faisant fi des instance / process éventuels, ou de retourner un "false" ou autre si il n'existe pas

    je desespère vraiment. j'ai beau chercher, tout le monde en parle, personne ne propose un bout de code ...
    je ne sais plus quoi faire, et cela fait des heures que je suis bloqué la dessus.
    je ne peu pas vraiment me permettre d'autoriser ma macro a fermer tout à la barbare, surtout qu'il ferme sans meme demander l'accord ou forcer l'enregistrement.

    heeeeeelp meeeeee

  16. #16
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    quand tu parle de vba word, par contre ... j'ai besoin de mettre un macro dans word aussi ?
    Justement non. Ce que je dis c'est que cette ligne vient de la procédure Document_Open, donc d'un document Word, traité avec VBA-Word pour cette ligne-là. Mais en transférant cette ligne dans Excel, c'est VBA pour Excel qui prend les commandes de VBA pour Word, d'une manière transparente, ou presque.

    pour les constante tout ca ... je fait confiance dans ce que j'ai lu sur le site d'ou je tire cette source.
    j'ai juste changé la variable du n° de la page, c'est tout. tout le reste n'a pas bougé.
    Tant que ta ligne reste dans un document Word, cela peut fonctionner. Mais, si cette ligne a été "déménagée" de Word vers Excel, tu dois utiliser les valeurs numériques.

    J'avoue que je n'ai pas tout lu, mais, je pense que tu devrais préciser, où se trouve cette ligne actuellement; dans le document Word que tu veux ouvrir, ou dans ta macro dans Excel. Parce que, à mon humble avis, l'emplacement de cette ligne change toute la donne.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    merci pour tes précision clementmarcotte

    toutefois, pas de chance pour toi, cette partie de mon problème a été réglé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                      Set wrdApp = GetObject(, "Word.Application")
                        wrdApp.Visible = True
                        For i = 1 To AppWord.Documents.Count
                            Set wrdDoc = AppWord.Documents(i)
                                 If DocWord.Name = nom_fichier Then
                                     wrdApp.Selection.GoTo what:=wdGoToPage, Which:=wdGoToNext, Name:=page
                                     wrdDoc.ActiveWindow.View.Type = wdPrintView
                                     wrdDoc.ActiveWindow.View.Zoom.PageFit = wdPageFitFullPage
                                 End If
                             Set DocWord = Nothing
                        Next
    donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     wrdApp.Selection.GoTo what:=wdGoToPage, Which:=wdGoToNext, Name:=page
    semble parfaitement fonctionner.

    le but etait de le lancer depuis excel.

    en fait, ce qui me manquait, c'est la partie avant selection
    mes essais (au pif) se concentraient non sur l'amon de "selection" mais son remplacement
    car la strucutre de base etant dans "document_open()", le terme "selection" m'avait prete a confusion : j'etais sure qu'il désignait le document lui meme. j'ai donc cherché a le remplacer par tout les moyens avant de comprendre que selection n'avait rien a voir avec l'objet selectionné ...

    mon problème est tout autre, bien que lié.
    le but de mon post etait de debugger une structure "tout en un" qui ouvre un word a une page donnée.
    hors, pour le moment, je ne parviens tout simplement pas à conserver le "focus" sur la page ouverte. chaque ouverture de fichier génère une nouvelle instance au lieu de changer la page de celle ouverte.

    voila le problème insoluble auquel je suis confronté (lire uniquement les derniers post)

    toutefois, tu souleve la sans le vouloir un point interressant : peut etre est il temps de clore mon topic et d'en ouvrir un autre concernant ce seul point (scann de plusieurs instance de word)

    cordialement.

  18. #18
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    je desespère vraiment. j'ai beau chercher, tout le monde en parle, personne ne propose un bout de code ...
    J'ai lu un peu plus qu'avant et je me sens perdu. Si je me trompe, veux tu corriger svp. Ce que tu me sembles vouloir, c'est d'utiliser une macro Excel pour ouvrir un document Word et atteindre une page précise de ce document-là. Il me semble que tant que ton problème ne sera pas très précis, et réduit à sa plus simple expression, peu importe qui te répondra, pas de solution tu auras. Parce que, la gestion des instances de Word est un problème accessoire qui ne peut être traité convenablement que si le problème fondamental n'est pas traité convenablement

    je ne sais plus quoi faire, et cela fait des heures que je suis bloqué la dessus.
    je ne peu pas vraiment me permettre d'autoriser ma macro a fermer tout à la barbare, surtout qu'il ferme sans meme demander l'accord ou forcer l'enregistrement.
    C'est évident que si tu prends la commande d'une instance Word existante et que tu termines avec Application.quit ou application.close cela va fermer Word. Cette instruction est là pour cela.

    Pour détruire ton objet Word sans le fermer, tu a besoin, je pense, de quelque chose similaire à cela. J'y vais à l'œil, parce que je n'ai pas tes noms d'objets en tête:

    set objetWord = nothing

    Là, tu ne fais que rompre le lien entre Word et Excel.

    Bonjour,

    Cette réponse est arrivée pendant que j'écrivais ma seconde réponse.

    Citation Envoyé par insosama Voir le message
    merci pour tes précision clementmarcotte
    donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     wrdApp.Selection.GoTo what:=wdGoToPage, Which:=wdGoToNext, Name:=page
    semble parfaitement fonctionner.

    le but etait de le lancer depuis excel.

    en fait, ce qui me manquait, c'est la partie avant selection
    mes essais (au pif) se concentraient non sur l'amon de "selection" mais son remplacement
    car la strucutre de base etant dans "document_open()", le terme "selection" m'avait prete a confusion : j'etais sure qu'il désignait le document lui meme. j'ai donc cherché a le remplacer par tout les moyens avant de comprendre que selection n'avait rien a voir avec l'objet selectionné ...
    En fait, dans ce contexte-là selection est un objet de VBA pour Word. Il représente le texte sélectionné. S'il n'y a pas de texte sélectionné, ne serait-ce qu'un caractère ou une marque de paragraphe, la selection est le point d'insertion (curseur)

    mon problème est tout autre, bien que lié.
    le but de mon post etait de debugger une structure "tout en un" qui ouvre un word a une page donnée.
    hors, pour le moment, je ne parviens tout simplement pas à conserver le "focus" sur la page ouverte. chaque ouverture de fichier génère une nouvelle instance au lieu de changer la page de celle ouverte.
    Si tu as plusieurs fichiers d'ouverts, il y a une instruction quelque part dans VBA Word qui permet de sélectionner un document Word par son nom. Sauf horreur de ma part, parce que cela bien longtemps que je n'ai pas fait de programmation sérieuse avec Word, cela te prendrait une ligne de ce genre-là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    appword.windows("Arthur").select
    ta ligne pour atteindre ta page ici
    toutefois, tu souleve la sans le vouloir un point interressant : peut etre est il temps de clore mon topic et d'en ouvrir un autre concernant ce seul point (scann de plusieurs instance de word)
    Attends un peu. Je vais faire une copie de cette discussion et je vais voir ce soir, cette nuit en France, s'il n'y aurait pas quelque chose de simple à patenter. Personnellement, je pense que tu devrais créer une instance de Word, juste pour traiter ce problème et la détruire à la fin, plutôt que de squatter une instance Word existante.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Points : 16
    Points
    16
    Par défaut
    [edit : erf, tu as répondu entre temps mdr ! je laisse quand meme ...
    j'ai par contre du mal a saisir "ou" tu utiliserais les quelques codes proposé ... et quand a "killer" l'instance que j'ouvre moi meme, il faut que j'evite a tout prix :
    1) le document de travail que je pointe en pratique est un document qui bouge tout le temps, et donc qui est souvent DEJA ouvert quand l'appli fonctionnera. et il faudra que l'appli fonctionne sur la derniere version a jour du fichier, non sur une save chargé pour l'occasion, lue, puis refermé.
    2) le fichier fait 180 Mo. inutile de dire qu'il faut éviter de s'amuser a le charger / décharger constament. rien que le mappage de la "page" par ma macro met près de 10 secondes à se faire ^^]

    bonjour

    merci pour tes réponses rapide


    je vais reprendre les différents point

    le but est de faire une fonction (tout en un, donc) dans une macro VBA qui ouvre un document word appellé par son adresse complete (path) à une page déterminé.



    pour cela, j'ai plusieurs point à traiter :

    etape 1 : savoir ouvrir un document à une page donnée.
    statut :
    solution :
    path est réduit a nom_fichier : uniquement le nom du fichier extrait de l'adresse complete.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                    Set wrdApp = GetObject(, "Word.Application")
                    wrdApp.Visible = True
                       For i = 1 To AppWord.Documents.Count
                           Set wrdDoc = AppWord.Documents(i)
                                If DocWord.Name = nom_fichier Then
                                    wrdApp.Selection.GoTo what:=wdGoToPage, Which:=wdGoToNext, Name:=page
                                End If
                            Set DocWord = Nothing
                       Next
    étape 2 : afficher le document en pleine page pour plus de lisibilité
    statut :
    solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                                    wrdDoc.ActiveWindow.View.Type = wdPrintView
                                    wrdDoc.ActiveWindow.View.Zoom.PageFit = wdPageFitFullPage
    qui doit s'integrer ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
                    Set wrdApp = GetObject(, "Word.Application")
                    wrdApp.Visible = True
                       For i = 1 To AppWord.Documents.Count
                           Set wrdDoc = AppWord.Documents(i)
                                If DocWord.Name = nom_fichier Then
                                    wrdApp.Selection.GoTo what:=wdGoToPage, Which:=wdGoToNext, Name:=page
                                    wrdDoc.ActiveWindow.View.Type = wdPrintView
                                    wrdDoc.ActiveWindow.View.Zoom.PageFit = wdPageFitFullPage
                                End If
                            Set DocWord = Nothing
                       Next
    etape 3 : s'assurer si le fichier n'est pas deja ouvert
    statut : heeeeeeeeelp


    la gestion des instance n'est donc plus accessoire, puisque c'est la que j'en suis.
    le problème fondamental (l'ouverture d'un document word à une page donnée) est réglé.
    il me semblait que le problème etait correctement exposé, mais je pense que ce petit message ne sera donc pas du luxe pour remettre les choses a plat. ou, comme je le dit, peut etre est il temps d'ouvrir un nouveau topic

    Bon, donc

    PROBLEME A REGLER :

    comme évoqué plus haut, l'objectif à présent est de m'assurer que le fichier n'est pas deja ouvert

    SI OUVERT : se contenter de le cibler, puis forcer l'affichage de la page
    en clair,
    affecter à wrdDoc une instance de word après s'etre assuré que celle ci comporte bien un document "nom fichier"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    wrdDoc.ActiveWindow.View.Type = wdPrintView
    wrdDoc.ActiveWindow.View.Zoom.PageFit = wdPageFitFullPage
    SI FERME : creer le document. c'est la structure présenté à la fin de l'etape 2, ni plus, ni moins.

    c'est la que tout se complique.
    pour rechercher si le fichier est deja ouvert, j'utilise cette fonction (issue du web)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Function ask_file_open(nom_fichier As String, AppWord As Word.Application) As Boolean
        Dim DocWord As Document
        ask_file_open = False
     
        For i = 1 To AppWord.Documents.Count
            Set DocWord = AppWord.Documents(i)
                                       If DocWord.Name = nom_fichier Then
                                                   ask_file_open = True
                                       End If
            Set DocWord = Nothing
        Next
    End Function
    pour appeler cette fonction, j'utilise ce simple code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Set AppWord = GetObject(, "Word.Application")
     
    If Not AppWord Is Nothing Then
            word_ouvert = True
    End If
     
        If word_ouvert = True Then
            fichier_ouvert = ask_file_open(path, AppWord)
        End If
    on test donc ensuite l'etat de "fichier ouvert" (un booleen), et on applique les solution exprimé dans "si ouvert" et "si fermé" expliqué un peu plus tot.


    jusque la ... tout va bien ^^


    si on applique la structure dans l'etat,

    - si il n'y a aucun fichier word ouvert, il ouvre bien le fichier à la bonne page.
    - si le document est deja ouvert autrement que par la macro, il est detecté
    - si il est deja ouvert par la macro précédement ... ca ne marche pas.
    - si il y a d'autres document d'ouvert que celui ci (ou en plus) seuls quelques uns sont detecté.

    après recherche, test, reflexion, sacrifice de poulet ... j'ai compris ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Set AppWord = GetObject(, "Word.Application")
    ouvre la premiere instance (et la premiere seulement, avec un "index" a 1) de word.

    hors, en pratique,
    - si j'ouvre le fichier avec ma macro, il s'ouvre dans une nouvelle instance
    - si on ouvre plusieurs document par le menu "ouvrir" de word, ils s'ouvrent chacun dans la meme instance, sauf si ...
    - si on ouvre un fichier distant sur le réseau, il sera sur une nouvelle instance
    - si on ouvre un fichier depuis l'explorateur windows, il le sera dans une nouvelle instance.

    donc mon getobject est incomplet, et ma fonction pour trouver si le fichier est ouvert ne fonctionne pas.
    elle ne fonctionnerait que dans le cas d'une instance unique (comme excel)

    plusieurs topic parlent de ce problème, suggère les api pour lister les process, sans forcément dire comment ensuite appeller le process en temps qu'objet mappable dans vba, etc ...

    dans mes tribulation metaphysique pour comprendre mon soucis et mieux le cerné, j'ai proposé cette solution qui met bien en valeur le "coeur" de mon soucis, sans le regler :

    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
     
            Dim objWordDocument As Word.Document
            Dim objWordApplication As Word.Application
     
            Set objWordApplication = GetObject(, "Word.Application")
     
               Do While Not objWordApplication Is Nothing
                            For i = 1 To objWordApplication.Documents.Count
                               Set objWordDocument = objWordApplication.Documents(i)
     
                               ' Recherche du fichier
                               If objWordDocument.Name = nom_fichier Then
                                   TEST_FICHIER_WORD_OUVERT = True
                               End If
                                liste_doc_ouvert = objWordDocument.Name & ";" & liste_doc_ouvert
                               Set objWordDocument = Nothing
                           Next
                    objWordApplication.Quit False
                    Set objWordApplication = Nothing
                    Set objWordApplication = GetObject(, "Word.Application")
     
               Loop
    ce code fonctionne. et il a l'avantage de s'appuyer (donc de confirmer) mon constat
    puisque le GetObject ouvre toujours la premiere instance de word, il me suffit une fois que je l'ai scanné et que je me suis rendu compte que ce n'etait pas la bonne, de la fermer.
    la premiere supprimé, la seconde devient la premiere, et la boucle ouvre celle ci, rescann, etc, jusqu'a ce qu'il n'y ai plus d'instance, ou que mon fichier soit trouvé.

    c'est comme si j'etais toujours limité dans une recherche de tableau à la recherche du tableau(1) sans jamais pouvoir mettre 2, 3, ou 100.
    je supprime donc tableau(1) et redimentionne le tableau, en quelque sorte.

    je suis donc OBLIGE de supprimer une a une les instance (et donc fermer à la barbare les fichiers qui y sont lié) pour forcer "GetObject" a finir par mapper la bonne instance, en procédant de la sorte.


    toutefois, je n'ai jamais prétendu que c'etait la solution que j'esperais, sinon j'aurais fermé le topic.
    évidement, je ne veux en aucun cas fermer les applis, et la fonction proposé ne peu marcher sans le faire; il faut donc en proposer une toute nouvelle (et c'est la que je seche)



    pour finir avec exprimé en une phrase le dernier soucis qu'il me reste, et ce, en faisant fi de tout le reste (qui fonctionne !!! inutile de retoucher ^^)

    je veu remplacer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Set AppWord = GetObject(, "Word.Application")
    qui pointe TOUJOURS sur la premiere instance de word...

    - soit sur l'instance X sans avoir à définir X ou se trouve d'ouvert "nom_fichier"
    - soit un algo for i to ... qui soit en mesure de scanner toute les instance en court de word.


    le but etant de trouver (ou non) un document (nom : nom_fichier) word ouvert et ce quelque soit l'instance dans lequel il est.


    cordialement.

  20. #20
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 200
    Points : 14 346
    Points
    14 346
    Par défaut
    Bonjjour,

    Juste mes deux sous :

    Quand tu ouvres les documents à partir de l'explorer, les documents s'ouvrent dans la même instance (il va falloir t'y habituer, avec Office 2013, Excel a le même comportement que Word 2010 ). Ouvre plusieurs documents depuuis l'explorer et exécute la macro suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
    Dim WordApp As Object
    Set WordApp = GetObject(, "Word.Application")
    MsgBox WordApp.Documents.Count
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Genre de popup pour ouvrir une page
    Par Ylias dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/10/2007, 10h19
  2. Réponses: 2
    Dernier message: 28/06/2007, 09h23
  3. Un 3ème bouton pour ouvrir une page
    Par philippef dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 10/11/2006, 16h36
  4. code VB pour ouvrir une page d'un formulaire
    Par marion67 dans le forum Access
    Réponses: 10
    Dernier message: 31/12/2005, 23h11
  5. [Batch] Tit prog pour ouvrir une page internet
    Par toniovitch dans le forum Windows
    Réponses: 1
    Dernier message: 17/09/2005, 17h20

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