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: 6

Dranreb

XLDnaute Barbatruc
Bonsoir.
Oui, c'est sûr il faudrait complètement changer le système, par exemple au lieu de numéros portés en colonne F de la feuille RèglesProto à convertir en textes pour former des noms de feuilles, reproduire des noms du classeur ayant pour références les lignes à démasquer.
Le démasquage pourrait se faire dans l'UserForm. Il commencerait par masquer tout puis démasquerait les différentes plages nommées à retenir.
 

Dranreb

XLDnaute Barbatruc
C'est une commande "Appareil photo" qui permet de le faire. je ne l'avais pas, j'ai dû l'ajouter en personnalisant le ruban. Mais ça marche aussi en insérant une image quelconque à partir d'un fichier et en tapant une formule renvoyant une plage quand elle est sélectionnée. =UnNomDansLeClasseur c'est mieux je trouve.
Remarque: ce que j'appelle une image de formulaire c'est une image normale, la seule que la plupart des gens connait, en tout cas ce n'est pas une image ActiveX que j'aurais pour ma part tendance à préférer pour de vraies images, question souplesse de transfert de l'image notamment avec les UserForm, qui ne conaissent que ce type d'image.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bonjour
j'arrive tard dans la discussion mais je crois comprendre qu'il s'agit d'envoyer (une/des ) feuilles en format pdf avec CDO dans une meme message
et cela en les choissisant dans une combobox nommée je crois cbx

tout d'abords
une combobox n'est pas multiselect du moins a mon souvenir on a donc déjà un soucis avec ça
que l'on pourrait facilement régler avec la gestion click droit et click gauche avec une variable static ou meme avec une variable tableau dans l’événement

ensuite
(le/les ) pdfs
j'ai cru comprendre que l'export en pdf contiendra toute les feuilles sélectionnées dans un même pdf

alors non c'est pas worksheets c'est sheets(tableau de sheets).select et activesheet.export.....

écrit en dur ce serait
sheets(array("feuil1","feuil6","feuil10")).select
activesheet.export.......
 

Dranreb

XLDnaute Barbatruc
Sinon j'ai réussi à faire fonctionner ce code avec une image préexistante :
VB:
Sub Essai()
   PrisePhoto ActiveSheet
   End Sub
Sub PrisePhoto(ByVal Wsh As Worksheet)
   Dim Rng As Range, Shp As Shape
   Set Rng = Wsh.UsedRange
   Set Shp = Feuil1.Shapes(1)
   ThisWorkbook.Activate
   Feuil1.Activate
   Shp.Select
   Selection.Formula = "=" & Rng.Address(True, True, xlA1, True)
   End Sub
 

Dranreb

XLDnaute Barbatruc
Rappel de mon poste 21
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.
Alors je pense que la proposition de patricktoulon ne va pas être si simple à mettre en œuvre, ou s'il y croit fort, qu'il reprenne tout ça plus en profondeur et le mette complètement au point.
Moi, je laisse tomber.
 

Dranreb

XLDnaute Barbatruc
Ah si, le but des images était justement d'avoir tout sur la même feuille (enfin seulement les images dont on a besoin) pour pouvoir appliquer la méthode ExportAsFixedFormat de l'objet Worksheet qui représente cette feuille.
Avec ActiveWindow.SelectedSheet (et sûrement pas ActiveSheet comme disait patricktoulon) on peut, je crois, faire un PrintPreview mais un ExportAsFixedFormat il ne semble pas. Mais vous pouvez à tout hasard faire des essais, on ne sait jamais. Excel travaille toujours avec des Select et Selection, mais on ne sait jamais quelle propriété objet membre de la sélection est impactée par les actions qu'il sait faire avec ça. C'est le flou total.
Remarque: le code engendré par l'enregistreur de macro ne marche pas toujours.
Par exemple en enregistrant une macro avec l'appareil photo, pour créer l'image il fait un ActiveSheet.AddShape en omettant le 1èr argument, or celui ci est obligatoire. Le mieux serait que la feuille a convertir en PDF ait suffisamment d'images mises à la main (5 donc) On peut toujours rendre invisibles celles dont on n'a pas besoin, on même les mettre simplement en dehors de la zone d'impression.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
J'ai inséré une nouvelle feuille nommée "Export", y ai inséré 5 images nommées de "Image 1" à "Image 5" et renommé son objet Worksheet WshExport. Cette procédure met bien les images bout à bout :
VB:
Option Explicit
Public Sub EnvoiProto(TWsh() As Worksheet) 'Envoie le ou les protocoles par mail
   Dim N As Long, Y As Double, Fic As String, Shp As Shape, omg As Object
   WshExport.Activate
   WshExport.ResetAllPageBreaks
   Y = 0
   For N = 1 To UBound(TWsh)
      Set Shp = WshExport.Shapes("Image " & N)
      Shp.Visible = True
      Shp.Select
      Selection.Formula = "=" & TWsh(N).UsedRange.Address(True, True, xlA1, True)
      Shp.ScaleWidth 1, msoTrue
      Shp.ScaleHeight 1, msoTrue
      Shp.Left = 0: Shp.Top = Y: Y = Y + Shp.Height + 20
      If N > 1 Then WshExport.HPageBreaks.Add Before:=Shp.TopLeftCell
      Next N
   While N <= 5
      Set Shp = WshExport.Shapes("Image " & N): Shp.Visible = False
      N = N + 1: Wend
   Exit Sub ' Instruction à supprimer (je ne veux pas créer de pdf chez moi) Dranreb
  
   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
   WshExport.ExportAsFixedFormat Type:=xlTypePDF, Filename:=Fic, Quality:=xlQualityStandard, _
      IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
   End Sub
 
Dernière édition:
Haut Bas