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 :

rechercher des champs ne contenant pas un mot et les supprimer


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2015
    Messages : 25
    Par défaut rechercher des champs ne contenant pas un mot et les supprimer
    Bonjour,

    Je souhaite créer une macro qui permet de trouver toutes les lignes dont un colonne ne contient pas le mot RELXXXXXXX ( où X est un nombre ) puis supprimer ces lignes.

    je vois voit vraiment pas comment.

    J'ai trouvé ce programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    With ThisDocument.Tables(1)
    For r = .Rows.Count To 1 Step -1
            fnd = False
            For Each c In .Rows(r).Cells
                If InStr(c.Range.Text, "x") == 0 Then fnd = True
            Next
            If fnd Then .Rows(r).Delete
        Next
    End With
    Que ce que With ThisDocument.Tables(1) ? fonctionnerait il ?

  2. #2
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Par défaut
    Bonjour,
    Pour comprende ce qu'est le bloc With : https://msdn.microsoft.com/en-us/library/wc500chb.aspx
    Le double "=" m'étonne.
    Pour que le code puisse tourner, il faudrait définir ce qu'est ThisDocument.Tables(1). Je pense qu'il faudra plutôt faire un bloc With avec la feuille dans laquelle doit se dérouler l'opération.
    Pour savoir si une cellule contient un certain mot (ou pas), intéresse-toi à l'opérateur Like : https://msdn.microsoft.com/fr-fr/library/swf8kaxw.aspx.
    fonctionnerait il ?
    Comprends-tu le code que tu as écrit?

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2015
    Messages : 25
    Par défaut
    J'ai rajouté moi même le == .
    ce que je souhaite faire :
    vérifier dans chaque ligne de la colonne A si elle contient un terme autre que RELXXXXXXX.

    Si c'est le cas on supprime la ligne.

    A la fin je souhaite avoir que des lignes commençants avec RELXXXXXXXX.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    With ThisDocument.Tables(1) // Il faut le remplacer par la feuille actuelle 
    For r = .Rows.Count To 1 Step -1 // pour chaque ligne  ( de la fin au debut, mai sbon je vais l'inverser ) 
            fnd = False
            For Each c In .Rows(r).Cells // pour chaque colonne ( ici est ce toutes les colonnes ? )
                If InStr(c.Range.Text, "x") > 0 Then fnd = True // je ne comprends pas
            Next
            If fnd Then .Rows(r).Delete // si il trouve le mot il supprime 
        Next
    End With

  4. #4
    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
    La précision est ici nécessaire.
    Il y a une différence entre :
    1) "contenir"
    et
    2) "commencer par"
    quelle est finalement le critère exact (de ces deux) à retenir ?

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2015
    Messages : 25
    Par défaut
    contient un valeur RELXXXXXXX ( où X un nombre) ( il y a 7 fois X )

  6. #6
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Par défaut
    Vu le == et ce que tu utilises pour écrire des commentaires, j'ai l'impression que tu as l'habitude de coder dans un autre language
    En VBA, on utilise pas de ==, tout se fait avec =. Les commentaires sont précédés d'un apostrophe.

    Tout d'abord, avant de s'embarquer dans une boucle, il y a une façon plus simple de faire des filtres avec Excel : tu peux utiliser les tableaux : URL="http://silkyroad.developpez.com/excel/tableau/"]http://silkyroad.developpez.com/excel/tableau/[/URL]
    Le tuto t'indique comment manipuler des tableaux "manuellement", mais tout ceci peut se faire avec Excel. Tu retrouves le code associé grâce à l'enregistreur de macro. Filtrer sur les lignes qui ne contiennent pas le mot et supprimer toutes ces lignes est plus efficace que de faire une boucle pour vérifier à chaque ligne si le mot existe, puis supprimer la ligne.

    Néanmoins, si tu ne veux pas passer par un tableau, mais faire une boucle, voici quelques commentaires par rapport au code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For r = .Rows.Count To 1 Step -1
    Rows.Count donne le nombre de lignes de la feuille, or nous voulons seulement le nombre de lignes non vide. Pour cela, on utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(Rows.Count, 1).End(xlUp).Row
    Cells(Rows.Count, 1) est la dernière cellule de la colonne A dans la feuille. End(xlUp) permet de remonter vers la première cellule non vide. Row donne le numero de ligne de cette cellule.
    ( de la fin au debut, mai sbon je vais l'inverser
    NOOOOOOON !!!!!!!!! Quand on supprime des lignes on le fait toujours dans l'ordre INVERSE. Pourquoi? Car sinon on loupe des lignes, exemple :
    1 - A
    2 - B
    3 - B
    4 - A
    On veut supprimer les lignes contenant B en faisant une boucle sur les lignes:
    • itération 1 : ligne 1 --> pas de B, on ne supprime pas
    • itération 2 : ligne 2 --> un B, on supprime la ligne, la liste devient :
      1 - A
      2 - B
      3 - A
      4 -
      Il y a décalage des valeurs par rapport aux lignes à cause de la suppression.
    • iteration 3 : ligne 3 --> pas de B, on ne supprime pas et on continue

    Et là... c'est le drame! On a sauté une occurence de B
    En faisant la suppression en ordre inverse, on évite cela : je te laisse refaire le petit exemple avec la boucle en sens inverse pour voir que ça marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each c In .Rows(r).Cells ' pour chaque colonne ( ici est ce toutes les colonnes ? )
    Ici, on fait une boucle sur l'ensemble des cellules de la ligne n° r. Mais d'après ce que tu dis, tu veux seulement vérifier la colonne A? Du coup, pas besoin de cette boucle. Dans la boucle sur les lignes, à l'itération i, il suffit de vérifier si la cellule Ai contient ou pas le mot. Pour rappel : pour obtenir la valeur de la cellule Ai, on écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If InStr(c.Range.Text, "x") > 0 Then fnd = True 'je ne comprends pas
    J'utiliserai plutôt l'opérateur Like, comme évoqué dans mon message precedent pour vérifier si le mot est contenu dans la cellule.
    Pas besoin de la variable fnd si on regarde que la colonne A. En effet, il suffit de dire que si le mot est contenu dans la cellule, alors on supprime la ligne.

    Voici qqs pistes, essaie de travailler avec cela, puis reviens vers nous si tu rencontres encore des problèmes

  7. #7
    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
    Ah ... la réponse ayant été :
    contient un valeur RELXXXXXXX ( où X un nombre) ( il y a 7 fois X )
    cela veut donc dire : retenir également une valeur = "abcdefgREL1347890abracadabra"...
    Précision, quand tu nous tiens ....

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2015
    Messages : 25
    Par défaut
    toutes les lignes dont une colonne ne contient pas le mot RELXXXXXXX
    Donc quand c'est REL1234567 on garde et quand c'est différent on supprime.
    Voila ce que j'ai fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub nettoie()
    Worksheets("(MultiSource) - Dossier seul-04").Activate
    Dim nbrligne As Integer
        nbrligne = Cells(Rows.Count, 1).End(xlUp).Row
        For i = nbrligne To 2 Step -1
            If (Not Range("A" & i).Value Like "REL\d{7}") Then
            Rows(i).Delete
            End If
        Next
     
    End Sub
    ça n'a pas l'air de fonctionner
    ça m'a tout supprimé

Discussions similaires

  1. Réponses: 25
    Dernier message: 18/10/2012, 17h57
  2. Convertir des champs "text" contenant du RichText
    Par jackfirst72 dans le forum SQL Procédural
    Réponses: 8
    Dernier message: 29/07/2009, 10h30
  3. [RegEx] rechercher une phrase ne contenant pas le mot.
    Par pdelorme dans le forum Langage
    Réponses: 2
    Dernier message: 29/05/2009, 22h28
  4. [RegEx] Rechercher les chaines ne contenant pas un mot donné
    Par saramery dans le forum Langage
    Réponses: 23
    Dernier message: 27/11/2008, 12h50
  5. Somme des champs commencant par le même mot
    Par kemsy dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 29/10/2008, 18h47

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