Mail auto VB (avec liste excel) ??

Résolu
Bonjour,

Je me permet de me touner vers vous car j'ai un petit problème,

en effet, dans le cadre de mon boulot (je sais pas si venir pour une aide à ce sujet est autorisé) je dois envoyer un rapport unique/pays à chacun de mes correspondants, ce qui signigfie qu'il y à autant de rapports diffeérents que de pays.

j'ai dejà reussi à automatiser l'extraction de ces rapports je coince cependant sur l'automatisation de ces envois

voilà ce que j'ai sous mon excel name => envois mail auto

colonne A : le nom du pays
colonne B : le nom du contact
Colonne C : le pénom du contact
colonne D : Le mail du contact
Colonne E : l'adresse du fichier à joindre

80 lignes

mon code

' appel(d) 'excel
Dim appExcel As Microsoft.Office.Interop.Excel.Application 'Application Excel
Dim wbExcel As Microsoft.Office.Interop.Excel.Workbook 'Classeur Excel
Dim wsExcel As Microsoft.Office.Interop.Excel.Worksheet 'Feuille Excel
Dim ligne
Dim dernière

'Ouverture de l'application
appExcel = CreateObject("Excel.Application")
'Ouverture d'un fichier Excel
wbExcel = appExcel.Workbooks.Open("\adresse du fichier.xlsx")
'2012 BELUX MkgFund.xlsx")
'wsExcel correspond à la première feuille du fichier
wsExcel = wbExcel.Worksheets(1)
appExcel.Visible = False

wbExcel.Sheets(1).Range("a5").Select()
'Pour chaque colonne de 1 à 6
For i = 1 To 6
' on détermine à partir du bas, le rang de la dernière cellule non vide
ligne = wbExcel.Sheets(1).Cells(65530, i).end(Microsoft.Office.Interop.Excel.XlDirection.xlUp).Row
'si le rang trouvé est supérieur au plus grand précédent, "dernière" prend cette valeur:
If ligne > dernière Then dernière = ligne
Next i
'Et dernière = 34 , ce qui était demandé. La preuve:
wbExcel.Sheets(2).Range("a" & dernière).Offset(1, 0).Select()

For a = 1 To 6
Dim name = wbExcel.Sheets(1).Cells(65530, a).end(Microsoft.Office.Interop.Excel.XlDirection.xlUp).Row

Next a
Dim surname =
Dim mail =
Dim Piejointe =

NewMail = OutlookApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem)
NewMail.Recipients.Add("mail")
NewMail.Subject = "Title""surname"
NewMail.Body = "Hello" & "balablablabal"
NewMail.Attachments.Add("Piejointe")
NewMail.Send()
End Sub
End Class

En fait en écrivant le mm code en remplaçant les variables je n'ai pas de problèmes, mais si je rajoutes des lignes sur mon excel elles ne seront pas pris en compte alors que le but est de modifier facilement mon excel et que l'appli s'en serve pour envoyer les mails

en vous remerciant par avance pour votre aide

john

11 réponses

  1. Contributeur
    Bonjour,
    appExcel.Visible = False , en principe pas nécessaire, non visible par défaut.
    Ta boucle a tourne mais ne fait aucune action ?
    Les variables ne sont pas initialisées ?
    Si tu veux mettre des variables dans les données elles ne doivenet pas êtres entourées de guillemets.
    Je verrais plutôt ça dans le genre..

        Dim Texte= "Hello" & "balablablabal"
        dim Titre = "Le titre "
        With wbExcel.Sheets(1)
            Dim Ligne = .Cells(65530, i).End(Microsoft.Office.Interop.Excel.XlDirection.xlUp).Row
            For a = Ligne To 1 Step -1
                dim NewMail = OutlookApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem)
                NewMail.Recipients.Add (.Cells(Ligne, "D"))
                NewMail.Subject = Titre & .Cells(Ligne, "C")
                NewMail.Body = Texte
                NewMail.Attachments.Add (.Cells(Ligne, "E"))
                NewMail.Send()
            Next a
            NewMail = Nothing 'je ne sais pas si en .Net c'est encore obligatoire
        End With

    Attention, ce n'est qu'une piste, fait à main levée et sans test.
    A+
    0
    1. Bonjour,

      merci de ta réponse (mm si je bloque toujours ^^)

      voici mon code qui ne amrche pas mais presque ^^

      'app outlook
      Dim OutlookApp As New Microsoft.Office.Interop.Outlook.Application
      Dim NewMail As Microsoft.Office.Interop.Outlook.MailItem

      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click

      ' appel(d) 'excel
      Dim appExcel As Microsoft.Office.Interop.Excel.Application 'Application Excel
      Dim wbExcel As Microsoft.Office.Interop.Excel.Workbook 'Classeur Excel
      Dim wsExcel As Microsoft.Office.Interop.Excel.Worksheet 'Feuille Excel

      'Ouverture de l'application
      appExcel = CreateObject("Excel.Application")
      'Ouverture d'un fichier Excel
      wbExcel = appExcel.Workbooks.Open("adresse du doc excel")
      '2012 BELUX MkgFund.xlsx")
      'wsExcel correspond à la première feuille du fichier
      wsExcel = wbExcel.Worksheets(1)
      appExcel.Visible = False

      For i = 1 To 6
      Dim ligne = wbExcel.Sheets(1).Cells(65530, i).End(Microsoft.Office.Interop.Excel.XlDirection.xlUp).Row
      With wbExcel.Sheets(1)
      Dim NewMail = OutlookApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem)
      NewMail.Recipients.Add("jonathan.sebban@accor.com") ' pour test
      NewMail.Subject = "document demandé"
      NewMail.Body = "veuiller trouver ci joint le document...."
      NewMail.Attachments.Add(.Cells(ligne, "E"))
      NewMail.Send()
      End With
      Next i

      End Sub
      End Class

      pour info le sujet du mail et le corps du mail est toujours le mm, mais ç abloque sur les variable des colonnes
      0
      1. Contributeur
        Re,Possible qu'a partir de VB la syntaxe tel quel n'est pas reconnue.
        Essayer (pour la colonne E) .Cells(ligne, 5)
        Sinon met un point d'arrèet sur cette ligne et regarde ce qu'il y a dans cette cellule.
        Note elle doit comporter le chemin complet du fichier à joindre.
        A+
        0
        1. bonjour

          et merci du temps que vous m'accordez

          malheureusement ça ne marche toujours pas ça me donne une erreur du type Exception de HRESULT : 0x800A03EC

          mon code

          Imports System.IO
          Imports System
          Imports System.Windows
          Imports System.Reflection

          Class MainWindow

          'app outlook
          Dim OutlookApp As New Microsoft.Office.Interop.Outlook.Application
          Dim NewMail As Microsoft.Office.Interop.Outlook.MailItem

          Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click

          ' appel(d) 'excel
          Dim appExcel As Microsoft.Office.Interop.Excel.Application 'Application Excel
          Dim wbExcel As Microsoft.Office.Interop.Excel.Workbook 'Classeur Excel
          Dim wsExcel As Microsoft.Office.Interop.Excel.Worksheet 'Feuille Excel

          'Ouverture de l'application
          appExcel = CreateObject("Excel.Application")
          'Ouverture d'un fichier Excel
          wbExcel = appExcel.Workbooks.Open("c:\test.xlsx")

          'wsExcel correspond à la première feuille du fichier
          wsExcel = wbExcel.Worksheets(1)
          appExcel.Visible = False

          For i = 1 To 6
          Dim ligne = wbExcel.Sheets(1).Cells(65530, i).End(Microsoft.Office.Interop.Excel.XlDirection.xlUp).Row
          With wbExcel.Sheets(1)
          Dim NewMail = OutlookApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem)
          NewMail.Recipients.Add("jonathan.sebban@live.com") ' pour test
          NewMail.Subject = "document demandé"
          NewMail.Body = "veuiller trouver ci joint le document...."
          NewMail.Attachments.Add(.Cells(ligne, "5"))
          NewMail.Send()
          End With
          Next i

          End Sub

          End Class

          j'vais pleurer ^^

          je ne vois pas pourquoi ça ne marche pas l'erreur est toujours ici => NewMail.Attachments.Add(.Cells(ligne, "5"))
          0
          1. Contributeur
            Quand tu met le N° de la colonne IL NE FAUT PAS DE GUILLEMET c'est un nombre et pas une valeur alphanumérique
            PS : encore un peu et je t'envoi une boite de mouchoirs !! :D
            Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
            NOTE : Je ne répond pas aux MP pour les questions techniques.
            0
            1. rebonjour et encore merci,

              J ai bien besoin d'une boite je crois.

              Sans guillement, avec à l'envers etc ça ne veut pas marcher , je ne comprend pas pourquoi je ne vois pas mon erreur

              j'ai l'impression que mon visual basic déconne

              en effet pour le test j'ai mis l'adresse d'un fichier lamda NewMail.Attachments.Add("Y:\DPT-FID\test.txt") et là ça marche sauf qu'il ne m'envoit que 6 fois le fichier...

              j'imagine que le problème viens d'ci For i = 1 To 6 je pensais que le 1 to 6 voulait dire de la colonne A à F mais ça ne m'envois que 6 mails (si je change la valeur du 6 il m'anvois autant de mails que la nouvelle valeur)

              je descend chercher une boite de mouchoir ^^
              0
              1. Contributeur
                Bon, je vois que tu te mélange aussi les pinceaux avec les Next et With..
                J'ai tester la validation de cellules Excel, c'est OK dans l'exemple ci-dessous.
                Par contre je ne sais pas tester le mail j'ai pas Outlook
                    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
                
                        'app outlook 
                'Supprimer les déclarations en haut du module
                        Dim OutlookApp As New Microsoft.Office.Interop.Outlook.Application
                'Pas le bon endroit pour déclarer
                        'Dim NewMail As Microsoft.Office.Interop.Outlook.MailItem
                
                        Dim appExcel As Microsoft.Office.Interop.Excel.Application 'Application Excel 
                        Dim wbExcel As Microsoft.Office.Interop.Excel.Workbook 'Classeur Excel 
                        Dim wsExcel As Microsoft.Office.Interop.Excel.Worksheet 'Feuille Excel 
                        Dim i As Integer
                        Dim Chemin As String = "D:\Repertoire\Fichier.xlsx"
                        If Dir(Chemin) = "" Then
                            Stop
                        End If
                        'Ouverture de l'application 
                        appExcel = CreateObject("Excel.Application")
                        'Ouverture d'un fichier Excel 
                        wbExcel = appExcel.Workbooks.Open(Chemin)
                
                        'wsExcel correspond à la première feuille du fichier 
                        wsExcel = wbExcel.Worksheets(1)
                        appExcel.Visible = True
                        With wsExcel
                            Dim ligne = .Cells(65530, 1).End(Microsoft.Office.Interop.Excel.XlDirection.xlUp).Row
                            Debug.Print(ligne)
                            For i = 1 To ligne
                                Debug.Print(.Cells(i, "E").text)
                                Stop
                                Dim NewMail = OutlookApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem)
                                NewMail.Recipients.Add("jonathan.sebban@live.com") ' pour test 
                                NewMail.Subject = "document demandé"
                                NewMail.Body = "veuiller trouver ci joint le document...."
                                NewMail.Attachments.Add(.Cells(i, "E").text)
                                NewMail.Send()
                
                                NewMail = Nothing
                            Next i
                        End With
                        wbExcel.Close()
                        appExcel.Quit()
                        'OutlookApp.quit()
                
                    End Sub

                Après le stop tu regarde dans la fenêtre exécution si c'est bien le nom et chemin complet de la pièce jointe.
                Si c'est bon tu tape F5
                Après un ou deux essais stop le programme et enlève le stop et les débug.print
                Note, pour la cellule fallait juste ajouter le contenu en l'occurrence.. texte.
                Si c'était des nombres y faudrait mettre value.
                La syntaxe avec la lettre fonctionne, c'est plus facile que de chaque fois rechercher le N° de la colonne.
                La syntaxe d'Excel avec VB.Net est plus stricte que dans Excel.
                A+
                0
                1. Merci à vous

                  ça à marché une fois (mais il à fallu que je sépare l'adresse du fichier joint sur 2 variable car cela depassait les 255 chararcteres)

                  et pouf erreur sur NewMail.Recipients.Add("jonathan.sebban@live.com") => Opération abandonnée (Exception de HRESULT : 0x80004004 (E_ABORT))

                  j'abandonne pour today

                  j'ai bien compris mes erreur mais là haaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

                  je reprend demain matin ^^

                  Bonne soirée à vous et merci beaucoup
                  0
                  1. Bonjour,

                    Non non pas de compte gmail mais allez savoir ce qui se passe

                    je vais chercher un peu et lire votre lien qd mm

                    je reviendrais surement (en tt cas quoi qu'il arrive pour mettre la solution finale)

                    merci de votre aide je vais essayer de le finir pour lundi

                    Bon week end à vous
                    0
                    1. Re,

                      en trifouillantn un peu j'ai trouvé une solution qui marche

                      c'est pas très éléguant certe :

                      cela consiste mettre en dur l'addresse su dossier dans lequel le excel se trouve puis de récupérer sur une variable le nom du fichier et ensuite de mettre les variables...

                      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

                      'app outlook
                      'Supprimer les déclarations en haut du module
                      Dim OutlookApp As New Microsoft.Office.Interop.Outlook.Application
                      'Pas le bon endroit pour déclarer
                      'Dim NewMail As Microsoft.Office.Interop.Outlook.MailItem

                      Dim appExcel As Microsoft.Office.Interop.Excel.Application 'Application Excel
                      Dim wbExcel As Microsoft.Office.Interop.Excel.Workbook 'Classeur Excel
                      Dim wsExcel As Microsoft.Office.Interop.Excel.Worksheet 'Feuille Excel
                      Dim i As Integer
                      Dim Chemin As String = "C:\Envois mkg fund.xlsx"
                      If Dir(Chemin) = "" Then

                      End If
                      'Ouverture de l'application
                      appExcel = CreateObject("Excel.Application")
                      'Ouverture d'un fichier Excel
                      wbExcel = appExcel.Workbooks.Open(Chemin)

                      'wsExcel correspond à la première feuille du fichier
                      wsExcel = wbExcel.Worksheets("settings")
                      appExcel.Visible = False
                      Dim r
                      Dim u = "\\test\dossierdetes\"

                      With wsExcel
                      Dim ligne = .Cells(65530, 1).End(Microsoft.Office.Interop.Excel.XlDirection.xlUp).Row

                      For i = 1 To ligne

                      Dim NewMail = OutlookApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem)

                      r = (.Cells(i, "F").text)
                      NewMail.Recipients.Add("j.pub@live.com") ' pour test
                      NewMail.Subject = "document demandé"
                      NewMail.Body = "veuiller trouver ci joint le document...."
                      TextBox1.Text = u & r
                      NewMail.Attachments.Add(u & r)
                      NewMail.Send()
                      NewMail = Nothing
                      Next i
                      End With
                      wbExcel.Close()
                      appExcel.Quit()
                      'OutlookApp.quit()

                      End Sub

                      End Class

                      voila merci beaucoup pour toute l'aide apportée
                      0