Microsoft 365 Envoi plage dans corps d'un mail

eric72

XLDnaute Accro
Bonjour,
Je tente d'envoyer une plage de cellule qui s'affiche dans le corps du mail avec ce code:
Sub envoiPlageCellules_Excel()
ActiveSheet.Range("A1:k10").Select ' la plage de cellules à envoyer
'ActiveWorkbook.EnvelopeVisible = True

With ActiveSheet.MailEnvelope
.Introduction = "essai envoi"
.Item.To = "...........@sfr.fr"
.Item.Subject = Range("s2")
.Item.Send
End With
Range("A1").Select
End Sub

Le résultat est que : ca ferme le fichier excel et ca l'ouvre à nouveau, de plus
ca me bloque outlook qui me dit qu'un autre programme utilise outlook
Je ne comprend pas trop le pourquoi mais je suis sur que vous avez une idée de la raison

Merci beaucoup
Eric
 

dysorthographie

XLDnaute Accro
Bonjour,
VB:
Sub Test()
Mail "Sujet", RangetoHTML(Range("A1:F10")), "Destinataire@gmail.com"
End Sub
Function RangetoHTML(ByVal rng As Range)
' Changed by Ron de Bruin 28-Oct-2006
' Working in Office 2000-2016
'https://www.rondebruin.nl/win/s1/outlook/bmail2.htm
    Dim fso As Object
    Dim ts As Object
    Dim TempFile As String
    Dim TempWB As Workbook
 
    TempFile = Environ$("temp") & "\" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"
    rng.Copy
    Set TempWB = Workbooks.Add(1)
    With TempWB.Sheets(1)
 
        .Cells(1).PasteSpecial Paste:=12
        .Cells(1).PasteSpecial Paste:=-4122
        .Cells(1).Select
        Application.CutCopyMode = False
        On Error Resume Next
        .DrawingObjects.Visible = True
        .DrawingObjects.Delete
        .Columns.AutoFit
        On Error GoTo 0
    End With
 
 
    With TempWB.PublishObjects.Add( _
         SourceType:=xlSourceRange, _
         Filename:=TempFile, _
         Sheet:=TempWB.Sheets(1).Name, _
         Source:=TempWB.Sheets(1).UsedRange.Address, _
         HtmlType:=xlHtmlStatic)
        .Publish (True)
    End With
 
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
    RangetoHTML = ts.ReadAll
    ts.Close
    RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
                          "align=left x:publishsource=")
 
    TempWB.Close savechanges:=False
 
 
    Kill TempFile
 
    Set ts = Nothing
    Set fso = Nothing
    Set TempWB = Nothing
 
End Function

Sub Mail(Sujet As String, Message As String, Destinataire As String, Optional DestinataireCopy As String, Optional DestinataireCopyCacher As String, Optional Pj As String = "")
Set objOutlook = CreateObject("Outlook.application")
Set MailObj = objOutlook.CreateItem(olMailItem)
With MailObj
    .To = Destinataire
    .CC = DestinataireCopy
    .BCC = DestinataireCopyCacher
    .Subject = Sujet
    .BodyFormat = 2
    .HTMLBody = Message
    If Trim("" & Pj) <> "" Then
        p = Split(Pj & ";", ";")
        For i = 0 To UBound(p)
            If Trim("" & p(i)) <> "" Then .Attachments.Add Trim("" & p(i))
        Next
    End If
    '.Display 'Can be .Send but prompts for user intervention before sending without 3rd party software like ClickYes
    .Send
End With
End Sub
 

dysorthographie

XLDnaute Accro
Code:
Sub Mail(Sujet As String, Message As String, Destinataire As String, Optional DestinataireCopy As String, Optional DestinataireCopyCacher As String, Optional Pj As String = "")
Déjà nous avons deux fonction générique Sub Mail qui permet d'envoyer des mails via Outlook. On y retrouve le sujet du mail , le contenu du message, le destinataire et un certain nombre de paramètres optionnels comme le destinataire en copie, un tableau de pièces jointes avec séparateur ; comme un CSV!

Les messages envoyés par cette méthode sont au format HTML ce qui permet l'insertion de tableaux HTML.

La fonction RangetoHTML permet de convertir une plage de cellules en tableau HTML.

Je ne détaillerai pas ces deux méthodes génériques qui non en aucun cas à subir d'adaptation à ton projet, il suffit de les utiliser en l'état.

Seul Sub test doit subir un adaptation à ton projet.
Code:
Message="Vous trouverez<br>" & RangetoHTML( ActiveSheet.Range("A1:k10"))
Mail Range("s2"),Message,"...........@sfr.fr"
Mail Range("s2"),Message,"...........@sfr.fr",PJ:="fichier1;fichier2"
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bonsoir a tous

bonsoir Robert
pour ceux qui ont windows Xp à W10 et n'ont pas supprimé IE(internet explorer)
ca fonctionne encore très bien aujourd'hui
résultat instantané

VB:
'*********************************************
'Fonction range to htmlcode  Table avec style inline
'part of CDO pack wysiwyg version:(year 2012)
'by patricktoulon sur devellopez.com
'05/03/204
'*********************************************
Sub test()
    Debug.Print RangetoHTMLCode(Range("A1:F10"))
End Sub
Function RangetoHTMLCode(ByVal rng As Range) As String
    rng.Copy
    On Error GoTo bye
    With CreateObject("internetexplorer.application")
        .navigate "about:blank"
        Do: DoEvents: Loop While .readystate < 4
        .document.write "<html><body><Div id=""content"" contenteditable=""true""></div></body></html>"
        .document.getelementbyid("content").Focus
        .ExecWB 13, 2
        '.Visible = True'pas besoins que la fenetre IE on paste avec execWeb
        RangetoHTMLCode = .document.getelementbyid("content").innerhtml
bye:
        .Quit
    End With
End Function

le code peut être intégré dans un autre code html
le style est inline
toute les appliS mail supportent le style inline par contre certaines ne supportent pas ou interprètent mal le computedstyle ;)
 

Olic78124

XLDnaute Nouveau
Bonjour,

Je reviens sur ce sujet encore tout frais car je souhaite effectuer le même genre d'action avec des plages qui ne sont pas forcément contiguës -> Range("A30:AA32,AU30:AV32") par exemple

Je reçois bien ce Range dans Sub Email_Range (..., Plage as String,...), j'aurais tendance à dire que le RangetoHTML(rng) se passe bien puisque lorsque j'ai une plage simple du style "A30:AA32" le rng.copy fonctionne impeccablement alors que pour une sélection multiple il ne se fait pas et je quitte la fonction RangeToHTML. J'ai l'impression que c'est le Union(Rng1, Rng2) qui ne se fait pas ou se passe mal mais je n'arrive pas à comprendre pourquoi.

Précision je suis sous Excel2016 mais je ne pense pas que ça change grand-chose.

D'avance merci et bonne journée.

Olivier

VB:
Sub Email_Range(Destinataire As String, Sujet As String, Message As String, Plage As String, Optional DestinataireCopie As String, Optional DestinataireCopieCache As String, Optional ImportanceMessage As Integer, Optional lien_piece_jointe As String)

    Dim rng As Range, Rng1 As Range, Rng2 As Range
    Dim OutApp As Object
    Dim OutMail As Object

    Set rng = Nothing
    On Error Resume Next
    'range à envoyer
    If ThisWorkbook.Sheets("Formulaire").Range("AU32").Value = "" Or InStr(Plage, "AX") <> 0 Then
        Set rng = ThisWorkbook.Sheets("Formulaire").Range(Plage).SpecialCells(xlCellTypeVisible)
    Else
    ' On traite la première partie du Range
        Set Rng1 = ThisWorkbook.Sheets("Formulaire").Range(Left(Plage, InStr(Plage, ",AU") - 1)).SpecialCells(xlCellTypeVisible)
    ' On traite la première partie du Range
        Set Rng2 = ThisWorkbook.Sheets("Formulaire").Range(Right(Plage, Len(Plage) - InStr(Plage, ",AU"))).SpecialCells(xlCellTypeVisible)
        Set rng = Application.Union(Rng1, Rng2)
    End If
    On Error GoTo 0

    If rng Is Nothing Then
        MsgBox "L'objet que vous voulez envoyé n'est pas du type range ou alors la feuille excel est protégée" & _
               vbNewLine & "Message non envoyé. Ré-essayer svp.", vbOKOnly
        Exit Sub
    End If

    With Application
        .EnableEvents = False
        .ScreenUpdating = False
    End With

    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(0)

    On Error Resume Next
    With OutMail
        .To = Destinataire
        .CC = DestinataireCopie
        .BCC = DestinataireCopieCache
        .Subject = Sujet
        .Importance = ImportanceMessage '1:Priorité normale(valeur par défaut)/ 2: priorite haute/ 0 et autres valeurs: faible/
        .HTMLBody = Message & RangetoHTML(rng)
        .Attachments.Add lien_piece_jointe
        .Send
    End With
    On Error GoTo 0

    With Application
        .EnableEvents = True
        .ScreenUpdating = True
    End With

    Set OutMail = Nothing
    Set OutApp = Nothing
'------------------------------------------------------------------------------------------------------------------------------------

End Sub

Function RangetoHTML(rng As Range)

    Dim fso As Object
    Dim ts As Object
    Dim TempFile As String
    Dim TempWB As Workbook
  
    TempFile = Environ$("temp") & "/" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"

    ' Copie des cellules et création d'un nouveau Workbook pour coller les données
    rng.copy
    ' Sortie de la Function sans autre préavis
    ' Sortie de la Function sans autre préavis
  
       Set TempWB = Workbooks.Add(1)
       With TempWB.Sheets(1)
           .Cells(1).PasteSpecial Paste:=8
           .Cells(1).PasteSpecial xlPasteValues, , False, False
           .Cells(1).PasteSpecial xlPasteFormats, , False, False
           .Cells(1).Select
           Application.CutCopyMode = False
           On Error Resume Next
           .DrawingObjects.Visible = True
           .DrawingObjects.Delete
           On Error GoTo 0
       End With
    
       'Publie la feuille au fichier htm
       With TempWB.PublishObjects.Add( _
            SourceType:=xlSourceRange, _
            Filename:=TempFile, _
            Sheet:=TempWB.Sheets(1).Name, _
            Source:=TempWB.Sheets(1).UsedRange.Address, _
            HtmlType:=xlHtmlStatic)
           .Publish (True)
       End With

    'Lecture de toutes les données de htm dans RangetoHIML
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
    RangetoHTML = ts.ReadAll
    ts.Close
    RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
                          "align=left x:publishsource=")
 
    'fermeture de TempWB
    TempWB.Close Savechanges:=False
 
    'supprime le fichier htm crée
    Kill TempFile
 
    Set ts = Nothing
    Set fso = Nothing
    Set TempWB = Nothing
    
End Function
 
Dernière édition:

Olic78124

XLDnaute Nouveau
Bonsoir dysorthographie,

Je n'ai strictement rien modifié hormis au début pour essayer de fusionner 2 range.

Le code est brut de fonderie, tel que je l'ai eu en récupérant la gestion du fichier (qui soit dit en passant à été modifié/bidouillé par plusieurs personnes avant moi). Il fonctionne néanmoins très bien avec un range simple. Mais s'il y a des voies d'amélioration je suis preneur.
 

dysorthographie

XLDnaute Accro
je te remet le code et je te confirme le copy sur une union ne marche pas, envisage de copier en deux fois!

VB:
Enum ImportanceMessage
    Normale = 1
    Haute = 2
    Faible = 0
End Enum
      
Sub Test()
Mail "Sujet", RangetoHTML(Range("A1:F10")), "Destinataire@gmail.com", Importance:=ImportanceMessage.Normale
End Sub
Function RangetoHTML(ByVal rng As Range)
' Changed by Ron de Bruin 28-Oct-2006
' Working in Office 2000-2016
'https://www.rondebruin.nl/win/s1/outlook/bmail2.htm
    Dim fso As Object
    Dim ts As Object
    Dim TempFile As String
    Dim TempWB As Workbook
 
    TempFile = Environ$("temp") & "\" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"
    rng.Copy
    Set TempWB = Workbooks.Add(1)
    With TempWB.Sheets(1)
 
        .Cells(1).PasteSpecial Paste:=12
        .Cells(1).PasteSpecial Paste:=-4122
        .Cells(1).Select
        Application.CutCopyMode = False
        On Error Resume Next
        .DrawingObjects.Visible = True
        .DrawingObjects.Delete
        .Columns.AutoFit
        On Error GoTo 0
    End With
 
 
    With TempWB.PublishObjects.Add( _
         SourceType:=xlSourceRange, _
         Filename:=TempFile, _
         Sheet:=TempWB.Sheets(1).Name, _
         Source:=TempWB.Sheets(1).UsedRange.Address, _
         HtmlType:=xlHtmlStatic)
        .Publish (True)
    End With
 
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
    RangetoHTML = ts.ReadAll
    ts.Close
    RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
                          "align=left x:publishsource=")
 
    TempWB.Close savechanges:=False
 
 
    Kill TempFile
 
    Set ts = Nothing
    Set fso = Nothing
    Set TempWB = Nothing
 
End Function

Sub Mail(Sujet As String, Message As String, Destinataire As String, Optional DestinataireCopy As String, Optional DestinataireCopyCacher As String, Optional Pj As String = "", Optional Importance As ImportanceMessage = ImportanceMessage.Normale)
Set objOutlook = CreateObject("Outlook.application")
Set MailObj = objOutlook.CreateItem(olMailItem)
With MailObj
    .To = Destinataire
    .CC = DestinataireCopy
    .BCC = DestinataireCopyCacher
    .Subject = Sujet
    .BodyFormat = 2
    .HTMLBody = Message
    If Trim("" & Pj) <> "" Then
        p = Split(Pj & ";", ";")
        For i = 0 To UBound(p)
            If Trim("" & p(i)) <> "" Then .Attachments.Add Trim("" & p(i))
        Next
    End If
    '.Display 'Can be .Send but prompts for user intervention before sending without 3rd party software like ClickYes
    .Send
End With
End Sub
 

Olic78124

XLDnaute Nouveau
je te remet le code et je te confirme le copy sur une union ne marche pas, envisage de copier en deux fois!
Bonjour dysorthographie, le forum,

C'est la réponse que je n'avais surtout pas envie de lire en fait mais bon... je vais essayer de changer mon fusil d'épaule et d'adapter ton code en copiant mes données en 2 fois.

J'ai une question au sujet de ce code, quand tu écris

Set TempWB = Workbooks.Add(1)
With TempWB.Sheets(1)

.Cells(1).PasteSpecial Paste:=12
et ainsi de suite...

que signifie exactement le 1 entre parenthèses car j'ai beau chercher à droite à gauche mais je n'arrive pas à comprendre ce qu'il vient faire là :(... ça ferait quoi par exemple si je mettais un autre chiffre ?

D'avance merci et bonne journée.

Olivier
 

Discussions similaires

Réponses
2
Affichages
114

Statistiques des forums

Discussions
312 207
Messages
2 086 237
Membres
103 162
dernier inscrit
fcfg