1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
|
Sub EnvoiMail()
Dim Fe As Worksheet
Dim Outlook As Object
Dim Message As Object
Dim Plage As Range
Dim Cel As Range
Dim DerLigne As Long
Dim DerColonne As String
Dim Corps As String
Dim Dossier As String
Dim CelDebut As String
Dim CelFin As String
Dim Col1 As String
Dim Col2 As String
Dim Lng1 As String
Dim Lng2 As String
Dim I As Integer
Dim ErrCol As Boolean
Dim ErrLgn As Boolean
'défini la feuille
Set Fe = ActiveSheet
'dossier où seront enregistré les fichiers pdf
Dossier = "D:\Feuille en PDF\"
With Fe
'dernière ligne et colonne utilisée
DerLigne = .Cells(.Rows.Count, 2).End(xlUp).Row 'sur colonne B -> adresses e-mail
DerColonne = .Cells(1, .Columns.Count).End(xlToLeft).Address(0, 0) '.Column 'sur ligne 1 --> entêtes
DerColonne = Left(DerColonne, Len(DerColonne) - 1) 'supprime le chiffre 1
'défini la plage sur la colonne F (destinataires)
Set Plage = .Range(.Cells(1, 6), .Cells(.Rows.Count, 6).End(xlUp))
'parcourt la plage et cache les colonnes et lignes en fonction du destinataire
For Each Cel In Plage
'récupère dans la colonne S l'adresse des plages qui doivent être visibles
CelDebut = Split(Cel.Offset(0, 13).Value, ":")(0)
CelFin = Split(Cel.Offset(0, 13).Value, ":")(1)
'mise en place d'un gestionnaire pour gérer l'erreur due à la colonne A ou la ligne 1
'NOTE : n'est pas géré ici la dernière ligne et la dernière colonne car pratiquement jamais utilisées. Si il faut gérer, il suffit de partir sur le même principe
On Error Resume Next
'cellule pour le masquage gauche et haut défini par un
'décalage d'une colonne à gauche et d'une ligne au dessus
CelDebut = Range(CelDebut).Offset(0, -1).Address(0, 0) '1 colonne vers la gauche
If Err.Number <> 0 Then ErrCol = True 'si erreur, colonne A
Err.Number = 0
CelDebut = Range(CelDebut).Offset(-1, 0).Address(0, 0) '1 ligne vers le haut
If Err.Number <> 0 Then ErrLgn = True 'si erreur, ligne 1
'supprime le gestionnaire
On Error GoTo 0
'cellule pour le masquage droit et bas
CelFin = Range(CelFin).Offset(1, 1).Address(0, 0)
'scinde les lettres de colonnes et les numéros de lignes
For I = 1 To Len(CelDebut)
If IsNumeric(Mid(CelDebut, I, 1)) Then
Col1 = Left(CelDebut, I - 1)
Lng1 = Right(CelDebut, Len(CelDebut) - (I - 1))
Exit For
End If
Next I
For I = 1 To Len(CelFin)
If IsNumeric(Mid(CelFin, I, 1)) Then
Col2 = Left(CelFin, I - 1)
Lng2 = Right(CelFin, Len(CelFin) - (I - 1))
Exit For
End If
Next I
'si une erreur c'est produite sur le décalage de colonne
'il n'y aura pas de masquage du coté gauche
If ErrCol = False Then
.Columns("A:" & Col1).EntireColumn.Hidden = True
End If
'si une erreur c'est produite sur le décalage de ligne
'il n'y aura pas de masquage du coté haut
If ErrLgn = False Then
.Rows("1:" & Lng1).EntireRow.Hidden = True
End If
'masquage coté droit
.Columns(Col2 & ":" & DerColonne).EntireColumn.Hidden = True
'masquage coté bas
.Rows(Lng2 & ":" & DerLigne).EntireRow.Hidden = True
'exporte la feuille en "pdf" dans la dossier avec pour nom, le nom du destinataire
.ExportAsFixedFormat xlTypePDF, Dossier & Cel.Value, 0, True
'affiche à nouveau toutes les colonnes et lignes
.Rows.EntireRow.Hidden = False
.Columns.EntireColumn.Hidden = False
'construction du message
Corps = "Bonjour," & vbCrLf & vbCrLf
Corps = Corps & "Veuillez trouver ci-joint les valeurs comme convenu." & vbCrLf & vbCrLf
Corps = Corps & "Cordialement." & vbCrLf & vbCrLf
Corps = Corps & "balibou."
'création du message
Set Outlook = CreateObject("Outlook.Application")
Set Message = Outlook.CreateItem(0)
With Message
.To = Cel.Offset(0, -4).Value
.Subject = "Envoi de valeurs"
.Body = Corps
.Attachments.Add Dossier & Cel.Value & ".pdf" '<-- en pièce jointe, le fichier pdf correspondant
.Display
.Send
End With
Next Cel
End With
End Sub |