OVH Cloud OVH Cloud

Ouvrir un fichier .doc

2 réponses
Avatar
Vincent
Bonjour
Je souhaite avec un bouton macro ouvrir un document word, exemple
toto.doc
Merci

2 réponses

Avatar
Philippe.R
Bonjour Vincent,
Ci dessous copie d'une réponse à une question similaire :
"=========================================================================="
De : Michel Rotteleur [MS]
Groupes de discussion : microsoft.public.fr.excel
Envoyé : mercredi 5 février 2003 01:54
Objet : Re: Pilotage word depuis excel


Bonjour Pascal,

Vous posez une question intéressante: comment faire pour qu'une application
(Excel) qui en appelle une autre (Word) de façon asynchrone puisse récupérer
des informations (le nom du fichier créé) de l'application appelée?

Il faut faire un peu de plomberie pour raccorder les tuyaux...

Une technique consiste pour l'application appelante à construire un objet de
rappel (Call Back en anglais) qu'elle passera à l'application appelée.
L'application appelée utilisera cet objet pour envoyer des informations à
l'application appelante.

Il faut donc créer 3 composants:

- un objet de Call Back dans Excel
- un module d'appel dans Excel, qui va invoquer Word et lui passer l'objet
de Call Back,
- une logique de réponse dans Word, pour récupérer l'objet de Call Back et
l'exploiter. Cette logique sera incluse dans un modèle de document (.dot);
ce modèle sera utilisé par Excel pour créer de nouveaux fichiers, ainsi
hériteront-ils de la logique de réponse.

Le passage de l'objet de Call Back se fera au moment de l'appel à Word.
L'envoi de la réponse se fera sur l'événement Document_Close() du document
Word.

Une des difficultés de l'exercice consiste à bien gérer tous les cas de
fermeture possibles:
- fermeture d'Excel avant Word
- fermeture de Word sans avoir sauvegardé le document
etc.

Voici un bout de code pour illustrer la méthode des Call Backs appliquée à
votre cas. Il est simplement donné à titre d'exemple, en particulier tous
les cas d'erreur ne sont pas gérés, et pas nécessairement de la façon qui
convient à votre application. Il a été testé avec Office 10 (XP) version US.


Dans Excel:

- Pour l'objet de Call Back, créer une classe PublicNotCreatable appelée
CallBack, avec le code suivant. La propriété Name permettra à Word de passer
le nom de son fichier, tandis que la propriété EnCours permet de gérer le
cas de figure où l'utilisateur appelle deux fois en même temps Word à partir
d'Excel. Les propriétés sont utilisées plutôt que les champs pour pouvoir
éventuellement ajouter du code lors de la lecture ou de l'affectation des
valeurs.

Option Explicit

Private smNom As String
Private sbEnCours As Boolean

Public Property Let Name(value As String)
smNom = value
End Property

Public Property Get Name() As String
Name = smNom
End Property


Public Property Let EnCours(value As Boolean)
sbEnCours = value
End Property

Public Property Get EnCours() As Boolean
EnCours = sbEnCours
End Property


- Pour le pilotage de Word, ajouter une référence à Word et créer un module
avec le code suivant. Les points d'entrée sont OuvrirNouveauDoc,
OuvrirAncienDoc, et SupprimerLienAncienDoc (pour permettre de changer de
document).

Option Explicit

Private oRappel As CallBack

Private Sub OuvrirWord(NouveauDoc As Boolean)
Dim oWordApp As Word.Application

On Error GoTo GestionnaireErreur

Set oWordApp = GetObject("", "Word.Application")

If NouveauDoc Then ' Nouveau fichier à créer
If Not oRappel Is Nothing Then
If oRappel.EnCours Then
Err.Raise vbObjectError + 1, "modPiloteWord.OuvrirWord", "Un
fichier est déjà en cours d'édition"
End If
End If

oWordApp.Documents.Add Template:="WordPourExcel.dot"
Set oRappel = New CallBack
Else ' ouverture du fichier précédent
If oRappel Is Nothing Then
Err.Raise vbObjectError + 2, "modPiloteWord.OuvrirWord", "Pas de
lien vers le fichier à ouvrir"
End If

If oRappel.Name = "" Then
Err.Raise vbObjectError + 3, "modPiloteWord.OuvrirWord", "Lien
vers le fichier à ouvrir non nommé"
End If

If oRappel.EnCours Then
Err.Raise vbObjectError + 4, "modPiloteWord.OuvrirWord",
"Fichier en cours d'édition"
End If

oWordApp.Documents.Open oRappel.Name
End If

oRappel.EnCours = True
oWordApp.Run "ThisDocument.SetCallBackObject", oRappel
oWordApp.Visible = True

Fin:
Set oWordApp = Nothing
Exit Sub

GestionnaireErreur:
MsgBox "Erreur: " & Err.Number & " - " & Err.Description, vbCritical,
"Erreur lors de la tentative d'ouverture du fichier Word"
GoTo Fin
End Sub


Public Sub OuvrirNouveauDoc()
OuvrirWord True
End Sub

Public Sub OuvrirAncienDoc()
OuvrirWord False
End Sub

Public Sub SupprimerLienAncienDoc()
On Error GoTo GestionnaireErreur

If oRappel.EnCours Then
Err.Raise vbObjectError + 4, "modPiloteWord.OuvrirWord", "Fichier en
cours d'édition"
End If

Set oRappel = Nothing

Fin:
Exit Sub

GestionnaireErreur:
MsgBox "Erreur: " & Err.Number & " - " & Err.Description, vbCritical,
"Erreur lors de la tentative d'ouverture du fichier Word"
GoTo Fin
End Sub

Dans Word:

Ouvrir un fichier vierge et entrer dans l'environnement de développement VBA
(Alt+F11). Dans le module appelé ThisDocument du fichier que vous venez
d'ouvrir, utiliser le code suivant. Noter que le nom et le paramètre de la
méthode SetCallBackObject sont utilisés dans l'instruction "Run" du module
Excel qui pilote Word, ci-dessus, et que les propriétés Name et EnCours de
l'objet de Call Back sont valorisées dans la méthode Document_Close() du
document. C'est le coeur du mécanisme du Call Back.

Option Explicit

Private oCallBack As Object

Public Sub SetCallBackObject(ByVal CallBack As Object)
Set oCallBack = CallBack
End Sub


Private Sub Document_Close()
On Error GoTo GestionErreur

If ActiveDocument.ActiveDocument.Saved Then
oCallBack.Name = ActiveDocument.FullName
End If
oCallBack.EnCours = False

Fin:
Set oCallBack = Nothing
Exit Sub

GestionErreur:
MsgBox "Le nom de ce document n'a pu être transmis à Excel" & vbCrLf &
"Erreur: " & Err.Number & " - " & Err.Description, vbCritical, "Erreur lors
de la fermeture"
GoTo Fin
End Sub

Il faut ensuite enregistrer le document en tant que modèle sous le nom
WordPourExel.dot, c'est le nom qui est utilisé dans la commande
Documents.Add du module Excel qui pilote Word.
Et voila! Un appel à OuvrirNouveauDoc lance Word avec un nouveau document,
une fois le document sauvegardé, les appels successifs à OuvrirAncienDoc
permettent de le réouvrir, et SupprimerLienAncienDoc est à appeler avant de
pouvoir appeler à nouveau OuvrirNouveauDoc.

En espérant que cela vous sera utile,

--
Michel Rotteleur
Consultant Principal

Microsoft France

-------------------

Merci de bien vouloir répondre à ce message dans le newsgroup où il a été
posté. Je le consulte régulièrement.


"P. Wibault" wrote in message
news:077001c2cc2b$ace3b760$
Je n'arrive pas à piloter word depuis excel.
En fait, depuis une boîte user form, j'ai créé un bouton
me permettant d'ouvrir word (page vierge). Je tape mon
texte word, enregistre le doc et quitte word pour revenir
dans excel.
Mais je voudrais que excel me mette en mémoire
automatiquement le chemin du doc afin qu'en cliquant sur
le bouton, il ouvre directement le fichier créé sous word.
Comment faire celà ?
Merci de vote aide
Pascal
"=========================================================================="
--
Amicales Salutations
XL 97 / 2000 / 2002
Préférez suivre facilement sur le forum :
news://msnews.microsoft.com/microsoft.public.fr.excel
(Voulez-vous vous abonner ? -> Oui)

"Vincent" a écrit dans le message de news:

Bonjour
Je souhaite avec un bouton macro ouvrir un document word, exemple
toto.doc
Merci



Avatar
Vincent
Merci Philippe
c'est beaucoup trop balèze pour moi
Je veux juste appeler un document word dont je connais le nom.


"Philippe.R" a écrit dans le message de news:

Bonjour Vincent,
Ci dessous copie d'une réponse à une question similaire :
"=========================================================================="
De : Michel Rotteleur [MS]
Groupes de discussion : microsoft.public.fr.excel
Envoyé : mercredi 5 février 2003 01:54
Objet : Re: Pilotage word depuis excel


Bonjour Pascal,

Vous posez une question intéressante: comment faire pour qu'une
application
(Excel) qui en appelle une autre (Word) de façon asynchrone puisse
récupérer
des informations (le nom du fichier créé) de l'application appelée?

Il faut faire un peu de plomberie pour raccorder les tuyaux...

Une technique consiste pour l'application appelante à construire un objet
de
rappel (Call Back en anglais) qu'elle passera à l'application appelée.
L'application appelée utilisera cet objet pour envoyer des informations à
l'application appelante.

Il faut donc créer 3 composants:

- un objet de Call Back dans Excel
- un module d'appel dans Excel, qui va invoquer Word et lui passer l'objet
de Call Back,
- une logique de réponse dans Word, pour récupérer l'objet de Call Back et
l'exploiter. Cette logique sera incluse dans un modèle de document (.dot);
ce modèle sera utilisé par Excel pour créer de nouveaux fichiers, ainsi
hériteront-ils de la logique de réponse.

Le passage de l'objet de Call Back se fera au moment de l'appel à Word.
L'envoi de la réponse se fera sur l'événement Document_Close() du document
Word.

Une des difficultés de l'exercice consiste à bien gérer tous les cas de
fermeture possibles:
- fermeture d'Excel avant Word
- fermeture de Word sans avoir sauvegardé le document
etc.

Voici un bout de code pour illustrer la méthode des Call Backs appliquée à
votre cas. Il est simplement donné à titre d'exemple, en particulier tous
les cas d'erreur ne sont pas gérés, et pas nécessairement de la façon qui
convient à votre application. Il a été testé avec Office 10 (XP) version
US.


Dans Excel:

- Pour l'objet de Call Back, créer une classe PublicNotCreatable appelée
CallBack, avec le code suivant. La propriété Name permettra à Word de
passer
le nom de son fichier, tandis que la propriété EnCours permet de gérer le
cas de figure où l'utilisateur appelle deux fois en même temps Word à
partir
d'Excel. Les propriétés sont utilisées plutôt que les champs pour pouvoir
éventuellement ajouter du code lors de la lecture ou de l'affectation des
valeurs.

Option Explicit

Private smNom As String
Private sbEnCours As Boolean

Public Property Let Name(value As String)
smNom = value
End Property

Public Property Get Name() As String
Name = smNom
End Property


Public Property Let EnCours(value As Boolean)
sbEnCours = value
End Property

Public Property Get EnCours() As Boolean
EnCours = sbEnCours
End Property


- Pour le pilotage de Word, ajouter une référence à Word et créer un
module
avec le code suivant. Les points d'entrée sont OuvrirNouveauDoc,
OuvrirAncienDoc, et SupprimerLienAncienDoc (pour permettre de changer de
document).

Option Explicit

Private oRappel As CallBack

Private Sub OuvrirWord(NouveauDoc As Boolean)
Dim oWordApp As Word.Application

On Error GoTo GestionnaireErreur

Set oWordApp = GetObject("", "Word.Application")

If NouveauDoc Then ' Nouveau fichier à créer
If Not oRappel Is Nothing Then
If oRappel.EnCours Then
Err.Raise vbObjectError + 1, "modPiloteWord.OuvrirWord",
"Un
fichier est déjà en cours d'édition"
End If
End If

oWordApp.Documents.Add Template:="WordPourExcel.dot"
Set oRappel = New CallBack
Else ' ouverture du fichier précédent
If oRappel Is Nothing Then
Err.Raise vbObjectError + 2, "modPiloteWord.OuvrirWord", "Pas
de
lien vers le fichier à ouvrir"
End If

If oRappel.Name = "" Then
Err.Raise vbObjectError + 3, "modPiloteWord.OuvrirWord", "Lien
vers le fichier à ouvrir non nommé"
End If

If oRappel.EnCours Then
Err.Raise vbObjectError + 4, "modPiloteWord.OuvrirWord",
"Fichier en cours d'édition"
End If

oWordApp.Documents.Open oRappel.Name
End If

oRappel.EnCours = True
oWordApp.Run "ThisDocument.SetCallBackObject", oRappel
oWordApp.Visible = True

Fin:
Set oWordApp = Nothing
Exit Sub

GestionnaireErreur:
MsgBox "Erreur: " & Err.Number & " - " & Err.Description, vbCritical,
"Erreur lors de la tentative d'ouverture du fichier Word"
GoTo Fin
End Sub


Public Sub OuvrirNouveauDoc()
OuvrirWord True
End Sub

Public Sub OuvrirAncienDoc()
OuvrirWord False
End Sub

Public Sub SupprimerLienAncienDoc()
On Error GoTo GestionnaireErreur

If oRappel.EnCours Then
Err.Raise vbObjectError + 4, "modPiloteWord.OuvrirWord", "Fichier
en
cours d'édition"
End If

Set oRappel = Nothing

Fin:
Exit Sub

GestionnaireErreur:
MsgBox "Erreur: " & Err.Number & " - " & Err.Description, vbCritical,
"Erreur lors de la tentative d'ouverture du fichier Word"
GoTo Fin
End Sub

Dans Word:

Ouvrir un fichier vierge et entrer dans l'environnement de développement
VBA
(Alt+F11). Dans le module appelé ThisDocument du fichier que vous venez
d'ouvrir, utiliser le code suivant. Noter que le nom et le paramètre de la
méthode SetCallBackObject sont utilisés dans l'instruction "Run" du module
Excel qui pilote Word, ci-dessus, et que les propriétés Name et EnCours de
l'objet de Call Back sont valorisées dans la méthode Document_Close() du
document. C'est le coeur du mécanisme du Call Back.

Option Explicit

Private oCallBack As Object

Public Sub SetCallBackObject(ByVal CallBack As Object)
Set oCallBack = CallBack
End Sub


Private Sub Document_Close()
On Error GoTo GestionErreur

If ActiveDocument.ActiveDocument.Saved Then
oCallBack.Name = ActiveDocument.FullName
End If
oCallBack.EnCours = False

Fin:
Set oCallBack = Nothing
Exit Sub

GestionErreur:
MsgBox "Le nom de ce document n'a pu être transmis à Excel" & vbCrLf &
"Erreur: " & Err.Number & " - " & Err.Description, vbCritical, "Erreur
lors
de la fermeture"
GoTo Fin
End Sub

Il faut ensuite enregistrer le document en tant que modèle sous le nom
WordPourExel.dot, c'est le nom qui est utilisé dans la commande
Documents.Add du module Excel qui pilote Word.
Et voila! Un appel à OuvrirNouveauDoc lance Word avec un nouveau document,
une fois le document sauvegardé, les appels successifs à OuvrirAncienDoc
permettent de le réouvrir, et SupprimerLienAncienDoc est à appeler avant
de
pouvoir appeler à nouveau OuvrirNouveauDoc.

En espérant que cela vous sera utile,

--
Michel Rotteleur
Consultant Principal

Microsoft France

-------------------

Merci de bien vouloir répondre à ce message dans le newsgroup où il a été
posté. Je le consulte régulièrement.


"P. Wibault" wrote in message
news:077001c2cc2b$ace3b760$
Je n'arrive pas à piloter word depuis excel.
En fait, depuis une boîte user form, j'ai créé un bouton
me permettant d'ouvrir word (page vierge). Je tape mon
texte word, enregistre le doc et quitte word pour revenir
dans excel.
Mais je voudrais que excel me mette en mémoire
automatiquement le chemin du doc afin qu'en cliquant sur
le bouton, il ouvre directement le fichier créé sous word.
Comment faire celà ?
Merci de vote aide
Pascal
"=========================================================================="
--
Amicales Salutations
XL 97 / 2000 / 2002
Préférez suivre facilement sur le forum :
news://msnews.microsoft.com/microsoft.public.fr.excel
(Voulez-vous vous abonner ? -> Oui)

"Vincent" a écrit dans le message de
news:
Bonjour
Je souhaite avec un bouton macro ouvrir un document word, exemple
toto.doc
Merci