Microsoft 365 envoie par mail en fonction Combobox

jeromeN95

XLDnaute Impliqué
Bonsoir,
j'aimerai envoyer par mail 1 ou plusieurs (jusqu'à 5) feuilles (30 onglets) en fonction d'un choix de ComboBox.
J'ai crée un tableau de correspondance.
J'arrive à alimenter les 5 Combobox

J'arrive à envoyer par mail.

Je n'arrive pas à modifier ce code pour lui faire comprendre d'envoyer seulement les onglets (feuilles) sélectionner dans les combobox (de 1 à 5).

VB:
Option Explicit

Public Sub env_Proto() 'Envoie le ou les protocoles par mail
Dim omg As Object
Dim msg As String
Dim tcl As Long
Dim fic As String
    On Error GoTo fin

    Sheets("ComboBoxi").Visible = True 'affiche l'onglet en fonction de la selection  car caché à l'ouverture du fichier
    fic = ThisWorkbook.Path & "\Protocole d'utilisation des produits.pdf"      'nom voulu pour le correspondant
  
    If Dir(fic) <> "" Then Kill fic    'on crée le fichier PDF dans le même dossier que le fichier source
    Sheets("ComboBoxi").ExportAsFixedFormat Type:=xlTypePDF, Filename:=fic _
                , Quality:=xlQualityStandard, IncludeDocProperties:=True, _
                IgnorePrintAreas:=False, OpenAfterPublish:=False
    Set omg = CreateObject("CDO.Message")
    With omg
        .Subject = "Protocole d'utilisation des produits"        'sujet
        .From = "jer@fournisseur.fr"      ' adresse mail de l'expéditeur
        .To = [A25].Value              ' Email du destinataire
       ' .CC = [A5].Value                 'vendeur en copie
        .TextBody = "Bonjour, veuillez trouver ci-joint le(s) protocole(s) d'utilisation de nos produits. Bien à vous, La Sociétée"
        With .Configuration.Fields
            .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
            .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.orange.fr"
            .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
            .Update
        End With
        .AddAttachment (fic)
        .Send
    End With
    Kill fic    'après l'envoi la feuille PDF est supprimée
      
      
        Sheets("ComboBoxi").Visible = False 're-masque l'onglet

fin:       ' si erreur on sort de la procédure : description de l'erreur survenue
If Err.Number <> 0 Then MsgBox "Anomalie détectée" & vbLf & vbLf & Err.Description

   Unload Protocole 'ferme l'Userform de séléction des protocoles

End Sub
 

Pièces jointes

  • Combobox choix.xlsm
    104.2 KB · Affichages: 9

Dranreb

XLDnaute Barbatruc
Faites en sorte que l'UserForm transmette en paramètre à la procédure un tableau des objets Worksheet à traiter. Exactement comme je j'ai indiqué indiqué au #12
Et dedans vous faites la boucle For N = 1 To UBound(TWsh)
Jusqu'au Next N, TWsh(N) y sera très exactement une expression Worksheet que vous pourrez utiliser en tant que tel, notamment dans une instruction TWsh(N).ExportAsFixedFormat par exemple.
Mais je ne pourrai pas vous aider davantage. Je ne connais pas suffisamment cette opération, et si notamment vous vouliez envoyer plusieurs pdf dans un même mail, je ne saurais pas vous dire comment faire.
Mais je suppose que vous devriez constituer un second tableau des noms des fichiers PDF fabriqués, de même dimension que le TWsh, et boucler avec une For N = 1 To UBound(TNomsPDF): .AddAttachment TNomsPDF(N): Next N
 
Dernière édition:

jeromeN95

XLDnaute Impliqué
D’accord, merci beaucoup.
Mais justement j’ai fait un copier coller de votre code.
Je n’arrive pas non plus à faire de boucle, alors, tant pis pour la façon d’écrire mais je ferai cinq fois le même bout de code.
Comment indiquer dans chaque bout de code « envoyer la feuille » de chaque combobox ?
 

Dranreb

XLDnaute Barbatruc
Mais vous ne vous en occupez plus: c'est la Sub CommandButton1_Click() de l'UserForm qui construit le tableau TWSh qu'elle va transmettre à la procédure.
Comment ça vous n'arrivez pas à faire de boucle ? Ce n'est quand même pas difficile d'écrire For N = 1 To UBound(TWsh) devant un groupe d'instruction à terminer par Next N !
Joignez ce que vous avez essayé, que je vois ce qui manque.
Si vous savez comment il vous faudrait l'écrire en 5 bout de code, vous devriez du même coup savoir comment l'écrire avec une boucle. Moi je ne sais pas comment l'écrire ni d'une façon ni de l'autre. À moins que ma dernière suggestion en édition du poste #16 soit la bonne. Mais alors s'il faut pouvoir attacher 5 PDF il faudra leur donner des noms différents.
Et il faudra trois boucles: une pour les créer, une au mileu de tout votre code avec le CDO.Message omg pour les mettre en attachement, et enfin une dernière pour les supprimer.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Remarque: s'il faut absolument leur donner le même nom, vous pourriez à la rigueur les créer dans des dossiers temporaires différents. Où en êtes vous ? Ça devrait être résolu depuis longtemps si vous y mettiez de la bonne volonté (ne serait ce qu'en me demandant des précisions sur la façon générale dont fonctionne une boucle For … Next, ou d'autres formes aussi) !
L'inconnu familier de certains doit s'affronter, non se fuir. (elle est de moi, celle là, si si !)
 
Dernière édition:

jeromeN95

XLDnaute Impliqué
Alors !
Depuis ce matin j’y réfléchi, je rentre chez moi dans deux heures, je vais faire des essais, les tests, je vais bidouiller, rechercher sur Google…
C’est vrai que je ne suis pas doué, je n’ai certes pas beaucoup de connaissances, joue-moi la vérité j’ai consacré beaucoup de temps.
Donner le même nom, oui, justement, j’avais pensé :
Utiliser la fonction enregistrement, en format PDF, plusieurs feuilles imprimer en un seul fichier temporaire.
Donc en fait il n’y aurait qu’un seul nom.
 

Dranreb

XLDnaute Barbatruc
Ça je ne sais pas le faire à priori.
En examinant un peu l'explorateur d'objets, j'ai constaté que les types d'objets pourvus de la méthode ExportAsFixedFormat sont Chart, Range, Workbook et Worksheet, mais pas Worksheets qui serait une collection d'objets Worksheet qu'on pourrait à la rigueur constituer. J'en déduis provisoirement que le mieux serait de verser les feuilles dans un nouveau classeur et de lui appliquer cette méthode. Veuillez faire des essais manuellement pour voir si on obtiendrait bien comme ça le résultat souhaité.
 

Dranreb

XLDnaute Barbatruc
C'est curieux que les propriétés Sheets et Worksheets ne sont pas équipées de la méthode ExportAsFixedFormat, alors qu'elles sont équipées de la méthode PrintPreview.
Non mais même sans enregistrer de macro, si vous copiez deux ou trois feuilles dans un nouveau classeur et l'exportee en PDF, est-ce que ça donne bien le résultat souhaité ?
Si tel est le cas vous pourriez tenter ça :
VB:
Public Sub EnvoiProto(TWsh() As Worksheet) 'Envoie le ou les protocoles par mail
   Dim Wbk As Workbook, N As Long, Fic As String, omg As Object
   Set Wbk = Workbooks.Add
   For N = 1 To UBound(TWsh): TWsh(N).Copy Before:=Wbk.Worksheets(N): Next N
   Wbk.Worksheets(N).Delete
   Fic = ThisWorkbook.Path & "\Protocole d'utilisation des produits.pdf"      'nom voulu pour le correspondant
   If Dir(Fic) <> "" Then Kill Fic    'on crée le fichier PDF dans le même dossier que le fichier source
   On Error GoTo Fin
   Wbk.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Fic, Quality:=xlQualityStandard, _
      IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
   Wbk.Close SaveChanges:=False
Et le reste à peu près pareil à partir de Set omg = CreateObject("CDO.Message")
 

Dranreb

XLDnaute Barbatruc
Je n'ai aucune idée de ce qui ne va pas. Déjà je ne connais pas cet objet CDO.Message, et encore moins comment il fonctionne. Moi par principe je ne travaille qu'avec des objet de bibliothèques explicitement typés, en liaisons anticipées, ne serait-ce que pour avoir une assistance à l'utilisation de ses méthodes. Et là je ne sais pas quelle est la référence de cette bibliothèque.
Mais qu'est ce que ça veut dire 'presque' ? Le PDF est-il créé, ou non ?
 

Dranreb

XLDnaute Barbatruc
Ah mais je viens de trouver quand même assez rapidement la référence :
Microsoft CDO for Windows 2000 Library
Correspond à un fichier C:\Windows\SysWOW64\cdosys.dll
Elle est chargée en tant que bibliothèque CDO, définit effectivement un objet Message muni de plus d'une trentaine de membres, dont une méthode AddAttachment.
Mais ça explique encore moins pourquoi ça ne marche pas aussi en liaisons tardives…
 

Dranreb

XLDnaute Barbatruc
Le PDF créé à partir du nouveau classeur muni des feuilles copiées ne les contient-il pas toutes ?
Ça m'étonne quand même parce que la méthode porte des argument facultatif From et To assumé de la 1ère page à la dernière page, mais si ça ne parle que des pages de la première feuille seulement, ou de la feuille active dans le classeur, ce n'est pas ce qu'on veut, évidemment.
Si la mise en page est à peu près la même pour toutes les feuilles on pourrait à la rigueur mettre dans une seule feuille, toutes les lignes des feuilles concernées, même avec un saut de page entre chaque, si vous voulez.
 

Dranreb

XLDnaute Barbatruc
Ne pourriez vous d'ailleurs pas mettre tous vos documents dans une seule feuille, avec possibilité de masquer celle qui ne sont pas pertinentes, soit par un plan soit en couvrant les différentes parties par des noms dans le classeur ?
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 941
Membres
101 847
dernier inscrit
Djigbenou