[VBA] Ouverture / Fermeture fichier depuis Outlook
Le
ThierryP

Bonjour le forum !
Je souhaite, depuis le VBA d'Outlook, inscrire des données récup=
érées 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 = Mail.Attachments
Nom_OC = "12345678" 'Trouve_OC(Mail.Subject)
Num_PO = "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 = CreateObject("Excel.Application")
If IsFileOpen(Fichier_Commandes) Then
Workbooks(Fichier_Commandes).Close savechanges:=True '###############=
####
End If
XlApp.Visible = True
XlApp.EnableEvents = False
Set XlClasseur = 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:=Num_PO, LookIn:=x=
lValues, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNe=
xt, _
MatchCase:=False, SearchFormat:=False).Select
XlApp.EnableEvents = True
Selection.Offset(0, -3) = "OC" & Nom_OC
erreur:
XlClasseur.Close True
XlApp.Quit
Set XlClasseur = Nothing
Set XlApp = Nothing
'
fin:
'Set objAtts = 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 à la sélection). 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écute pas au bon endroit.
Comment lui dire de taper dans une autre instance ?
Merci d'avance,
ThierryP
Je souhaite, depuis le VBA d'Outlook, inscrire des données récup=
érées 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 = Mail.Attachments
Nom_OC = "12345678" 'Trouve_OC(Mail.Subject)
Num_PO = "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 = CreateObject("Excel.Application")
If IsFileOpen(Fichier_Commandes) Then
Workbooks(Fichier_Commandes).Close savechanges:=True '###############=
####
End If
XlApp.Visible = True
XlApp.EnableEvents = False
Set XlClasseur = 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:=Num_PO, LookIn:=x=
lValues, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNe=
xt, _
MatchCase:=False, SearchFormat:=False).Select
XlApp.EnableEvents = True
Selection.Offset(0, -3) = "OC" & Nom_OC
erreur:
XlClasseur.Close True
XlApp.Quit
Set XlClasseur = Nothing
Set XlApp = Nothing
'
fin:
'Set objAtts = 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 à la sélection). 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écute pas au bon endroit.
Comment lui dire de taper dans une autre instance ?
Merci d'avance,
ThierryP
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
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
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
Le 18/10/2019 à 16:13, ThierryP a écrit :
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
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 :