Modif VBA pour ne plus avoir Outlook ObjectLibrary
Bonjour à tous,
J'ai bien recherché et aussi trouvé pas mal de réponses à mon problème mais honnêtement je n'arrive pas à l'appliquer sur un code VBA de notre fichier.
Je vous explique :
Nous avons un fichier excel qui nous permet d'envoyer un mail avec une visualisation de celui-ci avant qu'il parte (obligatoire), car nous pouvons être amenés à rajouter des précisions sur le mail.
Tout fonctionnait bien jusqu'au moment où nous avons eu sur quelques micro, le passage d'Office 2010 à 2016.
Résultat : aucun problème pour 2016 et "Erreur compilation" pour Office 2010.
A partir du moment où 2016 ouvre le fichier et il fait référence à la bibliothèque outlook 16.
Par contre 2010, lui, va chercher la bibliothèque outlook 14 mais si le fichier a été utilisé juste avant par 2016, il met dans les Références "MANQUANT : Microsoft Outlook 16.0 Object Library"; il faut le décocher et aller cocher la Library 14.0
C'est la solution, mais pas pratique du fait que le fichier soit partagé et utilisé par une trentaine de personnes différentes.
C'est là, que je vous appelle "à l'aide" pour pouvoir me dire ce que j'aurais à modifier sur le code VBA pour qu'il ne fasse plus appel à la bibliothèque d'Outlook.
Précision : la personne qui avait conçu la macro ne fait plus partie de notre organisation et nous sommes "au pied du mur"... Je ne maitrise pas le VBA, mais j'ai bien cherché avant de faire mon post (je redis que j'ai trouvé ce qu'il faut faire, mais je n'arrive pas à l'adapter c'est tout).
Merci beaucoup.
Voilà le code :
Sub Envoyer_Mail_Outlook()
Dim ObjOutlook As New Outlook.Application
Dim oBjMail
Dim dest As String
Dim a As Long
Dim finlig As Long
Dim grade As String
Dim grade_arr As String
Dim corps As String
Set ObjOutlook = New Outlook.Application
Set oBjMail = ObjOutlook.CreateItem(olMailItem)
finlig = Sheets("tables").Range("D65536").End(xlUp).Row
dest = Sheets("Circuit DEPART").Range("K32").Value
grade_arr = Sheets("Circuit DEPART").Range("B3").Value
For a = 105 To finlig
grade = Sheets("tables").Cells(a, 4).Value
If CStr(grade) = CStr(grade_arr) Then
corps = Sheets("tables").Cells(a, 5).Value
Select Case corps
Case "PO"
dest = dest & Sheets("Circuit DEPART").Range("B59").Value
Case "PSO"
dest = dest & Sheets("Circuit DEPART").Range("B60").Value
Case "PMDR"
dest = dest & Sheets("Circuit DEPART").Range("B61").Value
End Select
Exit For
End If
Next a
With oBjMail
.To = Sheets("Circuit DEPART").Range("K36").Value ' le destinataire
.Subject = Sheets("Circuit DEPART").Range("K8").Value ' l'objet du mail
.Body = Sheets("Circuit DEPART").Range("K9").Value 'le corps du mail ..son contenu
.Display ' Ici on peut supprimer pour l'envoyer sans vérification
End With
'ObjOutlook.Quit
Set oBjMail = Nothing
Set ObjOutlook = Nothing
End Sub- Messages
- 2'417
- Excel
- 2019
- Inscrit
- 13/07/2017
- Emploi
- Formateur, animateur,tech.informatique
Bonjour
quelques fils de discussion à ce sujet:
https://forum.excel-pratique.com/excel/envoyer-un-mail-avec-outlook-sans-object-library-t71481.html
https://forum.excel-pratique.com/excel/manquant-microsoft-outlook-16-0-object-library-t96266-10.html
par Greg.Leo à adapter :
Le code suivant permet d'envoyer des emails avec Outlook sans cocher une référence OBJECT LIBRARY
Sub SendOLMail_LateBound()
Dim oAPP As Object
Dim oItem As Object
' need to declare this constant as it has no meaning without
' the reference set to the Outlook library
Const olMailItem As Long = 0
' instantiate the Application - cannot use New without a reference
' so we must use CreateObject
Set oAPP = CreateObject("Outlook.Application")
' #######################################
' NOTE: THE REST OF THE CODE IS IDENTICAL
' #######################################
' create a new email
Set oItem = oAPP.CreateItem(olMailItem)
' set basic properties and display the email
With oItem
.To = "foo@bar.com"
.Subject = "this is a test"
.Body = "nothing to see here"
.Display
End With
End Subune autre solution d'essayer de voir avec le support Office car des licences sur des news posts
voir aussi Early ou Late Binding
Bonjour Andre13,
Merci tout d'abord de l'aide et de l'attention apportée à mon post.
Effectivement tous ces posts je les ai vus et c'est là "où je marche sur des oeufs", c'est pour modifier le code vba pour devenir comme celui cité. J'ai tenté sans succès, ou sûrement je m'y suis pas trop bien pris peut être.
Je ne veux pas avoir "tout cuit sans chercher".... mais ce que je demande, si je peux me permettre, c'est concrètement que dois-je modifier ou supprimer sur le code créé pour arriver à la solution ; et surtout pour comprendre en même temps.
Merci beaucoup.
- Messages
- 2'417
- Excel
- 2019
- Inscrit
- 13/07/2017
- Emploi
- Formateur, animateur,tech.informatique
Bonjour,
ne t'inquiètes pas je suis novice en la matière, de mon côté j'aurai mis comme ceci, bien entendu il doit y avoir beaucoup plus simple,
une petite idée à sauvegarder auparavant
oulala pas certain de ce code mais à voir
Sub Envoyer_Mail_Outlook()
'Dim ObjOutlook As New Outlook.Application
Dim oBjMail
Dim dest As String
Dim a As Long
Dim finlig As Long
Dim grade As String
Dim grade_arr As String
Dim corps As String
Dim oAPP As Object
Dim oItem As Object
Const olMailItem As Long = 0
Set oAPP = CreateObject("Outlook.Application")
Set oItem = oAPP.CreateItem(olMailItem)
finlig = Sheets("tables").Range("D65536").End(xlUp).Row
dest = Sheets("Circuit DEPART").Range("K32").Value
grade_arr = Sheets("Circuit DEPART").Range("B3").Value
For a = 105 To finlig
grade = Sheets("tables").Cells(a, 4).Value
If CStr(grade) = CStr(grade_arr) Then
corps = Sheets("tables").Cells(a, 5).Value
Select Case corps
Case "PO"
dest = dest & Sheets("Circuit DEPART").Range("B59").Value
Case "PSO"
dest = dest & Sheets("Circuit DEPART").Range("B60").Value
Case "PMDR"
dest = dest & Sheets("Circuit DEPART").Range("B61").Value
End Select
Exit For
End If
Next a
With oBjMail
.To = Sheets("Circuit DEPART").Range("K36").Value ' le destinataire
.Subject = Sheets("Circuit DEPART").Range("K8").Value ' l'objet du mail
.Body = Sheets("Circuit DEPART").Range("K9").Value ' le corps du mail ..son contenu
.Display ' Ici on peut supprimer pour l'envoyer sans vérification
End With
' ObjOutlook.Quit
'Set oBjMail = Nothing
' Set ObjOutlook = Nothing
' Set oApp = Nothing
'Set oItem = Nothing
End SubBonjour,
si je peux me permettre une correction. La correction d'André utilise Oapp et Omail et c'est ObjOutlook et ObjMail qui sont utilisés plus loin.
Sub Envoyer_Mail_Outlook()
Dim ObjOutlook As object
Dim oBjMail
Dim dest As String
Dim a As Long
Dim finlig As Long
Dim grade As String
Dim grade_arr As String
Dim corps As String
Set ObjOutlook = createobject("outlook.application")
Set oBjMail = ObjOutlook.CreateItem(olMailItem) 'olmailItem=0
finlig = Sheets("tables").Range("D65536").End(xlUp).Row
dest = Sheets("Circuit DEPART").Range("K32").Value
grade_arr = Sheets("Circuit DEPART").Range("B3").Value
For a = 105 To finlig
grade = Sheets("tables").Cells(a, 4).Value
If CStr(grade) = CStr(grade_arr) Then
corps = Sheets("tables").Cells(a, 5).Value
Select Case corps
Case "PO"
dest = dest & Sheets("Circuit DEPART").Range("B59").Value
Case "PSO"
dest = dest & Sheets("Circuit DEPART").Range("B60").Value
Case "PMDR"
dest = dest & Sheets("Circuit DEPART").Range("B61").Value
End Select
Exit For
End If
Next a
With oBjMail
.To = Sheets("Circuit DEPART").Range("K36").Value ' le destinataire
.Subject = Sheets("Circuit DEPART").Range("K8").Value ' l'objet du mail
.Body = Sheets("Circuit DEPART").Range("K9").Value 'le corps du mail ..son contenu
.Display ' Ici on peut supprimer pour l'envoyer sans vérification
End With
'ObjOutlook.Quit
Set oBjMail = Nothing
Set ObjOutlook = Nothing
End SubRebonjour Andre13 et bonjour h2so4,
Pour Andre13 ; cela n'a pas fonctionné ; erreur.
Pour h2so4 ; cela fonctionne.
Merci à vous deux pour votre aide précieuse.