XL 2016 VBA - Envoi de mail via Outlook se bloque parfois

Dudu2

XLDnaute Barbatruc
Bonjour,

Question difficile...
Suite à une demande d'un utilisateur du Forum, j'ai fait du code pour un fichier qui fonctionne sans problème SUR 2 POSTES différents en simultané sous Office 365 et OneDrive !!

Cet utilisateur m'a demandé d'ajouter un envoi de mail.
J'avais 2 possibilités pour lesquelles j'ai le code qui va bien:
- Mail CDO
- Mail Outlook

J'ai choisi Outlook et cela marche presque toujours SAUF que parfois le bidule Outlook ne répond plus (sans que je puisse savoir pourquoi) et Excel dit:
1627478566186.png


Ce truc n'arrive pas chez moi sous Office 2016 et je pense que c'est l'artillerie lourde Office 365 + OneDrive qui perd les pédales.

Que puis-je alors faire ?
1 - Tuer Excel
2 - Tuer Outlook
3 - Passer en CDO
4 - Autre ?

Comment savoir ce qui se passe dans Outlook pour que le Send ou le Display place Outlook dans les choux.

En fait je vous demande mais je pense que c'est incontrôlable dans cette architecture et que ça m... par essence !

Merci par avance pour tout conseil.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Bonjour @Dudu2
perso c'est vrai que j'utilise CDO car avec 2007 c’était une catastrophe ce outlook
mais depuis 2013 il est plus stable
mais en effet même avec 2013 j'ai eu quelque fois cette erreur( inexplicable)
j'ai pris parti de mettre outlouk dans un classeur séparé ( j'ai même testé en XLAM)que j'appelle du classeur de travail
et je n'ai plus eu de soucis du moins a ce jour
;)
 

D.D.

XLDnaute Impliqué
Bonjour,

Pour ma part je n'utilise pas CDO mais que Outlook (Office 365).
Ca marche assez bien, je n'ai pas de problème particulier.
A chaque fois qu'il y a eu problème j'ai pu identifier clairement la cause:
• Outlook était "Hors connexion"
• Outlook avait besoin du mot de passe utilisateur
 

Dudu2

XLDnaute Barbatruc
Bonjour @D.D.
Merci pour ton retour d'expérience. Utile de savoir que ça marche quelque part :).

@patricktoulon,
j'ai pris parti de mettre outlouk dans un classeur séparé ( j'ai même testé en XLAM)que j'appelle du classeur de travail
C'est à dire que ton interfaçage du mail Outlook jusqu'au .send se trouve dans un classeur séparé.
Je ne sais pas si mettre des trucs en XLAM sur 365 + OneDrive fonctionnent. A tenter !
 

D.D.

XLDnaute Impliqué
Bonjour @D.D.
Merci pour ton retour d'expérience. Utile de savoir que ça marche quelque part :).
Hello :)

Juste une chose: Tu évoques OneDrive.
Quel rapport ?
pour ma part les fichiers sont soit sur réseau soit en local, mais pas "directement" sur OneDrive (ou SharePoint).

Cependant j'ai eu quelques problèmes de synchro entre OneDrive et le disque local.
J'ai alors du cocher l'option "toujours conserver sur cet appareil" des fichiers en question pour "forcer" la synchro OneDrive et local.
1627561321435.png
 

Dudu2

XLDnaute Barbatruc
@D.D.

L'utilisateur, un commerçant indépendant, n'a pas de réseau local.
Il a 2 PCs au commerce et 1 PC chez lui et tous accèdent au classeur via OneDrive, dont les 2 au commerce simultanément ! Je n'ai pas les détails des "credentials" (MS ? Office 365 ? OneDrive ?) qu'il utilise sur l'un ou l'autre de ces PC.

Lorsque j'ai essayé d'extraire le Path du classeur (en Teamviewer) je me suis retrouvé avec un HTTPS:// etc...
Lorsque j'ai essayé d'utiliser ce path pour faire un ThisWorkbook.SaveCopyAs <Path/<nom de backup> "il" m'a jeté en disant que le fichier n'existait pas (et pour cause c'était intentionnellement un backup avec un nouveau nom). Pour le backup je me suis donc rabattu sur un répertoire local au PC (ce qui plantait aussi dans les conditions où l'Outlook plantait).

Bref, n'ayant pas cet environnement chez moi, je ne sais pas trop à quoi m'en tenir quant aux règles à suivre.
Pour le moment il a réussi (en utilisant le "bon" login me dit-il !) à faire fonctionner le bidule et donc je ne me prend pas trop la tête à creuser puisque ça marche.
 

Dudu2

XLDnaute Barbatruc
Mais c'est sûr que que si j'avais su au départ qu'il utiliserait le classeur en partage, j'aurais fait des classeurs différents selon les fonctions utilisées et placé les données (la "DB") aussi sur un classeur indépendant.
 

et1000lio

XLDnaute Junior
Bonjour à tous
Peut-être en fonction de l'Username pour définir le compte E-mail dans Outlook.
J'utilise OLE pour Outlook 365

Ci-après une partie du code que j'utilise pour des e-mailing en masse.

VB:
Dim App As Outlook.Application
Dim Mail As Outlook.MailItem
Dim A
A = Sheets("OPERATION").Range("COMPTE_MAIL") 'alimenté en fonction de l'username
Set App = New Outlook.Application
Set Mail = App.CreateItem(olMailItem)
Mail.SendUsingAccount = App.Session.Accounts(A)

Une piste peut-être ! Donc si le fichier est ouvert en local cela devrait fonctionner.
Par contre
un fichier qui fonctionne sans problème SUR 2 POSTES différents en simultané sous Office 365 et OneDrive !!
cela m'intéresse par rapport au mode de fonctionnement.
Bonne fin de journée
 

et1000lio

XLDnaute Junior
Bonjour @et1000lio,

Je ne sais pas comment il fait. Il enregistre et exécute ses classeurs sur OneDrive. Le partage fait partie des avantage de cette solution.
Bonjour Dudu2,

Avec office 365 cela fonctionne car tu peux travailler en co-édition avec les fichiers .xlsx, .xlsm.
Les fichiers sur OneDrive sont partagés et en ce qui concerne les fichiers .xlsm on ne peut travailler qu'en mode bureau. Donc je confirme que l'envoi des mails ne peut se faire qu'avec le compte Outlook de l'utilisateur donc du pc.
Ci-joint un lien Collaborer sur des classeurs Excel simultanément avec la co-édition

Pour moi c'est une révolution car depuis très longtemps j'ai cherché cette solution. Par le passé il y avait les serveurs FTP mais une personne pouvait travailler sur le fichier les autres étaient en lecture seul. Par la suite il y a eu les option Cloud avec synchronisation sur les bureaux mais on ne pouvait pas travailler simultanément car cela provoquait des erreurs.
Récemment Microsoft Teams permettait de travailler simultanément mais uniquement en OnLine et avec des fichiers .xlsx. Les fichiers avec la programmation ne fonctionnait pas.

Maintenant avec office 365 tout est possible mais malheureusement tous les interlocuteurs doivent être sous office 365.

Bonne journée
 

clabbehp

XLDnaute Nouveau
Bonjour Dudu2

As tu essayé d’embarquer un client léger de messagerie dans ton code VBA qui te permet d’éviter de passer par Outlook.
J’étais sous O365 et j’envoyais environ 150/200 pdf par jour génères directement en VBA et Outlook plantais souvent sans raison. J’avais adapté un code de Jacques boigontier ou de rondebruin.nl je ne sais plus et ça marchais au top!
 

Dudu2

XLDnaute Barbatruc
Bonjour @clabbehp,
Je pense que tu parles d'envoi de mail en "CDO". Je n'en connais pas d'autre.
C'est une autre option que je n'ai pas utilisée en l'occurrence mais si cela avait continué à planter, j'y serais venu.
Je crois que l'utilisateur est loggé sous OneDrive avec le même compte que celui qui sert à envoyer les mails.
Et depuis ça performe bien sans plantage. Je touche du bois.
 

XloneClick

XLDnaute Nouveau
Bonjour,

Question difficile...
Suite à une demande d'un utilisateur du Forum, j'ai fait du code pour un fichier qui fonctionne sans problème SUR 2 POSTES différents en simultané sous Office 365 et OneDrive !!

Cet utilisateur m'a demandé d'ajouter un envoi de mail.
J'avais 2 possibilités pour lesquelles j'ai le code qui va bien:
- Mail CDO
- Mail Outlook

J'ai choisi Outlook et cela marche presque toujours SAUF que parfois le bidule Outlook ne répond plus (sans que je puisse savoir pourquoi) et Excel dit:
Regarde la pièce jointe 1112084

Ce truc n'arrive pas chez moi sous Office 2016 et je pense que c'est l'artillerie lourde Office 365 + OneDrive qui perd les pédales.

Que puis-je alors faire ?
1 - Tuer Excel
2 - Tuer Outlook
3 - Passer en CDO
4 - Autre ?

Comment savoir ce qui se passe dans Outlook pour que le Send ou le Display place Outlook dans les choux.

En fait je vous demande mais je pense que c'est incontrôlable dans cette architecture et que ça m... par essence !

Merci par avance pour tout conseil.
Bonjour,

Si cela peut aider
Public Adresse As String
Public Attachement As String
Public Objet As String
Public Corps As String

Sub EvoyerUn MailViaOutlook
'Charger les variables Adresse; Chemin complet de l'attachement (Optionel), Objet, Le corps du mail.
'Pour l'envoie Html on remplacera les retours à la ligne vbCrLf par <BR>
Corps = Replace(Corps, vbCrLf, "<BR>")
Corps = Bonjour & "<BR>" & Corps
Sendmail Objet, Adresse, Corps, True, Attachement
End sub

Module paramétré XLOneClick Envoie de mail Messagerie Outlook

Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub Sendmail(ByVal Objet As String, ByVal eMailAddress As String, ByVal Corps As String, Html As Boolean, Optional ByVal Attachement As String, Optional Afficher As Boolean, Optional Sauvegarder As Boolean, Optional Envoyer As Boolean)
If IsMissing(Afficher) = False Then Afficher = True
If IsMissing(Sauvegarder) = False Then Sauvegarder = True
If IsMissing(Envoyer) = False Then Envoyer = True
On Error GoTo EnvoyerEmailErreur
Dim Messagerie As Outlook.Application
Dim e_Mail As Outlook.MailItem
Dim Body As Variant
If Corps = "" Then
MsgBox "Le corps du mail est vide ", vbOKOnly, "Mailing X1c"
Exit Sub
End If
Body = Corps
'préparer Outlook
PreparerOutlook Messagerie
Set e_Mail = Messagerie.CreateItem(0)
'création de l'email
With e_Mail
.To = eMailAddress
.Subject = Objet
If Not Html = True Then
.BodyFormat = olFormatRichText
.Body = Body
Else
.BodyFormat = olFormatHTML
.HTMLBody = "<html><p>" & Body & "</p></html>"
End If
If Attachement <> "" Then .Attachments.Add Attachement
If Afficher = True Then .Display
If Sauvegarder = True Then .Save
If Envoyer = True Then .Send
DoEvents
Sleep 2000
End With
'Liberer la mémoire
If (Not (e_Mail Is Nothing)) Then Set e_Mail = Nothing
If (Not (Messagerie Is Nothing)) Then Set Messagerie = Nothing
Exit Sub
'Balise en cas d'erreur
EnvoyerEmailErreur:
'Liberer la mémoire
If (Not (e_Mail Is Nothing)) Then Set e_Mail = Nothing
If (Not (Messagerie Is Nothing)) Then Set Messagerie = Nothing
MsgBox "Le mail n'a pas pu être envoyé...", vbCritical, "Erreur"
End Sub

Private Sub PreparerOutlook(ByRef Messagerie As Object)
On Error GoTo PreparerOutlookErreur
On Error Resume Next
'vérification si Outlook est ouvert
Set Messagerie = GetObject(, "Outlook.Application")
If Err.Number <> 0 Then 'si Outlook n'est pas ouvert, une instance est ouverte
Err.Clear
Set Messagerie = CreateObject("Outlook.Application")
Else 'si Outlook est ouvert, l'instance existante est utilisée
Set Messagerie = GetObject("Outlook.Application")
Messagerie.Visible = True
End If
Exit Sub
PreparerOutlookErreur:
MsgBox "Une erreur est survenue lors de l'exécution de PreparerOutlook()..."
End Sub
 

Dudu2

XLDnaute Barbatruc

Discussions similaires

Réponses
15
Affichages
3 K

Statistiques des forums

Discussions
314 630
Messages
2 111 369
Membres
111 115
dernier inscrit
mermo