Création d'un filtre dans une macro sur un tableau
Bonjour,
J'ai créé une macro permettant d'envoyer un tableau par mail. J'ai tout fait par internet mais là je bloque.
Je souhaiterais créer un filtre sur ce tableau pour les valeurs vides ou étant égal à "En attente" dans la colonne G (commençant en G7).
Ainsi, le tableau qui serait envoyé n'aurait que ces valeurs filtrées.
Merci d'avance pour votre aide.
Sub Envoyer_un_tabeau_V2()
'
'Déclaration de la variable
Dim MaFeuille As Worksheet
Dim NbLigne As Integer
'Affectation des variables
Set MaFeuille = ThisWorkbook.Sheets("Réunion de perf")
'Desactivation du raffaichissement de l'écran
Application.ScreenUpdating = False
'On calcule le nombre de ligne à prendre
NbLigne = MaFeuille.Range("C" & Application.Rows.Count).End(xlUp).Row
'On selectionne la plage à copier
MaFeuille.Range("C1:H" & NbLigne).Select
'Avec l'object Mail
ActiveWorkbook.EnvelopeVisible = True
With Selection.Parent.MailEnvelope
With .Item
.To = MaFeuille.Range("D2").Value
.CC = MaFeuille.Range("D3").Value
.Subject = MaFeuille.Range("C5").Value
.Send
End With
End With
MsgBox "Votre Email a bien été envoyé.", vbInformation + vbOKOnly, "CONFIRMATION ENVOI SUJETS SOUHAITANT ÊTRE ABORDÉS"
Application.ScreenUpdating = True
Range("A1").Select
End Sub
Bonjour,
Je n'ai pas réussi a reprendre ta methode sans avoir un message d'erreur qui empeche l'envoi du mail car "lignes masquées".
Donc une autre solution avec l'outil de Bruno [Fichier - Envoi de mail]
Tu peux avoir un truc comme ça : (nom du tableau defini ici => "Tab_Donnee")
Option Explicit
' Codes collectés et modifiés par BrunoM45
' https://forum.excel-pratique.com/membre/15789
' https://www.excel-pratique.com/fr/telechargements/utilitaires/pdf-email-vba-excel-no508
' Constante type d'élément Outlook (pour le late binding)
Const olMailItem As Integer = 0
' Constantes Formats de l'email
Const olFormatHTML As Integer = 2
Sub Envoyer_un_tabeau_V2()
RangeInBodyMail
MsgBox "Votre Email a bien été envoyé.", vbInformation + vbOKOnly, "CONFIRMATION ENVOI SUJETS SOUHAITANT ÊTRE ABORDÉS"
Range("A1").Select
End Sub
' Ce code permet d'intégrer une plage donnée dans le corps d'un mail
Sub RangeInBodyMail()
Dim Rng As Range
Dim OutApp As Object, OutMail As Object
Dim StrHTML As String, StrSignature As String
Dim MaFeuille As Worksheet
Dim NbLigne As Integer
' Définir la plage des cellules uniquement visibles
On Error Resume Next
Set MaFeuille = ThisWorkbook.Sheets("Réunion de perf")
'On calcule le nombre de ligne à prendre
NbLigne = MaFeuille.Range("C" & Application.Rows.Count).End(xlUp).Row
'On supprime les tri et filtre par "En attente" et ""
MaFeuille.ListObjects("Tab_Donnee").Range.AutoFilter Field:=7
MaFeuille.ListObjects("Tab_Donnee").Range.AutoFilter Field:=7, Criteria1:="En attente", Operator:=xlOr, Criteria2:=""
'On selectionne la plage à copier
Set Rng = MaFeuille.Range("C1:H" & NbLigne).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Rng Is Nothing Then
MsgBox "Il ya eu un problème lors de la définition de la plage"
Exit Sub
End If
' Avec l'application
With Application
.EnableEvents = False ' Désactiver les évènements
.ScreenUpdating = False ' Désactiver le rafraichissement
End With
' Créer une instance Outllok et Mail
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(olMailItem)
With OutMail
.BodyFormat = olFormatHTML ' Format HTML
.Display ' Afficher le mail pour la signature (si insertion auto)
' Mémoriser le code HTML avec la signature
StrSignature = .HTMLBody
.To = MaFeuille.Range("D2").Value '"LeDestinataire@fai.fr"
.CC = MaFeuille.Range("D3").Value '"LaCopie@fai.fr"
' .BCC = "LaCopieCachee@fai.fr"
.Subject = MaFeuille.Range("C5").Value '"Plage de la feuille"
' StrHTML = "Bonjour, <br>" _
& "Vous trouverez ci-joint l'état de ce jour"
.HTMLBody = StrHTML & RangetoHTML(Rng) & StrSignature
.Display '.Send 'or use .Display
End With
With Application
.EnableEvents = True
.ScreenUpdating = True
End With
' Effacer les variables objet
Set OutMail = Nothing: Set OutApp = Nothing
End Sub
Function RangetoHTML(Rng As Range)
Dim Fso As Object, Ts As Object
Dim TempFile As String
Dim TempWb As Workbook
' Créer le nom du fichier
TempFile = Environ$("temp") & "\" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"
' Copier la plage et créer un classeur pour coller les données dedans
Rng.Copy
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
' Publier la feuille dans un fichier HTML
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
' Lire les données du fichier
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=")
' Fermer le classeur sans sauvegarde
TempWb.Close SaveChanges:=False
' Supprimer le fichier HTML
Kill TempFile
' Effacer les variables objet
Set Ts = Nothing: Set Fso = Nothing: Set TempWb = Nothing
End Function
A+
Bonjour,
Merci beaucoup pour ta réponse!
La macro fonctionne presque au détail que la colonne qui est filtrée et la colonne C (celle avec les dates). Et donc tout est faussé, je n'arrive pas à comprendre.
Est-ce que tu aurais une idée de cette raison?
J'ai tenté d'ajouter une nouvelle variable mais rien à faire ça filtre toujours la mauvaise colonne
Peut-etre en changeant "Field:=7" ?
(Supprime sur la premiere ligne de code pour supprimer tout filtre et pas seulement celui sur le 7eme colonne et change le 7 sur le deuxieme ligne pour l'adapter a ton tableau)
7 étant la colonne G si tu as un tableau qui commence en colonne A
'On supprime les tri et filtre par "En attente" et ""
MaFeuille.ListObjects("Tab_Donnee").Range.AutoFilter
MaFeuille.ListObjects("Tab_Donnee").Range.AutoFilter Field:=7, Criteria1:="En attente", Operator:=xlOr, Criteria2:=""
Sans fichier difficile de repondre
J'ai finis par trouver tout seul!
Mercie encore pour ton aide passe une bonne journée :)