IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Enregistrements depuis Outlook 365


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Dessinateur projeteur
    Inscrit en
    Mai 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur projeteur

    Informations forums :
    Inscription : Mai 2021
    Messages : 8
    Par défaut Enregistrements depuis Outlook 365
    Bonjour à toutes et tous.

    Je m'adresse à vous car je souhaite développer un utilitaire me permettant d'enregistrer les mails dans un dossier d'affaire, sur un disque en particulier.

    Pour faire simple, j'entre le numéro de mon affaire dans ma TextBox en haut à gauche, je clique sur la loupe, ça trouve automatiquement le dossier dans lequel elle est rangée (suivant l'année de de l'afffaire).
    Ensuite, je sélectionne le service pour choisir le dossier dans lequel je souhaite enregistrer mon mail au format .msg.

    Jusque là, tout fonctionne bien, rien de compliqué.
    Là où je bloque, c'est pour récupérer les informations du mail en cours (ouvert après double-clic, ou bien le mail sélectionné dans mon arborescente Outlook 365).

    La macro ne veut à aucun moment détecter le mail en cours.

    Je me suis un peu renseigné, et je pense que Microsoft a complètement verrouillé la possibilité d'enregistrer des mails depuis des utilitaires externes, et étant donné que le VBA n'est plus intégré à Outlook, j'ai essayé de me tourner vers le VB.Net mais je n'arrive pas à m'en sortir.
    Je ne trouve aucun sujet sur internet concernant Outlook365, ni même aucun qui précise que le VBA n'y est plus possible... C'est très trouble comme fonctionnement 365 je trouve.

    Mon dernier recours, c'est vous, les bons vieux être humains ! 😄

    Je pense que mon problème provient de ma fonction GetSelectedMail.
    Est-ce que l'uns ou l'unes d'entre vous aurait une idée pour m'aiguiller ou connait la solution pour que cela fonctionne ?

    Dans l'idée, j'aimerais que le mail s'enregistre dans le format suivant:

    «Date» - «Expéditeur» à «Récepteur» et «Personnes en copie» - «Objet»
    Avec Date sous le format «YYYY MM DD»


    Nom : Utilitaire.jpg
Affichages : 91
Taille : 51,7 Ko

    Enfin, voici mon code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
     
     
    Imports Microsoft.Office.Interop
    Imports System.IO
    Imports System.Text.RegularExpressions
    Imports System.Runtime.InteropServices
    Imports Outlook = Microsoft.Office.Interop.Outlook
    Imports Microsoft.VisualBasic
     
     
    Partial Class Form1
        Inherits Form
     
        '####################   S'assurer que OUTLOOK est bien actif et trouve une fenêtre  ####################
        Private Function GetSelectedMail() As Outlook.MailItem
     
            Dim app As Object = Nothing
     
            Try
                app = GetObject(, "Outlook.Application")
            Catch
                Return Nothing
            End Try
     
            If app Is Nothing Then Return Nothing
     
     
            Try
                AppActivate("Outlook")
                Threading.Thread.Sleep(150)
            Catch
                ' Outlook pas trouvé
            End Try
     
     
            Dim insp As Outlook.Inspector = Nothing
            Try
                insp = app.ActiveInspector()
            Catch
            End Try
     
            If insp IsNot Nothing Then
                Dim openedMail As Outlook.MailItem =
                TryCast(insp.CurrentItem, Outlook.MailItem)
                If openedMail IsNot Nothing Then
                    Return openedMail
                End If
            End If
     
     
            Dim explorer As Outlook.Explorer = app.ActiveExplorer()
            If explorer Is Nothing Then Return Nothing
            If explorer.Selection Is Nothing OrElse explorer.Selection.Count = 0 Then Return Nothing
     
            Return TryCast(explorer.Selection(1), Outlook.MailItem)
     
        End Function
     
        'Private Function GetSelectedMail() As Outlook.MailItem
        '    Dim app As New Outlook.Application()
        '    Dim explorer As Outlook.Explorer = app.ActiveExplorer()
     
        '    If explorer Is Nothing Then Return Nothing
        '    If explorer.Selection Is Nothing OrElse explorer.Selection.Count = 0 Then Return Nothing
     
        '    Return TryCast(explorer.Selection(1), Outlook.MailItem)
        'End Function
     
        '#######################################################################################################
     
        Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
            For Each p As Process In Process.GetProcessesByName("MACROMAIL")
                Try
                    p.Kill()
                Catch
                End Try
            Next
        End Sub
        '##############################   Format d'enregistrement   ############################################
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            ' Ne rien faire au chargement
        End Sub
     
        '#######################################################################################################
     
     
        Private Function SanitizeFileName(fileName As String) As String
            Dim invalidChars As Char() = System.IO.Path.GetInvalidFileNameChars()
            For Each c As Char In invalidChars
                Select Case c
                    Case "/"c
                        fileName = fileName.Replace(c, "-"c)
                    Case ";"c, ","c
                        fileName = fileName.Replace(c, "."c)
                    Case Else
                        fileName = fileName.Replace(c, "_"c) ' Remplace les autres caractères invalides par un underscore
                End Select
            Next
            Return fileName
        End Function
     
     
     
        '##################################################################
     
        Private Sub BoutonChercher_Click(sender As Object, e As EventArgs) Handles BoutonChercher.Click
     
            Dim CheminAffaire = TrouverCheminAffaire(TBNumAff.Text)
     
            If CheminAffaire <> String.Empty Then
                TBPath.Text = CheminAffaire
            Else
                MessageBox.Show("Aucune affaire trouvée.")
            End If
     
        End Sub
        Private Function TrouverCheminAffaire(numAff As String) As String
     
            If String.IsNullOrWhiteSpace(numAff) Then Return String.Empty
     
            Dim dossierRacine As String = "N:\"
            Dim anneeCourante As Integer = Date.Now.Year
            Dim anneeMin As Integer = 2010
     
            For annee As Integer = anneeCourante To anneeMin Step -1
     
                Dim dossierAnnee As String = Path.Combine(dossierRacine, "AFFAIRE " & annee)
     
                If Directory.Exists(dossierAnnee) Then
                    For Each dossierAffaire As String In Directory.GetDirectories(dossierAnnee)
                        If Path.GetFileName(dossierAffaire).Contains(numAff) Then
                            Return dossierAffaire
                        End If
                    Next
                End If
            Next
     
            Return String.Empty
     
        End Function
     
     
     
     
        '########################   Sélectionner le dossier manuellement  ####################################
     
        Private Sub BoutonPath_Click(sender As Object, e As EventArgs) Handles BoutonPath.Click
     
            Dim folderDialog As New FolderBrowserDialog()
     
     
            If folderDialog.ShowDialog() = DialogResult.OK Then
                TBPath.Text = folderDialog.SelectedPath ' Remplacer TBPath par le nom réel de votre TextBox
            End If
     
        End Sub
     
        '########################   Rafraîchir le nom du fichier   ############################################
     
        Private Sub BoutonRefresh_Click(sender As Object, e As EventArgs) Handles BoutonRefresh.Click
     
            Dim mailItem As Outlook.MailItem = GetSelectedMail()
     
            If mailItem Is Nothing Then
                MessageBox.Show("Veuillez sélectionner un email dans Outlook.")
                Exit Sub
            End If
     
            Dim dateFormat As String = mailItem.SentOn.ToString("yyyy MM dd")
            Dim envoyeur As String = If(mailItem.SenderEmailAddress, "Expéditeur inconnu")
     
            Dim recipients As String = ""
            If Not String.IsNullOrWhiteSpace(mailItem.To) Then
                recipients = String.Join(", ",
                mailItem.To.Split(";"c).Select(Function(s) s.Trim()))
            End If
     
            Dim cc As String = ""
            If Not String.IsNullOrWhiteSpace(mailItem.CC) Then
                cc = String.Join(", ",
                mailItem.CC.Split(";"c).Select(Function(s) s.Trim()))
            End If
     
            Dim subject As String = If(mailItem.Subject, "")
     
            Dim fileName As String = $"{dateFormat} - {envoyeur} à {recipients} - {cc} - {subject}"
            TBName.Text = SanitizeFileName(fileName)
     
        End Sub
     
     
     
     
        Private Sub BoutonSave_Click(sender As Object, e As EventArgs) Handles BoutonSave.Click
     
            If String.IsNullOrWhiteSpace(TBPath.Text) OrElse String.IsNullOrWhiteSpace(TBName.Text) Then
                MessageBox.Show("Veuillez renseigner un chemin et un nom de fichier.")
                Exit Sub
            End If
     
            Dim mailItem As Outlook.MailItem = GetSelectedMail()
     
            If mailItem Is Nothing Then
                MessageBox.Show("Veuillez sélectionner un email dans Outlook.")
                Exit Sub
            End If
     
            Dim savePath As String = Path.Combine(TBPath.Text, TBName.Text & ".msg")
     
            mailItem.SaveAs(savePath, Outlook.OlSaveAsType.olMSG)
            MessageBox.Show("Email sauvegardé avec succès !")
     
        End Sub
     
     
     
        Private Sub BoutonComm_Click(sender As Object, e As EventArgs) Handles BoutonComm.Click
     
     
            Dim CheminAffaire As String = TrouverCheminAffaire(TBNumAff.Text)
     
            If CheminAffaire <> String.Empty Then
                TBPath.Text = CheminAffaire & "1 - COMMERCIAL"
            Else
                MessageBox.Show("Aucune affaire trouvée.")
            End If
     
        End Sub
     
        Private Sub BoutonBE_Click(sender As Object, e As EventArgs) Handles BoutonBE.Click
     
     
            Dim CheminAffaire As String = TrouverCheminAffaire(TBNumAff.Text)
     
            If CheminAffaire <> String.Empty Then
                TBPath.Text = CheminAffaire & "1 - BE"
            Else
                MessageBox.Show("Aucune affaire trouvée.")
            End If
     
        End Sub
     
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Hide()
        End Sub
     
    End Class
    Merci d'avance pour votre aide.

    Beoden

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 584
    Par défaut
    J'ai attendu un peu pour répondre mais comme personne d'autre de plus compétent ne s'y colle, je vais partager un peu de ma maigre expérience et mes faibles connaissances.

    et étant donné que le VBA n'est plus intégré à Outlook
    Heu, Ha bon ???
    J'ai un "Outlook 365" sous Win11 Pro et un simple Alt-F11 me permet toujours d'accéder au VBA d'Outlook.

    je pense que Microsoft a complètement verrouillé la possibilité d'enregistrer des mails depuis des utilitaires externes,
    Que les accès "externes" soient très surveillés, c'est plus que probable, mais VBA pour Outlook existe toujours, il me semble.

    C'est l'approche que j'aurai privilégié pour l'implémentation de votre projet : un plug-Ins/Macro VBA dans Outlook.

    j'ai essayé de me tourner vers le VB.Net mais je n'arrive pas à m'en sortir.
    Heu, les modes de développement entre VB.Net et VBA sont très très proches car vous utilisez très probablement les mêmes composants COM dans les 2 cas.

    Je pense que mon problème provient de ma fonction GetSelectedMail.
    Pourquoi n'utilisez-vous pas un débuggeur pour en être sûr ?

    Est-ce que l'uns ou l'unes d'entre vous aurait une idée pour m'aiguiller ou connait la solution pour que cela fonctionne ?
    Vous postez une masse assez conséquente de code, assez évolué, mais avec très peu d'information sur le ou les disfonctionnements.
    C'est assez typique de l'usage des IA générative, mais vous devez essayer de maitriser un peu la charrue.

    Donc, il vous dit quoi le débugueur ?

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 668
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 668
    Par défaut
    Gemini m'a gentiment répondu après lui avoir demander comment récupérer les infos du mail actuellement affiché dans outlook 365 par ce code (pour macro VBA Outlook) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Sub RecupererInfosMailActuel()
        Dim objItem As Object
        Dim olMail As Outlook.MailItem
     
        ' 1. Identifier l'élément actif
        Select Case TypeName(Application.ActiveWindow)
            Case "Inspector"
                ' Si le mail est ouvert dans sa propre fenêtre
                Set objItem = Application.ActiveInspector.CurrentItem
            Case "Explorer"
                ' Si le mail est sélectionné dans la liste principale
                If Application.ActiveExplorer.Selection.Count > 0 Then
                    Set objItem = Application.ActiveExplorer.Selection.Item(1)
                End If
        End Select
     
        ' 2. Vérifier si c'est bien un e-mail
        If Not objItem Is Nothing Then
            If TypeOf objItem Is Outlook.MailItem Then
                Set olMail = objItem
     
                ' 3. Afficher les informations
                MsgBox "Sujet : " & olMail.Subject & vbCrLf & _
                       "Expéditeur : " & olMail.SenderName & " (" & olMail.SenderEmailAddress & ")" & vbCrLf & _
                       "Date : " & olMail.ReceivedTime, vbInformation, "Infos Mail"
            Else
                MsgBox "L'élément sélectionné n'est pas un e-mail.", vbExclamation
            End If
        Else
            MsgBox "Aucun élément sélectionné.", vbCritical
        End If
    End Sub
    ou en version VB.NET
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Imports Outlook = Microsoft.Office.Interop.Outlook
    Imports System.Runtime.InteropServices
     
    Module Module1
        Sub Main()
            Try
                ' Tenter de récupérer l'instance Outlook en cours d'exécution
                Dim outlookApp As Outlook.Application = Nothing
     
                Try
                    outlookApp = Marshal.GetActiveObject("Outlook.Application")
                Catch
                    Console.WriteLine("Outlook n'est pas ouvert.")
                    Return
                End Try
     
                Dim currentItem As Object = Nothing
     
                ' 1. Vérifier si un mail est ouvert dans une fenêtre séparée (Inspector)
                If outlookApp.ActiveInspector IsNot Nothing Then
                    currentItem = outlookApp.ActiveInspector.CurrentItem
                ' 2. Sinon, vérifier le mail sélectionné dans la fenêtre principale (Explorer)
                ElseIf outlookApp.ActiveExplorer IsNot Nothing Then
                    Dim selection As Outlook.Selection = outlookApp.ActiveExplorer.Selection
                    If selection.Count > 0 Then
                        currentItem = selection.Item(1)
                    End If
                End If
     
                ' Vérifier si l'objet est bien un mail
                If TypeOf currentItem Is Outlook.MailItem Then
                    Dim mail As Outlook.MailItem = DirectCast(currentItem, Outlook.MailItem)
     
                    ' Affichage des informations
                    Console.WriteLine("Sujet : " & mail.Subject)
                    Console.WriteLine("Expéditeur : " & mail.SenderName & " (" & mail.SenderEmailAddress & ")")
                    Console.WriteLine("Reçu le : " & mail.ReceivedTime.ToString())
                    Console.WriteLine("Corps (extrait) : " & Left(mail.Body, 100) & "...")
                Else
                    Console.WriteLine("Aucun e-mail sélectionné ou ouvert.")
                End If
     
            Catch ex As Exception
                Console.WriteLine("Erreur : " & ex.Message)
            End Try
     
            Console.ReadKey()
        End Sub
    End Module

  4. #4
    Membre à l'essai
    Homme Profil pro
    Dessinateur projeteur
    Inscrit en
    Mai 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur projeteur

    Informations forums :
    Inscription : Mai 2021
    Messages : 8
    Par défaut
    Citation Envoyé par bacelar Voir le message
    J'ai attendu un peu pour répondre mais comme personne d'autre de plus compétent ne s'y colle, je vais partager un peu de ma maigre expérience et mes faibles connaissances.


    Heu, Ha bon ???
    J'ai un "Outlook 365" sous Win11 Pro et un simple Alt-F11 me permet toujours d'accéder au VBA d'Outlook.


    Que les accès "externes" soient très surveillés, c'est plus que probable, mais VBA pour Outlook existe toujours, il me semble.

    C'est l'approche que j'aurai privilégié pour l'implémentation de votre projet : un plug-Ins/Macro VBA dans Outlook.


    Heu, les modes de développement entre VB.Net et VBA sont très très proches car vous utilisez très probablement les mêmes composants COM dans les 2 cas.


    Pourquoi n'utilisez-vous pas un débuggeur pour en être sûr ?


    Vous postez une masse assez conséquente de code, assez évolué, mais avec très peu d'information sur le ou les disfonctionnements.
    C'est assez typique de l'usage des IA générative, mais vous devez essayer de maitriser un peu la charrue.

    Donc, il vous dit quoi le débugueur ?
    Pour ma part, je suis passé sur Outlook 365 en ayant le "Nouveau Outlook" de coché. Le problème c'est que maintenant il est installé d'office et je n'ai plus la possibilité de revenir à "l'ancien Outlook", et le nouveau Outlook n'a plus le VBA d'intégré. Je n'ai ni la possibilité d'activer les options de développeur, ni la possibilité d'ouvrir de la macro avec ALT+F11. C'est pour ça que je me suis tourné vers VB.NET qui permet malgré tout d'effectuer des actions avec des applications.

    Enfaite je suis parti d'un code que j'utilisais en VBA sur mon Outlook "ancienne génération", donc non tout ne provient pas d'une IA générative.
    En tant que débutant, oui j'ai utilisé Gemini et GPT pour essayer d'adapter certaines parties où j'ai eu un peu de mal mais surtout pour la partie GetSelectedMail qui me pose problème.

    Je dis que je suppose que c'est cette partie, mais de mon côté je suis certain que c'est la fonction GetSelectedMail car le reste fonctionne sans trop de problème (ou reste plus simple à résoudre).
    Le problème de ma macro, c'est la sélection d'un mail ouvert (ou sélectionné) car rien n'est détecté.
    Ce que je ne sais pas, c'est si le Outlook.Application peut être détecté ou non ou qu'est-ce qui pose problème.

    En tout cas je suis d'accord, si j'avais la possibilité de faire tout ça en VBA, ça aurait été plus simple et je n'aurais pas eu de questions 😄

    Nom : bug.jpg
Affichages : 33
Taille : 154,9 Ko

    Pour répondre à umfred

    J'ai essayé de demander à GPT et Gemini. Les deux me proposent lafonction avec Marshal.GetActiveObject, mais visiblement le NET Framework ne fonctionne plus avec cette fonction là.
    Merci pour vos réponses 🙏🏻

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 668
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 668
    Par défaut
    Je pense que c'est parce que tu utilises effectivement le "new outlook", tu devrais trouver dans ton menu démarrer un "outlook (classic)" dans lequel tu retrouvera le vba et qui pourra être commander par interop.

    A priori, tu pourrais lancer la version classique, en tapant outlook.exe dans la fenêtre "Exécuter" (touches Windows+R)

    Dans le cadre d'une appli VB.net, si adresse "hébergée" par Microsoft (exchange ou outlook/hotmail), il faut passer par l'API Microsoft Graph, en ayant créer une clé d'application sur https://portal.azure.com/ et donc côté application utiliser les package Nuget Microsoft.Graph et Azure.Identity. Dans le cas d'un email non-microsoft, il faut utiliser d'autres package comme MailKit.

    Mais il n'y n'y aura plus de notion de "mail ouvert ou mail sélectionné" puisqu'on interroge directement le serveur.

    Sinon, avec le "new outlook", il faut un complément utilisant office.js (un fichier manifeste (xml ou json) et du code html/javascript, hébergé sur un serveur https (local ou non)).
    Pour tester, l'IA m'a conseillé de tester via ScriptLab :
    Dans le New Outlook, allez dans l'onglet Accueil > Ajouter des compléments (ou "Applications").
    Cherchez et installez Script Lab.
    Ouvrez Script Lab et choisissez l'exemple "Get item properties". Vous pourrez modifier le code et l'exécuter instantanément.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 584
    Par défaut
    En tout cas je suis d'accord, si j'avais la possibilité de faire tout ça en VBA, ça aurait été plus simple et je n'aurais pas eu de questions 😄
    Je suis assez déstabilisé par vos remarques sur la "difficulté" du passage entre VBA et VB.NET.

    Pour moi, la seule "différence" entre les 2, c'est la présence de l'objet "Application" en VBA qui est directement disponible.
    Sinon, les différences entre les 2 codes, c'est juste de la poésie. Ca fait la même chose d'une manière un peu différente.

    VB.NET, utilise, via les PIA Office, les mêmes composants COM que le VBA. (enfin, il y a 15 ans, c'était encore comme ça.)

    Pour ma part, je suis passé sur Outlook 365 en ayant le "Nouveau Outlook" de coché. Le problème c'est que maintenant il est installé d'office et je n'ai plus la possibilité de revenir à "l'ancien Outlook", et le nouveau Outlook n'a plus le VBA d'intégré. Je n'ai ni la possibilité d'activer les options de développeur, ni la possibilité d'ouvrir de la macro avec ALT+F11. C'est pour ça que je me suis tourné vers VB.NET qui permet malgré tout d'effectuer des actions avec des applications.
    Je suis très surpris par la "disparition" de VBA.
    Je suis sur un système où aucun outil de développement Office n'a été installé "directement" et provient d'un master Win11 Pro "bureautique" de mon client, et j'ai quand même le Alt+F11 qui fonctionne.
    Avez-vous vérifié que vous êtes bien un "vrai" administrateur de votre machine ?
    Sur ma machine, via RegEdit, je peux voir que les composants COM d'Outlook sont installés.
    Mais ces composants sont versionnés : "Outlook.Application.16".
    Mais votre code n'est pas "version aware".
    Il cherche à instancier (avec 'GetObject(, "Outlook.Application")') un Outlook, sans spécifier la version.
    Donc, si l'installation d'Outlook ne s'est pas mis comme "Outlook par défaut", c'est normal que votre code ne récupère aucune application.
    Utilisez RegEdit pour voir sous quel nom est enregistré le composant COM de l'application Outlook et utilisez-le à la place de "Outlook.Application".

    La version du code avec 'Marshal.GetActiveObject("Outlook.Application")' ne cherche même pas à instancier/lancer un Outlook mais en cherche un déjà ouvert (utilisation de la table ROT et/ou des Monikers qui vont bien).

    J'insisterai un peu pour voir si l'utilisation de VBA est possible, car cela débarrasse le problème d'instanciation de l'application.

    Enfaite je suis parti d'un code que j'utilisais en VBA sur mon Outlook "ancienne génération", donc non tout ne provient pas d'une IA générative.
    Peut-être que votre ancien code faisait l'assertion qu'un "Outlook par défaut" était configuré sur la machine.
    En tant que débutant, oui j'ai utilisé Gemini et GPT pour essayer d'adapter certaines parties où j'ai eu un peu de mal mais surtout pour la partie GetSelectedMail qui me pose problème.
    Je dis que je suppose que c'est cette partie, mais de mon côté je suis certain que c'est la fonction GetSelectedMail car le reste fonctionne sans trop de problème (ou reste plus simple à résoudre).
    Je suis assez dubitatif sur cette analyse, car le code me semble bien fragile, en particulier sur le versionning, et pas que sur "GetSelectedMail".
    Donc, plutôt que de deviner les problèmes, l'utilisation d'un débugueur est bien plus sûre et efficace.
    Le copie d'écran que vous avez postée semble bien montrer que le problème est dans 'GetObject(, "Outlook.Application")' et pas dans "GetSelectedMail", non ?

    Le problème de ma macro, c'est la sélection d'un mail ouvert (ou sélectionné) car rien n'est détecté.
    VBA construit des MACRO (avec "late binding") ; VB.NET fait des "programmes" et l'utilisation du "late binding/dynamic" n'est pas d'un usage "commun".

    Ce que je ne sais pas, c'est si le Outlook.Application peut être détecté ou non ou qu'est-ce qui pose problème.
    "Outlook.Application" n'a pas "à être détecté" mais un composant COM doit s'enregistrer sur ce nom de composant.

    Marshal.GetActiveObject, mais visiblement le NET Framework ne fonctionne plus avec cette fonction là
    Pouvez-vous donner le message d'erreur ? Mais vraisemblablement, soit parce qu'Outlook n'est pas lancé, soit il ne s'enregistre pas avec le "bon" nom dans le ROT.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Dessinateur projeteur
    Inscrit en
    Mai 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur projeteur

    Informations forums :
    Inscription : Mai 2021
    Messages : 8
    Par défaut
    Citation Envoyé par umfred Voir le message
    Je pense que c'est parce que tu utilises effectivement le "new outlook", tu devrais trouver dans ton menu démarrer un "outlook (classic)" dans lequel tu retrouvera le vba et qui pourra être commander par interop.

    A priori, tu pourrais lancer la version classique, en tapant outlook.exe dans la fenêtre "Exécuter" (touches Windows+R)

    Dans le cadre d'une appli VB.net, si adresse "hébergée" par Microsoft (exchange ou outlook/hotmail), il faut passer par l'API Microsoft Graph, en ayant créer une clé d'application sur https://portal.azure.com/ et donc côté application utiliser les package Nuget Microsoft.Graph et Azure.Identity. Dans le cas d'un email non-microsoft, il faut utiliser d'autres package comme MailKit.

    Mais il n'y n'y aura plus de notion de "mail ouvert ou mail sélectionné" puisqu'on interroge directement le serveur.

    Sinon, avec le "new outlook", il faut un complément utilisant office.js (un fichier manifeste (xml ou json) et du code html/javascript, hébergé sur un serveur https (local ou non)).
    Pour tester, l'IA m'a conseillé de tester via ScriptLab :
    Dans le New Outlook, allez dans l'onglet Accueil > Ajouter des compléments (ou "Applications").
    Cherchez et installez Script Lab.
    Ouvrez Script Lab et choisissez l'exemple "Get item properties". Vous pourrez modifier le code et l'exécuter instantanément.

    ______________________________________________________________________________________________________________


    Merci UMFRED pour ton aide. Je n'avais jamais pensé à essayer de lancer Outlook avec cette méthode. J'étais persuadé que Outlook(New) m'était imposé...
    Je n'avais plus la possibilité de lancer l'ancien Outlook depuis office directement.
    En effet, je vais rebasculer sur le VBA de cette manière, en espérant que Microsoft ne force pas l'utilisation de Outlook(New) à terme en délaissant la version classique... Qu'est-ce qu'ils ne feraient pas pour nous faire payer plus 🤭.
    Puisque je peux réutiliser Outlook classique, je me résigne à utiliser le classique et abandonner ma solution VB.NET, même si je n'aime pas trop baisser les bras 😅.

    ______

    bacelar, tout d'abord, merci d'avoir pris le temps de me répondre, et merci d'avoir pris du temps pour ma demande. Cependant, je trouve que votre manière de répondre est un peu incisive.

    Je n'ai jamais parlé de difficultés à passer de VBA à VB.NET. J'étais bloqué, ne pouvant pas utiliser de VBA sur Outlook(New), donc je cherchais simplement une solution similaire qui me permettait d'obtenir le même résultat avec une application tiers, d'où mon intérêt pour le VB.NET qui est en effet similaire et qui permet de jouer sur plusieurs tableau étant donné que ce sont de petits programmes indépendants.

    Oui ma façon de coder est fragile, j'en ai conscience, car comme précisé je débute et n'ai pas l'occasion de m'entrainer fréquemment.
    Et oui j'ai utilisé Gemini pour m'aider sur une fonction et ce n'est pas propre, j'en ai conscience aussi.
    Cependant, tout remettre en question n'est pas toujours forcément très appréciable, et si vous faites un minimum de recherches, vous verrez que oui, et malgré votre surprise, le VBA a bel et bien été retiré de Outlook(New).

    N'oubliez pas que nous n'avons pas tous le même niveau de compréhension et que pour un débutant, la programmation (même en VB qui reste assez simple), ça peut se montrer assez complexe, surtout sur du multi-app.

    Je prends bien note de vos remarques et je vais essayer de travailler avec plus de rigueur sur les erreurs affichées, les messages à afficher et le débuggeur pas à pas concernant mes prochains travaux.

    _____

    Quoi qu'il en soit, je vous remercie pour votre investissement.
    J'aurai du mieux me renseigner sur la possibilité d'utiliser Outlook classic plutôt que le (New) avant d'essayer de palier au problème.
    Ça n'a malheureusement pas mené à grand chose à mon grand désespoir, mais j'aurai essayé...
    Je retourne donc sur Outlook classic (puisque maintenant je le peux) et garder mon utilitaire en VBA.

    Je signale le sujet comme résolu et m'excuse pour la perte de temps.

    Beoden

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 668
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 668
    Par défaut
    outlook new est en fait le remplaçant/successeur de l'application Courrier, fourni avec l'OS.
    Après installation d'Office 365, les 2 versions coexistent, on peut désinstaller la version new (je le fais souvent via un clic droit sur son icone, c'est plus directe)., on peut la désépingler de la barre des tâches et ensuite épingler la version "classic" pour faciliter

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 584
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 584
    Par défaut
    Désolé @Beoden si ma réponse vous a semblez condescendante.
    Ce n'était pas l'objectif à atteindre mais vous éclairer sur divers "travers" de votre démarche.
    L'utilisation de VBA vous enlèvera la problématique de l'obtention d'un objet "Application" correctement initialisé et vraisemblablement moins bridé.

    La réponse suivante montre que "Outlook(New)" implémente toujours l'InterOp COM mais que des problèmes de compatibilité ascendante sont à prévoir et qu'il vaut mieux privilégier les interfaces "Microsoft Graph API" que les interfaces COM :
    https://learn.microsoft.com/en-us/an...p-outlook-with
    Le code VB.NET que vous avez posté utilise les interfaces COM plutôt que "Microsoft Graph API".
    Si vous êtes intéressé par l'utilisation de VB.NET sur Outlook, demandez à Gemini/ChatGPT de fournir du code "Microsoft Graph API" et pas "COM".

    Happy programming

  10. #10
    Membre à l'essai
    Homme Profil pro
    Dessinateur projeteur
    Inscrit en
    Mai 2021
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur projeteur

    Informations forums :
    Inscription : Mai 2021
    Messages : 8
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Désolé @Beoden si ma réponse vous a semblez condescendante.
    Ce n'était pas l'objectif à atteindre mais vous éclairer sur divers "travers" de votre démarche.
    L'utilisation de VBA vous enlèvera la problématique de l'obtention d'un objet "Application" correctement initialisé et vraisemblablement moins bridé.

    La réponse suivante montre que "Outlook(New)" implémente toujours l'InterOp COM mais que des problèmes de compatibilité ascendante sont à prévoir et qu'il vaut mieux privilégier les interfaces "Microsoft Graph API" que les interfaces COM :
    https://learn.microsoft.com/en-us/an...p-outlook-with
    Le code VB.NET que vous avez posté utilise les interfaces COM plutôt que "Microsoft Graph API".
    Si vous êtes intéressé par l'utilisation de VB.NET sur Outlook, demandez à Gemini/ChatGPT de fournir du code "Microsoft Graph API" et pas "COM".

    Happy programming

    Il n'y a rien de grave 😉
    Ce que je ne savais pas que c'est la version New était une version implémentée dans l'OS comme l'a précisé umfred. Je n'aurais pas du me buter sur ça et chercher une solution ailleurs avant de me lancer tête baissée dans une solution sans issue.

    En tout cas je prends note de tout ça dans mon Becherel de programmeurs pour les nuls personnel 😄
    J'ai encore beaucoup de choses à apprendre et je vais m'y mettre plus ardemment cette année pour fiabiliser mes projets.

    Merci encore pour votre aide précieuse à tous les deux et bonne continuation 🙂

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-365] Copier coller depuis Access 365 vers Outlook 365
    Par ArsèneDupuis dans le forum Access
    Réponses: 23
    Dernier message: 31/01/2020, 21h18
  2. Réponses: 6
    Dernier message: 05/08/2019, 18h16
  3. [Toutes versions] BUG PONCTUEL : enregistrer un mail envoyé depuis Outlook via Excel
    Par altaar dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 12/06/2017, 12h36
  4. [AC-2010] Capturer fenêtre(s) message Outlook pour enregistrement depuis VBA access.
    Par FwRamaro dans le forum VBA Access
    Réponses: 1
    Dernier message: 02/10/2014, 21h53
  5. Créée des enregistrements depuis un formulaire
    Par marie10 dans le forum Access
    Réponses: 5
    Dernier message: 23/01/2006, 11h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo