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.Count

devrait 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.

image

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 Sub

Bien 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

8book2.xlsx (11.12 Ko)

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 Sub

Un 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.

image

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

9book4.xlsx (11.04 Ko)

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

Rechercher des sujets similaires à "verifier valeur filtree colonne"