Vérifier qu'il n'y a qu'une valeur filtrée dans une colonne
Bonjour,
Malgré mes nombreuses recherches sur le sujet je n'arrive pas à trouver le code qui correspond à ma situation
Je filtre manuellement sur chaque adresses mails de la colonne C et pour chaque résultat, j'envoie via VBA un mail avec le tableau correspondant aux résultats pour cette adresse mail (je peux avoir plusieurs lignes dans le tableau pour une seule adresse mail)
Je voudrai juste afficher un message si plusieurs adresses mails sont filtrées en meme temps car il ne prend en compte que la dernière adresse mail via le code ci dessous et je voudrais éviter d'envoyer les données à un autre contact
Range("d1") = Range("c2").End(xlDown).Value
Email = Range("d1")
Merci pour votre retour
bav
Xavier
Bonjour,
En vous placant sur une colonne de la zone filtrée,
VotreColonne.SpecialCells(xlCellTypeVisible).Rows.Countdevrait renvoyer le nombre de cellules visibles dans la colonne en question.
Par exemple si vous filtrez sur C2:C10,
If Range("C2:C10").SpecialCells(xlCellTypeVisible).Rows.Count > 1 Then MsgBox "Attention, plus de 1 email filtré"Merci saboh12617 pour votre retour,
Mais celà ne fonctionne pas car c'est le nombre de valeur unique qu'il doit compter.
Si j'ai plusieurs ligne pour la meme donnée filtrée il considère comme plusieurs adresse mail différente, ce qui n'est pas le cas.
Je pensais lui faire identifier la première valeur de la colonne C qui doit etre la meme que la dernière valeur et dans ce cas il peut envoyer le mail sinon il affiche le message. Mais je ne sais pas comment extraire ces deux valeurs pour rappel il s'agit d'une liste que je filtre sur la colonne C et donc la premiere données et la dernière sont toujours des cellules différentes (Il ne s'agira pas de C1 à chaque fois pour la première valeur mais peut etre C4 ou C8 selon le filtre appliqué).
Je suis preneur de toute autre solution
Merci
Xavier
Ah oui d'accord j'avais mal compris. Comme vous indiquiez filtrer manuellement chaque adresse mail je pensais qu'il ne pouvait y avoir qu'une seule adresse sortie du tri, et que vous souhaitiez simplement compter les lignes.
Dans ce cas il faut faire une petite boucle pour lire les valeurs, une proposition :
Sub RechercheMail()
Dim myMails As Variant
With Range("C1")
myMails = Application.Transpose(Range(.Cells, .End(xlDown)).Value2)
End With
Dim searchedMail As String
searchedMail = Range("C1").Value2
Dim mail As Variant
For Each mail In myMails
If CStr(mail) <> searchedMail Then
MsgBox "Erreur: " & CStr(mail) & " != " & searchedMail
Exit For
End If
Next mail
End SubBien sur adapter C1 si votre liste d'emails commence en dessous (je me suis basé sur le dernier screen).
Merci mais il y a encore un soucis je pense du au fait que ma première valeur ne se trouve pas toujours dans la cellule C1 du au filtre. pour l'exemple donné précedemment celà fonctionne mais il m'affiche également le message si je n'ai qu'une seule ligne pour le contact
Je vous ai joins un fichier qui represente mon exemple ca sera plus facile.
Je vais donc filtrer manuellement chaque contact individuellement et cliquer sur le bouton qui me permet de copier les infos nécessaire dans le mail ainsi que le le contact. Mais je veux etre sur qu'il n'y a pas d'autres contacts sélectionnés quand j'envoie mon mail. donc pas d'adresse différente que celle présente dans la dernière cellule de C.
Dans ce fichier il devra afficher le message si plus d'une adresse mail est selectionnée dans la colonne C et uniquement dans ce cas. Par contre si par exemple uniquement l'adresse bazar@123.com est affichée il pourra continuer ou si l'adresse 123@123.com est affichée il pourra continuer.
Bonjour,
Oui alors si j'ai bien compris c'est assez compliqué ce que vous demandez. Mais avant de se lancer dans des choses compliquées il faut bien comprendre ce que l'on fait.
Excusez-moi mais si vous utilisez l'outil de filtre Excel comme dans le fichier joint, à AUCUN moment vous n'aurez 2 emails filtrés différents, puisque par définition vous avez indiqué que vous ne filtriez qu'un seul mail… ???
Votre demande est incohérente : d'abord vous filtrez par email puis vous voulez vérifier que les emails filtrés correspondent au filtre… ? Vous doutez de l'utilitaire de filtre Excel ? Parce qu'il est (et sera) toujours plus efficace que n'importe quel code VBA.
Je suis désolé mais pour moi votre vérification est complètement inutile si vous suivez la procédure que vous indiquez dans votre premier message. Au contraire vous risquez de créer plus d'erreurs ou de faux positifs.
Peut etre voudriez-vous automatiser l'action de filtrer, à partir du texte dans une autre cellule, ça c'est possible (et compréhensible). Mais vérifier en VBA le résultat d'un filtre natif Excel.. non.
Merci pour votre retour, mais si cela à une utilité de vérifier, non pas que je n'ai pas confiance en excel mais en l'utilisateur.
Je ne suis pas expert en VBA et la seule manière que j'ai trouvé pour extraire l'adresse mail qui me sert de contact pour l'envoi de mon mail est de récupérer la dernière valeur filtrée de ma colonne C (ce qui n'empeche pas de cocher plusieurs contacts dans la liste de filtre automatique ou d'oublier de décocher le contact filtré précedemment, heureusement l'erreur est humaine.).
Comme j'expliquais il y a peut etre moyen de comparer la première et la dernière valeur de ma colonne une fois filtrée et dans ce cas aucun soucis car le message n'apparaitrait que dans le cas ou une autre valeur se trouve selectionnée mais ca je ne sais pas comment l'extraire (surtout la première)
Si celà n'est vraiment pas possible je checherai encore de mon coté ou alors je laisserai tomber l'idée du message
bav
Xavier
Ok, je pense cependant que VBA n'est pas la solution la plus adaptée.
Ci-après code fonctionnel, en partant de la cellule C3 et en comparant à la dernière valeur filtrée de la liste de données en colonne 3 :
Sub RechercheMail()
Dim nonSortedMails As Range
With Range("C3")
Set nonSortedMails = Range(.Cells, .End(xlDown)) 'Application.Transpose(
End With
Dim searchedMail As String
searchedMail = Cells(Rows.Count, 3).End(xlUp).Value2
Dim i As Long
With nonSortedMails
For i = 1 To .Count
If Not Intersect(.Item(i), .SpecialCells(xlCellTypeVisible)) Is Nothing Then
If searchedMail <> .Item(i).Value2 Then
MsgBox .Item(i) & " est différent de " & searchedMail
Exit Sub
End If
End If
Next i
End With
End SubUn tout grand merci, celà fonctionne parfaitement.
bav
Xavier
Bonjour à tous,
Pas trop compris la démarche
Si tu veux obtenir les valeurs distinctes de la colonne C via un filtre, tu peux rajouter en colonne F cette formule
=NB.SI($C$3:C3;C3)
et filtrer sur la valeur "1"
klin89
Bien d'accord avec toi Klin, c'est un non sense d'utiliser VBA ici, ou en tout cas de cette manière, mais l'auteur semble décidé. Après tout l'objectif du forum est d'apporter réponse à des questions. On voit bien que les conseils partent souvent dans le vent…
Merci à tous, je peux bien entendre que pour vous la démarche est incohérente, il ne s'agit pas juste d'afficher le message pour tester le filtre, dans ce cas je reconnais qu'il ne faut pas de vba pour celà.
J'envoie pour chaque contact le tableau correspondant à ses données journalières extraites d'un programme tiers.
Le VBA ne me fait pas gagner 3h par jour mais une fois le filtre fait sur le contact souhaité, un simple clic sur le bouton me permet de générer le mail, copier le tableau correspondant et entrer le contact dans le champs sent to, qui 'évite donc un nombre conséquent de clic et sélection inutile. Je pense donc qu'il est adpaté d'avoir utilisé le VBA. Un autre utilisateur m'avait relevé le problème si plusieurs contact avait été sélectionnés par mégarde leur données se retrouvaient dans le tableau a destination du dernier contact de la liste. C'est donc la raison pour laquelle je souhaiter faire apparaitre ce message.
On n'a pas tous les memes compétences, mais avec les modestes miennes j'arrive a faire gagner du temps précieux sur mon lieu de travail. tout pourait etre mieux mais on a tous ses limites et l'utilité pour moi d'un forum et de pouvoir aider les gens de tous niveaux et de les faire progresser meme si les résultats ne paraissent pas toujours cohérents aux yeux de tous...
Merci pour votre aide
Bonjour saboh,
Je rencontre quand meme un soucis. Si le contact de la ligne 3 est unique (il n'y a que la ligne 3 pour ce contact une fois le filtre appliqué), il m'affiche le message.
Je vous ai remodifié le fichier pour que celà corresponde à mon exemple.
Je n'ai aucun soucis si il n'y a qu'un résultat mais que ce résultat et sur une autre ligne que la 3 et si après le filtre il y a plusieurs résultats pour ce contact présent dans la ligne 3 il n'y a pas non plus de soucis.
Merci d'avance pour votre retour
Xavier
Oui je m'en doutais un peu qu'il y aurait un problème à ce niveau, mais vu qu'avec le premier fichier ça passait je n'ai pas fait de tests poussés.
Remplacez la 4e ligne du code par
Set nonSortedMails = Range(.Cells, .End(xlDown).End(xlDown).End(xlUp))Pour corriger le problème. C'est un peu moche mais ça fonctionne.
Super juste ce qui manquait, Un jour j'aimerai atteindre ce niveau
Merci encore
Xavier