XL 2016 VBA : déclaration Outlook.Application

F22Raptor

XLDnaute Impliqué
[RESOLU] : pour ceux qui ont le même problème, cocher dans les références Microsoft Outlook 16.0 Object Library

Bonjour à tous,
J'essaie de relancer une vieille procédure que j'utilisais il y a quelques années (qui allait regarder les mails reçus dans Outlook).

Elle commençait par un :
Dim olApp as Outlook.Application

Désormais ça bugge dès cette ligne : "Erreur de Compil : Type défini par l'utilisateur non défini"

Ca vous dit quelque chose ?
Dans les références VBA, j'ai coché notamment :
Microsoft Excel 16.0 Object Library
OLE Automation
Microsoft Office 16.0 Object Library
Microsoft Forms 2.0 Object Library
MicrosoftHTML Object Library
 

patricktoulon

XLDnaute Barbatruc
bonjour
le mot révélateur "il y a quelques années"
travailler en early binding c'est bien pour les débutants ça leur permet d'avoir l’implémentation pendant le codage
sauf que d'une version excel a l'autre la ref peut être différente
par exemple chez moi sur 2013 c'est 15 et non 16
du coup ton code ne fonctionnera pas chez moi

apprenez a coder en late binding(déclaration tardive) avec createobject
comme ceci
Dim olApp as Object
set loApp=createobject("outlook.application")

l'application va toute seule faire avec la bonne référence et pas besoins de la cocher
 

F22Raptor

XLDnaute Impliqué
Excellent ! Merci Patrick

Pour être sûr :
Mon code était :
Dim olApp as Outlook.Application
Set olApp = New Outlook.Application

Ce sont donc ces deux lignes remplacées par ton :
Dim olApp as Object
set olApp=createobject("outlook.application")

??
 

F22Raptor

XLDnaute Impliqué
Grazie mille monsignore ! 🙏

Et donc sur le même principe, sur la suite de la macro :
Dim olNs As Namespace
Set olNs = olApp.GetNamespace("MAPI")

ca devient
Dim olNs As Object
Set olNs = CreateObject("Outlook.Application.NameSpace.MAPI")

Ou quelque chose du genre ?
 

patricktoulon

XLDnaute Barbatruc
re
non pas tout a fait bien que tu ai un peu compris la logique
en fait namespace et la fonction GetNameSpace sont des membres (enfant de l'app outlook)

donc on le verra comme ça
object.membre ou object.fonction

donc dans ton cas
'déclaration de variable object
Dim olApp As Object, olNs As Object

' Création d' une instance de l'application outlook
Set olApp = CreateObject("Outlook.Application")

' utilisation du membre collection NameSpace ou de la fonction GetNamespace
Set olNs = olApp.GetNamespace("MAPI")

traduction du principe:
set olNs=olApp.fonction(arguments)

ceci est valable pour tout object créé dynamiquement en late binding
te reste à aller sur ms et voir tout les membres et fonction pour apprendre a les connaitre
mais là en l’occurrence getNameSpace n'a qu'un seul argument possible qui est "MAPI" donc c'est facile
Voila tu sais tout ;)
 

F22Raptor

XLDnaute Impliqué
Me revoici encore !

De ce que je peux trouver sur le LateBinding, pour le GetDefaultFolder en EarlyB, c'est pareil en LateB
(comme GetNameSpace MAPI) en fait.

Et donc mon pour déterminer le Folder, mon EarlyB devrait être le même en late.
Je récupère soir le Inbox, soit un répertoire spécial comme "Collègues"
Set Fldr = olNs.GetDefaultFolder(olFolderInbox)
OU
Set Fldr = Fldr.Folders("Collegues")

Mais il n'aime pas en LateB sans la Référence MS Outlook Library cochée ☹️
 

patricktoulon

XLDnaute Barbatruc
re
attention si tu dois te promener dans les dossiers il te faut sélectionner une session namespace
autrement dit un compte mail si tu en a plusieurs enregistrés si tu me donnais tout ton code anonymisé je pourrais te le réécrire avec commentaire et les arguments doivent etre numérique ou string en late binding
ou variabilisés
exemple
Set Fldr = olNs.GetDefaultFolder(olFolderInbox)
ici en late binding olFolderInbox vaut zero et ça m’étonnerait que ce soit bon ;)
 

patricktoulon

XLDnaute Barbatruc
revoici les equivalents numeriques
olFolderInbox6Dossier Boîte de réception
olFolderCalendar9Dossier Calendrier
olFolderContacts10Dossier Contacts
olFolderDrafts16Dossier Brouillons
olFolderDeletedItems3Dossier Éléments supprimés
olFolderOutbox4Dossier Boîte d'envoi
olFolderSentMail5Dossier Éléments envoyés
olFolderTasks13Dossier Tâches
olFolderJunk23Dossier Courrier indésirable
olFolderNotes12Dossier Notes
olFolderJournal11Dossier Journal
 

F22Raptor

XLDnaute Impliqué
Je n'ose pas abuser à ce point, mais puisque tu le proposes ! :D

Si je vire les inutiles pour l'exercice, ça donne ça :
VB:
    Dim olApp As Outlook.Application
    Dim olNs As Namespace
    Dim Fldr As MAPIFolder
    Dim olMail As Variant

    Set olApp = New Outlook.Application
    Set olNs = olApp.GetNamespace("MAPI")


    Select Case Environ("username")
        Case "LeChef"
            Set Fldr = Fldr.Folders("DossierSpecial")

        Case Else
            Set Fldr = olNs.GetDefaultFolder(olFolderInbox)
    End Select


    For Each olMail In Fldr.Items

        If olMail.Subject = "Objet à traiter" Then
            MaVariableHeureMail = Format(olMail.ReceivedTime, "hh:mm:ss")
        End If

    Next olMail


🙏🙏
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
quand je parle d'enfant c'est un truc .quelque chose
ici( Set Fldr = Fldr.Folders("DossierSpecial")) on est dans la consanguinité là) 🤪 🤣 🤪
d'ailleurs a aucun moment Fldr n'est instancié donc Fldr.quelquechose ne risque pas de te donner quelque chose
là c'est pire on est carrément dans une grossesse nerveuse🤪🤣🤣
c'est mystique ton truc
qui a fait l'oeuf (l'oeuf ou la poule) tel est la question
ça résume un peu ton code

bon reprenons je blaguemais bon
alors a supposer que ton dossier"Collègues" soit au mêmes niveau que les autres
on procèdera comme ceci
VB:
Dim olApp As Object
Dim olNs As Object
Dim RootFolder As Object
Dim Fldr As Object

' Initialisation d'Outlook
Set olApp = CreateObject("Outlook.Application")
Set olNs = olApp.GetNamespace("MAPI")

' Accéder au dossier racine de la boîte aux lettres
Set RootFolder = olNs.Folders("monaddressmail") ' Remplace par ton adresse e-mail ou nom de boîte

' Accéder au dossier "Projets"
Set Fldr = RootFolder.Folders("Collègues")

SINON
a supposer que le dossier "Collègues" soit dans le dossier boite de réception
IL N4EST DONC PAS A LA RACINE DE MAPI
là on procèdera comme ceci si je ne me trompe pas
VB:
Dim olApp As Outlook.Application, olNs As Object, Fldr As Object, olMail As object

'création de l'object Outlook
    Set olApp = New Outlook.Application
    
    Set olNs = olApp.GetNamespace("MAPI")


    Select Case UCase(Environ("username"))
        Case "LeChef"
            Set Fldr = olNs.GetDefaultFolder(6).Folders("Collègues") 'le dossier Collègues

        Case Else
            Set Fldr = olNs.GetDefaultFolder(6) 'la boite de reception par defaut
    End Select


    For Each olMail In Fldr.Items

        If olMail.Subject = "Objet à traiter" Then
            MaVariableHeureMail = Format(olMail.ReceivedTime, "hh:mm:ss")
        End If

    Next olMail

si le dossier "Colègues" est plus bas que le 2d niveau il faudra alors jouer avec une fonction récursive
voila ;)
 

Discussions similaires

Réponses
14
Affichages
904

Membres actuellement en ligne

Statistiques des forums

Discussions
315 087
Messages
2 116 084
Membres
112 655
dernier inscrit
fannycordi