IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Utilisation de plusieurs NOT LIKE en meme temps [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 32
    Par défaut Utilisation de plusieurs NOT LIKE en meme temps
    Bonjour le forum,

    Voila un petit souci de logique que je soumets à votre expertise :
    Je veux garder (ne pas effacer) les lignes contenant, dans une colonne, les mots suivants : ABC, DEF, GHI.
    Mon code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    dim i  as integer
     
    FOR i=1 TO 100
    IF NOT CELLS(i,5) LIKE "ABC" OR NOT CELLS(i,5) LIKE "DEF" OR NOT CELLS(i,5) LIKE "GHI" THEN ROWS(i).DELETE
    mais cela ne trie pas correctement mes lignes.
    Idem avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If NOT (CELLS(i,5) LIKE "ABC" OR CELLS(i,5) LIKE "DEF" OR CELLS(i,5) LIKE "GHI") THEN ROWS(i).DELETE
    D'ou vient mon erreur ?
    Merci pour votre aide
    Wyrgle

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    avec les joker "*" c'est effectivement très pratique LIKE
    sans les jokers "*", autant utiliser l'opérateur "=" plutôt que LIKE, qui fera le même travail


    donc si tu cherches les cellules qui "contiennent" une chaine "toto", on fait plutôt comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If ActiveCell.Value Like "*toto*" Then MsgBox "ouais, trouvé !"

  3. #3
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if cbool(instr("ABC","ABC") * instr("TOTO","AZE")) =false then

  4. #4
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Toute en beauté l'opération sur les instr ... j'ai pas osé la proposer vu la façon dont l'auteur bute sur une application basique de l'opérateur Like

    Et si je l'avais fais, je n'aurai même pas eu l'idée de tester en booléen, j'aurai testé si > 0 en additionnant les instr au lieu de les multiplier

    car je trouve ça très joli

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour dysorthographie et joe.levrai
    Attention. Le demandeur ne veut supprimer que si ni, ni (ses OR auraient, indépendamment de l'absence de caractères génériques, du être des AND)
    Et si l'on retient l'utilisation de Instr :
    La multiplication est à éviter, puisque si un seul est absent -->> 0
    Il vaudra mieux retenir la valeur absolue de leur addition (et supprimer si 0)

    Ceci dit : j'ai l'habitude dans de tels cas de mettre mes chaînes dans un array parcouru en boucle. L'avantage est que l'on cesse la vérification dès que la présence de l'une des chaînes est vérifiée.
    Amitiés

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Oui il faut faire une addition,mais la valeur absolu pas besoin 0 c'est false et toutes autres valeur numérique c'est true!

  7. #7
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Bonjour à tous,

    Autre remarque, lorsqu'on boucle sur les lignes pour les supprimer, il est obligatoire de boucler de bas en haut.
    Donc For i = 1 to 100 deviendra For i = 100 to 1 step -1.

    La raison est simple, si je supprime la ligne 10 par exemple, la ligne numéro 11 deviendra la numéro 10 et en passant l'indice à 11 je viens de rater le traitement d'une ligne.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test()
    Dim a
    a = Array("ABCD", "TO", 3)
    Debug.Print in_array(a, "TOTO")
    Debug.Print in_array(a, "TOTO", True)
    End Sub
    Function in_array(T, V, Optional MotExacte As Boolean) As Boolean
    Dim i As Long
    For i = 0 To UBound(T)
        If V Like Array("*", "")(Abs(MotExacte)) & T(i) & Array("*", "")(Abs(MotExacte)) = True Then in_array = True: Exit Function
    Next
    End Function
    Dernière modification par Invité ; 02/03/2017 à 10h17.

  9. #9
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 32
    Par défaut
    Merci à tous pour vos réponses.
    J'ai finalement utilisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if cbool(instr(cells(i,10).value,"TOTO")+instr(cells(i,10).value,"TITI")) = false then rows(i).delete
    Maintenant je sais utiliser InStr et CBool. Le traitement semble d'ailleurs plus rapide qu'avec des Like.
    Très instructif.

    wyrgle

  10. #10
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Par défaut
    Bonjour,

    Bien qu'arrivant largement après la bataille, je voudrais ajouter mon grain de sel.

    Il est inutile de tester si une valeur booléenne renvoie True ou False.
    On peut l'utiliser telle quelle.

    If valeur = True Then = If valeur Then.

    If valeur = False Then = If Not valeur Then.

    Pour reprendre la solution retenue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if cbool(instr(cells(i,10).value,"TOTO")+instr(cells(i,10).value,"TITI")) = false then rows(i).delete
    peut simplement s'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Not cbool(instr(cells(i,10).value,"TOTO")+instr(cells(i,10).value,"TITI")) then rows(i).delete
    Petit plus:
    Si on prend l'habitude de préfixer les fonctions renvoyant une valeur booléenne de "Is", on obtient un code facilement lisible.
    Prenons une fonction recherchant une valeur. Si on la nomme IsFound, le code de son appel peut être:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If IsFound("toto") Then
    Ce qui se traduit, en français par "Si toto est trouvé, alors".
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjour Alain,
    Oui tu as raison, nous ne sommes pas la pour seulement apporter des solutions mais également pour permettre la revalorisation des connaissances!

    Un if évalue si une condition est vrai/faut. Pas besoin de =false. Si je ne l'ai pas noté de la sorte c'est pour ne pas trop élevé la hauteur des marches a gravir! Mais il ne fallait pas clôturer le sujet sens l'aborder.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Envoi de plusieurs requetes AJAX en meme temps
    Par boboss123 dans le forum jQuery
    Réponses: 8
    Dernier message: 28/03/2018, 03h51
  2. plusieurs not like
    Par zugolin dans le forum Débuter
    Réponses: 7
    Dernier message: 05/12/2009, 15h55
  3. Réponses: 2
    Dernier message: 18/07/2009, 02h34
  4. requet sql "GO", pour plusieurs requetes sql au meme temps
    Par abbd dans le forum Développement
    Réponses: 3
    Dernier message: 25/05/2008, 16h08
  5. Filtres sur plusieurs champs/criteres en meme temps
    Par jeo13 dans le forum Macros et VBA Excel
    Réponses: 35
    Dernier message: 26/03/2008, 15h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo