VBA envoi de mail (la méthode select de la classe range a échoué)

anbar

XLDnaute Junior
Bonjour à toutes et à tous
Tout d'abord je tiens à vous remercier pour votre aide à chaque fois que je vous sollicite.'ai cherché dans la toile comment pouvoir envoyer une feuille par mail incorporée dans cet mail. J'ai trouvé un code qui est le suivant:
Sub envoi_mail()

Dim Mafeuille As Worksheet
Dim NbLigne As Integer
Set Mafeuille = ThisWorkbook.Sheets("Feuil1")
Application.ScreenUpdating = False
NbLigne = Mafeuille.Range("A" & Application.Rows.Count).End(xlUp).Row

Mafeuille.Range("A1:J" & NbLigne).Select


With Selection.Parent.MailEnvelope.Item
.to = Mafeuille.Range("M2").Value
.Subject = Mafeuille.Range("L2").Value
.send
End With
Range("A4:J52").Select
Selection.ClearContents
MsgBox "votre mail a été envoyé", vbInformation + vbOKOnly, "confirmation d'envoi"
ActiveWorkbook.EnvelopeVisible = True
End Sub


Sauf que le problème est que quand je lance le fichier et que je clique sur le bouton pour la 1ére fois j'obtiens un beug au niveau de:

Mafeuille.Range("A1:J" & NbLigne).Select


avec le message suivant
(la méthode select de la classe Range a échoué )
j'ai du chercher sur les forums mais sans résultat.
Merci

ci-joint le fichier exemple
 

Pièces jointes

  • Classeur1.xlsm
    21.4 KB · Affichages: 37

zebanx

XLDnaute Accro
Bonjour Anbar, Harry226h, le forum.

Je ne sais pas repartir de votre code mais en cherchant, la solution pour attacher un range dans un mail outlook n'est pas si simple.

Ci-joint un essai avec un code fournit par Ron De Bruin sur internet qui fonctionne avec l'aide d'une fonction ( (RANGEtoHtml) dont la complexité ne vous échappera pas.

Quelques remarques :
1. On peut rajouter dans ce code des cc / ccc
2. Vous pouvez modifier le corps du texte qui accompagne le range du tableau directement dans le code
3. On utilise des balises "<br"> plutôt que VbCrLf qui sont habituellement utilisées dans un code VBA pour les sauts de ligne
4. Il y a une date / heure qui apparait sur la dernière colonne mais vous pouvez supprimer la ligne sur le code directement si cela vous est inutile
5. L'affichage est systématique dans outlook avant envoi. C'est du semi-automatique.

xl-ment
zebanx

VB:
Sub mailto()
Dim rng As Range
With Sheets("Feuil1")
    dl = .Cells(Rows.Count, 2).End(xlUp).Row
    Set ol = CreateObject("outlook.application")
  
    Set rng = Nothing
    On Error Resume Next
    Set rng = ActiveSheet.Range("A1:J" & dl)
    On Error GoTo 0
        Set ml = ol.createitem(0)
        ml.To = .Cells(2, 13)
        ml.Subject = .Cells(2, 12)
        ml.CC = .Cells(2, 14)
        ml.BCC = .Cells(2, 15)
        ml.HTMLBody = "Bonjour," & "<br>" & "<br>" & "Veuillez trouvez ci-joint le tableau récapitulatif de votre commande" & "<br>" & _
        RangetoHTML(rng) & "<br>" & "<br>" & "Meilleures salutations"
        ml.Display 'afficher le mail
        Cells(2, 16) = Now
End With
End Sub
 

Pièces jointes

  • envoi_outlook_ED.xlsm
    28.6 KB · Affichages: 71

anbar

XLDnaute Junior
Bonjour Anbar, Harry226h, le forum.

Je ne sais pas repartir de votre code mais en cherchant, la solution pour attacher un range dans un mail outlook n'est pas si simple.

Ci-joint un essai avec un code fournit par Ron De Bruin sur internet qui fonctionne avec l'aide d'une fonction ( (RANGEtoHtml) dont la complexité ne vous échappera pas.

Quelques remarques :
1. On peut rajouter dans ce code des cc / ccc
2. Vous pouvez modifier le corps du texte qui accompagne le range du tableau directement dans le code
3. On utilise des balises "<br"> plutôt que VbCrLf qui sont habituellement utilisées dans un code VBA pour les sauts de ligne
4. Il y a une date / heure qui apparait sur la dernière colonne mais vous pouvez supprimer la ligne sur le code directement si cela vous est inutile
5. L'affichage est systématique dans outlook avant envoi. C'est du semi-automatique.

xl-ment
zebanx

VB:
Sub mailto()
Dim rng As Range
With Sheets("Feuil1")
    dl = .Cells(Rows.Count, 2).End(xlUp).Row
    Set ol = CreateObject("outlook.application")
 
    Set rng = Nothing
    On Error Resume Next
    Set rng = ActiveSheet.Range("A1:J" & dl)
    On Error GoTo 0
        Set ml = ol.createitem(0)
        ml.To = .Cells(2, 13)
        ml.Subject = .Cells(2, 12)
        ml.CC = .Cells(2, 14)
        ml.BCC = .Cells(2, 15)
        ml.HTMLBody = "Bonjour," & "<br>" & "<br>" & "Veuillez trouvez ci-joint le tableau récapitulatif de votre commande" & "<br>" & _
        RangetoHTML(rng) & "<br>" & "<br>" & "Meilleures salutations"
        ml.Display 'afficher le mail
        Cells(2, 16) = Now
End With
End Sub

Bonsoir Harry226h
Le code semble marche à merveille, il faut que je le teste au boulot. Et en effet la complexité ne m'a pas échappée.
J'ai essayé avec l'instruction( ml.Sen et ça a l'air de fonctionner.

Encore une Merci de ta précieuse aide et du temps que tu as consacré au sujet.
 

anbar

XLDnaute Junior
Bonjour Harry226h
Alors j'ai réussi à detourner le beug engendré par la méthode SELECT , tout simplement sans utiliser (SELECT)
j'ai déclaré l'objet Plage

Mafeuille.Range("A1:J" & NbLigne).Select (remplacée par) Set Plage = Range("A1:J" & NbLigne)
Range("A4:J52").Select et (remplacées par) Range("A4:J34" & NbLigne).ClearContents
Selection.ClearContents
alors depuis je n'ai plus de Bug Sauf que je pense qu'au premier envoi le champs de destinataires dans outlook reste vide et que le code ne les charge pas, on ne voit apparaitre les adresses mail des destinataires qu'àprès une deuxième exécution du code.
Merci de jeter un coup d’œil et voir si tu peux détecter quelque chose.
bonne journée



cde avant:
Sub envoi_mail()

Dim Mafeuille As Worksheet
Dim NbLigne As Integer
Set Mafeuille = ThisWorkbook.Sheets("Feuil1")
Application.ScreenUpdating = False
NbLigne = Mafeuille.Range("A" & Application.Rows.Count).End(xlUp).Row

Mafeuille.Range("A1:J" & NbLigne).Select

With Selection.Parent.MailEnvelope.Item
.to = Mafeuille.Range("M2").Value
.Subject = Mafeuille.Range("L2").Value
.send
End With
Range("A4:J52").Select
Selection.ClearContents
MsgBox "votre mail a été envoyé", vbInformation + vbOKOnly, "confirmation d'envoi"
ActiveWorkbook.EnvelopeVisible = True
End Sub

code après
Sub envoyermail()
Dim Mafeuille As Worksheet
Dim NbLigne As Long
Dim Plage As Range
ActiveWorkbook.EnvelopeVisible = True
Set Mafeuille = ThisWorkbook.Sheets("Feuil1")
Application.ScreenUpdating = False
NbLigne = 3267
NbLigne = Mafeuille.Range("A" & Application.Rows.Count).End(xlUp).Row
Set Plage = Range("A1:J" & NbLigne)
With Range("A1:J" & NbLigne).Parent.MailEnvelope.Item
.To = Mafeuille.Range("M1").Value & Mafeuille.Range("M2").Value
.Subject = Mafeuille.Range("L2").Value
.Display
.send
End With
MsgBox "votre mail a été envoyé", vbInformation + vbOKOnly, "confirmation d'envoi"
Range("A4:J34" & NbLigne).ClearContents
Application.ScreenUpdating = True
End Sub
 

Pièces jointes

  • Classeur1.xlsm
    23.5 KB · Affichages: 29

tmeg57

XLDnaute Nouveau
Bonjour Anbar, Harry226h, le forum.

Je ne sais pas repartir de votre code mais en cherchant, la solution pour attacher un range dans un mail outlook n'est pas si simple.

Ci-joint un essai avec un code fournit par Ron De Bruin sur internet qui fonctionne avec l'aide d'une fonction ( (RANGEtoHtml) dont la complexité ne vous échappera pas.

Quelques remarques :
1. On peut rajouter dans ce code des cc / ccc
2. Vous pouvez modifier le corps du texte qui accompagne le range du tableau directement dans le code
3. On utilise des balises "<br"> plutôt que VbCrLf qui sont habituellement utilisées dans un code VBA pour les sauts de ligne
4. Il y a une date / heure qui apparait sur la dernière colonne mais vous pouvez supprimer la ligne sur le code directement si cela vous est inutile
5. L'affichage est systématique dans outlook avant envoi. C'est du semi-automatique.

xl-ment
zebanx

VB:
Sub mailto()
Dim rng As Range
With Sheets("Feuil1")
    dl = .Cells(Rows.Count, 2).End(xlUp).Row
    Set ol = CreateObject("outlook.application")
 
    Set rng = Nothing
    On Error Resume Next
    Set rng = ActiveSheet.Range("A1:J" & dl)
    On Error GoTo 0
        Set ml = ol.createitem(0)
        ml.To = .Cells(2, 13)
        ml.Subject = .Cells(2, 12)
        ml.CC = .Cells(2, 14)
        ml.BCC = .Cells(2, 15)
        ml.HTMLBody = "Bonjour," & "<br>" & "<br>" & "Veuillez trouvez ci-joint le tableau récapitulatif de votre commande" & "<br>" & _
        RangetoHTML(rng) & "<br>" & "<br>" & "Meilleures salutations"
        ml.Display 'afficher le mail
        Cells(2, 16) = Now
End With
End Sub
Merci beaucoup, la fonction rangeToHtml est juste magique pour ce cas.
 

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 900
Membres
101 834
dernier inscrit
Jeremy06510