Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[VBA] Ouverture / Fermeture fichier depuis Outlook

5 réponses
Avatar
ThierryP
Bonjour le forum !

Je souhaite, depuis le VBA d'Outlook, inscrire des donn=C3=A9es r=C3=A9cup=
=C3=A9r=C3=A9es dans les sujets de certains messages (merci Denis et Michel=
!!!) dans un fichier Excel.

J'ai pondu ceci qui fonctionne :

Sub Sauvegarde_OC()
'Dim objAtt As Attachment, objAtts As Attachments
'Set objAtts =3D Mail.Attachments
Nom_OC =3D "12345678" 'Trouve_OC(Mail.Subject)
Num_PO =3D "99999" 'Trouve_PO(Mail.Subject)
'For Each objAtt In objAtts
' If InStr(objAtt.filename, "image") <> 0 Then GoTo suite
' objAtt.SaveAsFile Adresse_OC & "OC" & Nom_OC & ".pdf"
'suite:
'Next
'------- Remplissage Fichier Commandes ---
Dim XlApp, XlClasseur
Set XlApp =3D CreateObject("Excel.Application")
If IsFileOpen(Fichier_Commandes) Then
Workbooks(Fichier_Commandes).Close savechanges:=3DTrue '###############=
####
End If
XlApp.Visible =3D True
XlApp.EnableEvents =3D False
Set XlClasseur =3D XlApp.Workbooks.Open(Fichier_Commandes)
XlClasseur.Worksheets("Cdes").Select
XlClasseur.Worksheets("Cdes").Range("S:S").Select
On Error GoTo erreur
XlClasseur.Worksheets("Cdes").Range("S:S").Find(What:=3DNum_PO, LookIn:=3Dx=
lValues, _
LookAt:=3DxlWhole, SearchOrder:=3DxlByRows, SearchDirection:=3DxlNe=
xt, _
MatchCase:=3DFalse, SearchFormat:=3DFalse).Select
XlApp.EnableEvents =3D True
Selection.Offset(0, -3) =3D "OC" & Nom_OC
erreur:
XlClasseur.Close True
XlApp.Quit
Set XlClasseur =3D Nothing
Set XlApp =3D Nothing
'---------------------------------------------
fin:
'Set objAtts =3D Nothing
End Sub

Je coince sur un souci :
- Je teste si le fichier est ouvert et si oui je veux le fermer en le sauve=
gardant (ligne #########), mais j'ai une erreur 9 (l'indice n'appartient pa=
s =C3=A0 la s=C3=A9lection). Je pense que cela vient du fait que si le fich=
ier est ouvert il existe une autre instance d'Excel et donc ma commande ne =
s'ex=C3=A9cute pas au bon endroit.
Comment lui dire de taper dans une autre instance ?

Merci d'avance,

ThierryP

5 réponses

Avatar
MichD
Bonjour,
Voici un exemple d'utilisation de variables désignant l'application Word
dans une procédure d'Excel, n'ayant pas ajouter la référence Word au
projetVBA.
Le principe est le même, peu importe l'application. Le plus simple est
d'utiliser la même instance de l'application pour créer ou ouvrir un
fichier. Sinon, il faut faire appel aux API de Windows et cela complique
singulièrement la tâche.
'-----------------------------------------
Sub test()
Dim doc As Object
Dim App As Object
On Error Resume Next
'Si l'application Word est ouverte, utiliser
'cette instance pour éventuellement ouvrir le fichier
'où en ajouter un nouveau
Set App = GetObject(, "application.word")
'Si l'application n'est pas ouverte, la ligne précédente
'génère une erreur
If Err <> 0 Then
Err = 0
'Dans ce cas, on crée une nouvelle instance de Word
Set App = CreateObject("Word.application")
'Rendre l'application visible
App.Visible = True
End If
'Pour ajouter un nouveau document dans l'instance de Word
Set doc = App.documents.Add
'Et à chaque fois que l'on veut faire référence à ce document
'on utilise la variable "Doc".
'Pour ouvrir un document déjà existant
Set doc = App.documents.Open("e:Adresse courriel.docm")
'Et pour fermer le document que représente la variable Doc
doc.Close True 'or false selon que l'on veut sauvegarder les modifications.
'Si on veut faire enregistrer sous
doc.SaveAs Filename:=chemin & nom, FileFormat:="utilise l'aide en
utilisant F1 sur Saveas"
End Sub
'-----------------------------------------
MichD
Avatar
ThierryP
Bonjour Denis,
Toujours aussi efficace !!!
J'avais fait quelques recherches et je suis tombé sur un fil de 2014 e ntre toi et Isabelle mais ça avait l'air très compliqué (API + récupérer les handles etc....) !!
Je vais tester ta proposition de ce pas !
Merci et bon week-end !
ThierryP
Avatar
MichD
| Workbooks(Fichier_Commandes).Close savechanges:=True
Tu ne peux pas écrire cela dans Outlook parce que tu as omis quelque
chose d'essentiel dans ta ligne de code : "Où est la variable qui fait
référence à l'application Excel.
En supposant que tu as défini une variable pointant sur l'instance déjà
ouverte ou crées : Dim App as Object, voir le message précédent pour le
code, ta ligne de code devrait alors être :
App.workbooks(.....).close... Et ça devrait marcher.
Attention, si tu n'as pas déclaré la référence, il se peut que le code
bloque sur savechanges:=True, tu remplaces l'expression par -1 qui est
la valeur de la constante "True" en VBA.
MichD
Avatar
Michel__D
Bonjour,
Le 18/10/2019 à 16:13, ThierryP a écrit :
Re-bonjour Denis !
Je viens de tester mais cela ne répond pas vraiment à ma problématique :
Je n'ai pas besoin de créer une nouvelle instance d'Excel, mais de fermer un fichier Excel ouvert et la ligne :
Workbooks(Fichier_Commandes).Close savechanges:=True
me renvoie une erreur. Le code est dans Outlook, je pense que le VBA d'Outlook ne sait pas vraiment à quoi ressemble un workbooks !!!

Regarde si ce code correspond à ce que tu veux (à adapter) :
Sub test()
Dim oApp As Object, oWkb As Object, oBj As Object, Fichier_Commandes As String
Fichier_Commandes = "Le nom de ton Fichier Excel ouvert"
Set oApp = GetObject(, "Excel.Application")
If Err <> Then Exit Sub
Set oWkb = Nothing
For Each oBj In oApp.workbooks
If Fichier_Commandes = oBj.Name Then
Set oWkb = oBj
Exit For
End If
Next oBj
If TypeName(oWkb) <> 'Nothing" then
oWkb.Close ' tu mets ce que tu veux faire sur ce Workbook
End If
Set oWkb = Nothing
Set oApp = Nothing
Set oBj = Nothing
End Sub
Avatar
ThierryP
Bonjour Michel,
Une fois adaptée, ta procédure fait le job !!
Merci pour ton aide !
ThierryP
Le vendredi 18 octobre 2019 19:18:45 UTC+2, Michel__D a écrit :
Bonjour,
Le 18/10/2019 à 16:13, ThierryP a écrit :
Re-bonjour Denis !
Je viens de tester mais cela ne répond pas vraiment à ma prob lématique :
Je n'ai pas besoin de créer une nouvelle instance d'Excel, mais de fermer un fichier Excel ouvert et la ligne :
Workbooks(Fichier_Commandes).Close savechanges:=True
me renvoie une erreur. Le code est dans Outlook, je pense que le VBA d' Outlook ne sait pas vraiment à quoi ressemble un workbooks !!!

Regarde si ce code correspond à ce que tu veux (à adapter) :
Sub test()
Dim oApp As Object, oWkb As Object, oBj As Object, Fichier_Commandes As String
Fichier_Commandes = "Le nom de ton Fichier Excel ouvert"
Set oApp = GetObject(, "Excel.Application")
If Err <> Then Exit Sub
Set oWkb = Nothing
For Each oBj In oApp.workbooks
If Fichier_Commandes = oBj.Name Then
Set oWkb = oBj
Exit For
End If
Next oBj
If TypeName(oWkb) <> 'Nothing" then
oWkb.Close ' tu mets ce que tu veux faire sur ce Workbook
End If
Set oWkb = Nothing
Set oApp = Nothing
Set oBj = Nothing
End Sub