PB de reference manquante macro envoi de mail

CYNO68

XLDnaute Junior
Bonjour

j'ai fais une macro pour envoyer un rapport par mail
cette macro est utilisée par 12 personnes
certains ont office 2013 et d'autres 2016
j'ai office 2016, lorsque j'enregistre ou modifie un des 12 fichier (que je dois mettre a jour tous les 15 jours) ceux qui ont la version 2013 ont une référence manquante (microsoft OUTLOOK 16.0 object library)
la solution est que chaque utilisateur en 2013 décoche cela et coche la refrence microsoft OUTLOOK 15.0 Object library mais c'est contraignant et ils ne sont pas tous des pros de VBA
j'aimerai créer une macro qui me permette de le faire automatiquement à l'ouverture du fichier
pouvez vous m 'aider ?
merci
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Normalement l'instruction pour cocher une référence c'est :
ThisWorkbook.VBProject.References.AddFromFile CheminNomDLL
avec CheminNomDLL une expression String valant le chemin d'accès tel qu'il est indiqué en dessous quand on sélectionne une ligne dans les références disponibles.
Pour décocher une référence c'est :
ThisWorkbook.VBProject.References.Remove ThisWorkbook.VBProject.References(Index)
avec Index: le nom de projet de la bibliothèque.
Mais je ne sais pas s'il va tellement aimer modifier les références du projet contenant ce code en cours d'exécution… Normalement ça se fait depuis un autre projet VBA.
 
Dernière édition:

CYNO68

XLDnaute Junior
Bonjour
merci de votre réponse
j'ai les grandes lignes mais j'ai du mal à écrire un code qui tiens la route et vous m'avez l'air de bien connaitre le sujet :)
en clair voici ce que je veux faire
1 - placer la macro a l'ouverture du classeur (pas de macro parallèle avant ni pendant l’exécution)
2-décocher la réference manquante "MANQUANT : Microsoft Outlook 16.0 Object Library"
3- cocher la référence "Microsoft Outlook 15.0 Object Library"
4- revenir a l 'onglet de démarrage de mon rapport

Auriez vous un petit bout de code ?
merci
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Je n'ai pas cette référence sur mon ordi. Alors je ne pourrai pas tester. Donc je préfère que vous le fassiez vous même.
Informations supplémentaires:
Il y a la référence Microsoft Visual Basic for Application Extensibility 5.3 qui peut faciliter l'écriture et la recherche de la solution car elle définit les types des propriétés des objets de VBProject, notamment Reference. Son nom de projet de bibliothèque est VBIDE
Ça permet de voir qu'une Reference possède une propriété IsBroken, et je sais que ça correspond à son état MANQUANT.
Je donne ce code prenant à titre d'exemple cette référence elle même comme sujet, puisque je n'ai pas Outlook et ne connais donc ni son nom de bibliothèque ni son FullPath
VB:
Option Explicit

Private Sub Workbook_Open()
Dim Refs As VBIDE.References, R As VBIDE.Reference
Set Refs = ThisWorkbook.VBProject.References
Set R = Refs("VBIDE")
If R.IsBroken Then
   Refs.Remove R
   Refs.AddFromFile "C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"
   End If
End Sub
Il va vous falloir faire un peu de recherche. Parce que forcément si R.IsBroken c'est précisément parce que le FullPath à préciser au Refs.AddFromFile n'est pas le même sur différents ordinateurs…
 
Dernière édition:

CYNO68

XLDnaute Junior
Bonjour

j'ai tester le code que vous m'avez fourni en activant la référence visual basic que vous m'avez indiqué
pas de BEUG mais rien ne change
je vous ai mis les capture ecran des 2 références en question
capture = ref manquante
capture 1 = ref que je souhaite cocher ensuite
voici le code que j'ai testé

Private Sub Workbook_Open()

Dim Refs As VBIDE.References, R As VBIDE.Reference
Set Refs = ThisWorkbook.VBProject.References
Set R = Refs("VBIDE")
If R.IsBroken Then
Refs.Remove R
Refs.AddFromFile "C:\Program Files\Microsoft Office\Office15\MSOUTL.OLB"
End If
End Sub
 

Pièces jointes

  • Capture.PNG
    Capture.PNG
    27.9 KB · Affichages: 112
  • Capture2.PNG
    Capture2.PNG
    29.6 KB · Affichages: 92

Dranreb

XLDnaute Barbatruc
Mais il faut pas prendre "VBIDE" dans la suite du code, bien sûr, mais votre nom de bibliothèque à vous, c'est peut être "Outlook", mais je n'en sais rien, allez voir dans l'explorateur d'objet les noms de bibliothèques en ligne dans un projet ou elle est cochée et non MANQUANT. Profitez en pour noter quelque part R.FullPath, parce que ce sera celui à spécifier quand elle reviendra d'un autre ordi où celui ci aura été MANQUANT et où cette même procédure l'aura remplacé par le sien.
 

CYNO68

XLDnaute Junior
ok, j'ai un niveau bien inférieur à vous en VBA, désolé si mes questions sont un peux lourdes :)

pour etre sur, le R.FullPath c'est le chemin "C:\Program Files\Microsoft Office\Office15\MSOUTL.OLB" ?
et je remplace "VBIDE" par "MSOUTL.OLB" ou "MSOUTL" ?
 

Dranreb

XLDnaute Barbatruc
Essayez voir cette procédure :
VB:
Option Explicit

Private Sub Workbook_Open()
Dim Refs As VBIDE.References, R As VBIDE.Reference, TChem(), N As Long, Ns As Long
On Error Resume Next
TChem = [TFPOL]
If Err Then ReDim TChem(1 To 2)
On Error GoTo 0
Set Refs = ThisWorkbook.VBProject.References
Set R = Refs("Outlook") ' Sous toutes réserves
If R.IsBroken Then
   Refs.Remove R
   For N = 1 To UBound(TChem)
      If VarType(TChem(N)) = vbString Then
         If Dir(TChem(N)) <> "" Then
            Refs.AddFromFile TChem(N)
            Exit Sub
            End If: End If: Next N
   MsgBox "Impossible de corriger automatiquement la référence à Outlook." _
      & vbLf & "Veuillez la corriger manuellement", vbInformation
Else
   Ns = UBound(TChem) + 1
   For N = 1 To UBound(TChem)
      If VarType(TChem(N)) = vbString Then
         If R.FullPath = TChem(N) Then Exit Sub
      Else: Ns = N: End If: Next N
   If Ns > UBound(TChem) Then ReDim Preserve TChem(1 To Ns)
   TChem(Ns) = R.FullPath
   ThisWorkbook.Names.Add "TFPOL", TChem
   End If
End Sub
 

Dranreb

XLDnaute Barbatruc
Alors j'ai peur qu'on ne puisse rien faire dans ce classeur lui même.
Cette erreur se produit souvent quand il y a un MANQUANT dans une référence. Or le code vise justement à en corriger une.
Peut être faudrait-il prendre une toute autre voie, que je n'aime pas, d'ailleurs.
Traiter le problème en liaisons tardives à travers une variable ObjOL As Object, en trouvant la syntaxe du CreateObject nécessaire.
Peut être Set ObjOL = CreateObject("Outlook.Application"), je ne sais pas…
Je pense que je ne peux pas vous aider davantage, désolé.
 

CYNO68

XLDnaute Junior
et dans la macro d'envoi de mail, je ne peut pas eviter de faire appel a cette fichu bibliothèque ?
ou alors supprimer la bibliothèque le plus récente (la 16.0 qui apparait en manquant sur excel 2013) et utiliser la 15.0 ?
 

CYNO68

XLDnaute Junior
voici le code que j'utilise
toutes les variables sont en object donc il faudrai que je change quoi ?
Sub Envoi_par_mail()
' Nécessite la référence : Microsoft Outlook 1x Object Library


'Dim olMail As Outlook.MailItem
'Dim olApp As New Outlook.Application
Dim olApp As Object
Dim oLMail As Object
Dim CurFile As String
Dim Analyse As String
Dim FeuillePrecedente As String
Dim RR As String
Dim Nom_Commercial As String
Dim Numero_Semaine As String
FeuillePrecedente = ActiveSheet.Name
Numero_Semaine = [O3].Value


Set olApp = New Outlook.Application
Set oLMail = olApp.CreateItem(olMailItem)
CurFile = ThisWorkbook.Path & "\" & "RAPPORT DE VISITE " & ActiveSheet.[O2].Value & " " & [O3].Value & ".Pdf"
Analyse = ThisWorkbook.Path & "\" & "ANALYSE DE VISITE " & [O2].Value & " " & [O3].Value & ".Pdf"

ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=CurFile, _
Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, _
OpenAfterPublish:=False
Range("O3:p6").Select
Selection.Copy

Sheets("ANALYSE DES RAPPORTS").Select
Range("P1").Value = Numero_Semaine


'Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Analyse, _
Quality:=xlQualityStandard, IncludeDocProperties:=False, IgnorePrintAreas:=False, _
OpenAfterPublish:=False
' retour a la feuille précedente
Sheets(FeuillePrecedente).Select
Nom_Commercial = [J2].Value
'selectionner RR en fonction du commercial
If Nom_Commercial = "BENJAMIN GUERIN" Or Nom_Commercial = "AUDREY MORINEAUX" Or Nom_Commercial = "SOIG KEMORVANT" Or Nom_Commercial = "KAREN DANNEVILLE" Then

RR = ""
End If
If Nom_Commercial = "RAPHAEL FABRE" Or Nom_Commercial = "HELENE ROUSTAN VIE" Or Nom_Commercial = "GILLES PASTOR" Or Nom_Commercial = "YOANN FABRE" Then
RR = ""
End If
If Nom_Commercial = "SIMON BOURGOGNE" Or Nom_Commercial = "FRANCK PIQUET" Or Nom_Commercial = "SEBASTIEN YEDO" Or Nom_Commercial = "SYLVIE BLAUDEZ" Or Nom_Commercial = "OLIVIER GERIN" Then
RR = ""
End If
With oLMail
'determiner adresse d'envoi principale
.To = ";" & RR
' qui en copie
.CC = ""
' qui en copie cachée
.BCC = ""
'Objet du mail
.Subject = "RAPPORT HEBDOMADAIRE DE " & [J2].Value & " " & [O2].Value & " " & [O3].Value
'Texte
.Body = "Bonjour," & vbCrLf & vbCrLf & "Ci joint mon rapport de visite de la semaine " & [O3].Value & vbCrLf & vbCrLf & "Merci" & vbCrLf & "Bonne journée" & vbCrLf & vbCrLf & [J2].Value
'Piece jointe
.Attachments.Add CurFile
.Attachments.Add Analyse
'Envoyer

.Display
End With
MsgBox "Merci d'avoir envoyé votre RAPPORT !!!"

' Effacer les variables objets
Set oLMail = Nothing
Set olApp = Nothing
End Sub
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Oui ben c'était complètement idiot d'utiliser des As Object si vous aviez la référence.
Mais maintenant que vous ne pourrez plus l'avoir c'est surtout le
Set olApp = New Outlook.Application qu'il faut voir à remplacer si possible par
Set olApp = CreateObject("Outlook.Application")
 

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 165
Messages
2 085 880
Membres
103 009
dernier inscrit
dede972