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 une "valeur" qui "varie".


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut Rechercher une "valeur" qui "varie".
    Bonjour à toutes et à tous.

    J'ai un petit problème et je me demandais par quel bout le prendre. Je dois effectuer une recherche d'une certaine valeur, au sein de ma feuille. Bon, pour la recherche, pas de problème, ça sera un classique .Find dans une boucle For.

    Mon problème commence donc maintenant. Les valeurs que je dois rechercher dans cette feuille sont des lettres majuscules seules (pas de chiffres ni de O, X, I) ou des combinaisons de la forme A-B. Le pourquoi de cette recherche ? Une fois trouvées, je dois doubler ces lettres : A deviendra AA et A-B deviendra AA-BB.

    Pour résoudre ça et agir seulement aux endroits nécessaires (je ne veux tout de même pas doubler tous mes A dans ma feuille), je me suis débrouillé de la manière suivante : j'ai entouré là où il fallait mes A ou mes A-B de "|" qu'on ne peut trouver ailleurs dans le document. J'ai donc des |A| et des |A-B| qui se balladent dans mon document.

    Ma question : comment rechercher les valeurs qui sont entre ces "|" ? Il faudrait que je puisse rechercher tous les |x| dans ma feuille où x est une variable (A, B, Z ou A-B, Z-F etc). Comment peut-on mettre cela dans un .Find ?

    Merci d'avance

    André

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Cells.Find(What:="|*|", LookIn:=xlFormulas, LookAt:= _
        '.... etc
    Tu adaptes à ton code.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut
    Sympa le coup de la petite "*", je connaissais pas

    Merci beaucoup

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Oui ! Je pense que tu as mis un espace entre "MsgBox" et "Hello" mais... tu as une question ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut
    C'est encore moi et j'ai un petit problème

    J'en suis arrivé à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For j = 1 To Cells(65536, "B").End(xlUp).Row
            Set c = Range(Range("A" & j), Range("V" & j)).Find(What:="|*|", lookat:=xlPart)
            If Not c Is Nothing Then
                MsgBox (c)
            End If
        Next
    J'ai 2 questions à ce niveau. Quand j'affiche ce qu'il trouve dans mon "c", j'ai des : "1 - (Référence : |A|)" ou encore "1 - (Référence locale : |A|)". Bien entendu, il trouve les |*| seuls dans une cellule, ceux où y'a d'autres choses à côté comme dans ce cas. Cependant, je ne voudrais qu'il ne garde en mémoire que les |*| et pas ce qu'il y a à côté afin de les modifier sans modifier le reste de la cellule.

    Deuxième question : comment écrire simplement "je parcours toute la feuille du début à la fin lors de ma recherche" autrement que ce que j'ai fait (en plus propre

    Merci encore

    EDIT : oups, désolé pour le message précédent, je l'ai supprimé, c'était une fausse manip

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    1 - Tu peux utiliser Replace pour remplacer par exemple "Bidule à machin - |A| - et c'est tes rats" par "Bidule à machin - Ah Ah ! - et c'est tes rats"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c = replace("Bidule à machin - |A| - et c'est tes rats", "|A|", Ah Ah !")
    Tu sauras adapter ?
    2 - En effet, tu peux simplifier. Mais j'ai besoin d'une précision : Souhaites-tu remplacer tous les "|A|" par les mêmes "Ah Ah !" ou seulement certains. Le code ne sera pas le même. Le code suivant les remplace tous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    bidule = "|A|"
    With Worksheets("NomDeTaFeuille").Range(Cells(1,1) , Cells(Range("B65536").end(xlup).row, 2))
        Set c = .Find(Bidule, lookin:=xlValues, lookat:=xlpart)
        If Not c Is Nothing Then
            Deb = c.Address
            Do
                Range(c.address) = replace("Bidule à machin - |A| - et c'est tes rats", "|A|", Ah Ah !")
                Set c = .FindNext(c)
            Loop While Not c Is Nothing And c.Address <> Deb
        End If
    End With
    Tu dis
    A+

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut
    Alors, simplement, tous mes |A| au sein de ma feuille devront être, selon la condition dans laquelle je suis dans mon code, soit doublés (|AA|), soit triplés (|AAA|) soit encore plus. Le seul truc c'est que ça doit agir sur tout ce qui est entre "||". Si j'ai du |B-C|, toujours selon ma condition, cela va devenir du |BB-CC| à chaque fois que j'en trouverai dans ma feuille.

    En tout cas, merci de ton aide

    EDIT : Je viens de tester, toutes les cellules de la feuille ne sont pas parcourues, seulement la colonne "B" j'ai l'impression. En effet, j'ai callé 6 ou 7 |x| dans la feuille où x change. J'ai lancé la recherche avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set c = .Find("|*|", LookIn:=xlValues, lookat:=xlPart)
    et lors de mon affichage pour tester, je n'en ai qu'un seul

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Si tu ne passes pas par la boucle que j'ai faite, ce n'est pas étonnant. Une fois trouvé, la recherche ne se poursuit pas.
    (pour la boucle, j'ai oublié un guillemet "Ah ! Ah !"tu l'ajoutes et tu testes.
    Sinon, précise où peuvent se trouver tes |*| (quelle plage ?) Tu as mis la colonne V (22)
    Par contre, tu recherches la dernière ligne de la colonne B
    Citation Envoyé par toi
    For j = 1 To Cells(65536, "B").End(xlUp).Row
    vérifie que ce soit bien la colonne la plus longue.
    Dis-nous tout

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut
    Bon, je suis plus bête qu'un parpaing J'avais utlisé ta boucle mais j'ai oublié le "loop"

    Sinon, les |*| peuvent être seulement dans la colonne D mais je préférais les remplacer comme s'ils étaient n'importe où dans la feuille, au cas où ils se déplacent

    Donc on peut rester sur la colonne D au final qui sera, par la même occasion, la plus longue

    EDIT : la chaîne de caractères avant le |*| varie elle-aussi comme celle qui se trouve après. Il faudrait donc que peu importe où dans la feuille, ****|x|**** (x une variable) soit remplacé par ****|xx|****.

    Merci de l'aide

  10. #10
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Tu sauras adapter mon code ?

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut
    Je vais tenter On va voir ce que ça donne.

  12. #12
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Faut tout y dire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(c.address) = replace(c, "|A|", "Ah Ah !")
    Ce coup-ci, c'est bon ?
    A+ quand même

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut
    Bonjour ! Désolé de n'avoir pas répondu plus tôt mais je me suis refais une santé

    Voilà ce à quoi j'en suis arrivé ! (Ce qui est ce que m'a donné ouskel'n'or.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Sub Repeattttttt()
     
    Dim c As Range
     
    With Worksheets("1").Range(Cells(1, 1), Cells(Range("D65536").End(xlUp).Row, 2))
        Set c = .Find("|*|", LookIn:=xlValues, lookat:=xlPart)
        If Not c Is Nothing Then
            MsgBox (c)
            Deb = c.Address
            Do
               Range(c.Address) = Replace(c, "|*|", "Ah Ah !")
            Loop While Not c Is Nothing And c.Address <> Deb
        End If
    End With
     
    End Sub
    Sachant que les valeurs à modifier ne se trouvent que dans la colonne D, Cells(Range("D65536") me semblait juste. Ensuite, j'ai mis une "*" dans mon find car je recherche toutes les valeurs entre "||". Et pareil dans mon replace.

    Le problème c'est que ce que tu m'as donné fonctionne avec une valeur |A| dans la colonne B mais dans une autre colonne ça ne fonctionne pas. En plus, il ne me trouve pas mes |*| s'il y'a du texte avant ou après ).

    Je ne comprends plus...

  14. #14
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    On est reparti !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Repeattttttt()
    Dim c As Range
    Worksheets("Feuil1").activate 'nécessaire pour le usedrange que j'utilise ici
    With Activesheet.usedrange
        Set c = .Find("*|*|*", LookIn:=xlValues, lookat:=xlPart)
        If Not c Is Nothing Then
            MsgBox (c)
            Deb = c.Address
            Do
               Range(c.Address) = Replace(c, "|*|", "Ah Ah !")
            Loop While Not c Is Nothing And c.Address <> Deb
        End If
    End With 
    End Sub
    Sans filet, pas testé. Tu peux tester pour moi ?

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut
    Malheureusement, on est reparti

    Je viens de tester et ça avance mais c'est y'a quelques problèmes. Tout d'abord, ça ne boucle pas. Ca détecte une valeur |*| peu importe où dans la feuille mais ne passe pas à la suivante. En tout cas, les valeurs sont détectées peu importe s'il y'a du texte avant ou pas. Je dis que ça ne boucle pas parce que la valeur suivante est détectée lorsque j'efface celle d'avant

    Et deuxième chose, le remplacement ne se fait pas. (J'ai bien la MsgBox qui s'affiche mais pas de remplacement : par contre là où j'aurais dû avoir mon remplacement, le texte change de couleur Enfin bon...).

    En tout cas merci, tu me donnes beaucoup de ton temps et j'apprécie vraiment (C'est par où les donnations? )

  16. #16
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Je t'avais donné un code incluant "aut'chose... (malheureusement effacé le triste mercredi noir 23 juillet à 5h00)
    Si tu l'as, alors regarde-le... et ajoute ce qui manque...
    Allez, je suis brave !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    With Activesheet.usedrange
        Set c = .Find("*|*|*", LookIn:=xlValues, lookat:=xlPart)
        If Not c Is Nothing Then
            MsgBox (c)
            Deb = c.Address
            Do
               Range(c.Address) = Replace(c, "|*|", "Ah Ah !")
               Set c = .FindNext(c)
            Loop While Not c Is Nothing And c.Address <> Deb
        End If
    End With
    Bonne journée

    Edit
    Tiens, cela n'a pas été effacé, regarde , manque un guillemet mais Set c = .FindNext(c) est bien

    C'est l'ajout du guillement qui a été effacé, je savais bien !

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut
    Merci !!! On y est presque, c'est juste le replace qui ne marche pas et ça ne va pas tarder

    Pour mon test, j'ai, dans la colonne D, deux cellules qui contiennent les valeurs "1 - (Référence : |A|)" et "1 - (Référence locale : |A|)". A la base, ces valeurs étaient en rouge. Elles ont juste été passées en noir et mes |A| n'ont pas été transformés en "Ah Ah !"

    EDIT : après un petit test, voilà d'où ça vient !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range(c.Address) = Replace(c, "|*|", "Ah Ah !")
    Le programme n'arrive pas à faire le "replace" d'un caractère variable contenu entre deux "|". Si je remplace par |A| dans la formule, ça marche et mes |A| sont bien replacés par "Ah Ah !".

  18. #18
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonjour (et ce sera ma seule intervention dans cette discussion)...

    Je pars ici de la chaîne que tu as localisée. Appelons-là toto ...

    Voilà comment la traiter (sans ce Replace,)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Command1_Click()
      dim toto as string, machin as string, pos1 as integer, pos2 as integer
      toto = "blabla blabla |A-B| blablabla blabla"
      pos1 = InStr(toto, "|")
      pos2 = InstrRev(toto, "|")
      machin = Mid(toto, pos1 + 1, pos2 - pos1 - 1)
      toto = Left(toto, pos1) & "coucou me voilà" & Mid(toto, pos2)
      MsgBox toto & vbCrLf & _
      "pour ton information , tu avais la chaîne " & machin & " entre tes deux |"
    End Sub
    Tu noteras que j'ai voulu isoler machin (juste pour le cas où tu en aurais également besoin). Tu peux le supprimer si non nécessaire.

    Refléchis juste un peu et bonne chance...

    Edit : note bien que ce n'est là qu'une solution parmi des dizaines possibles (et toutes du niveau débutant).

  19. #19
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    J'aurais une autre approche car je pense que les remplacements varient en fonction de ce que |*| te "ramène (ce que ucfoutu ne peut pas savoir, la première discussion ayant été effacée)
    De mémoire tu as dit que ce pouvait être |A| ou |B| ou |A-B| ou ... à remplacer selon les cas par ceci ou cela...
    Si je ne me trompe pas, alors je ferais ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub appel()
    Dim Remplaçants, i as byte
         Remplaçants = array("|A|", "|B|", "|A-B|")
         For i = 0 to Ubound(Remplaçants)
              Repeattttttt Remplaçants(i)
         Next
    End sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Sub Repeattttttt(Mot)
    Dim c As Range
    Worksheets("Feuil1").activate With Activesheet.usedrange
        Set c = .Find("*|*|*", LookIn:=xlValues, lookat:=xlPart)
        If Not c Is Nothing Then
            Deb = c.Address
            Do
               Select case Mot
                    Case "|A|"
                         Range(c.Address) = Replace(c, Mot, "Ah Ah !")
                    Case "|B|"
                         Range(c.Address) = Replace(c, Mot, "Eh Béh !")
                    Case "|A-B|"
                         Range(c.Address) = Replace(c, Mot, "Ah Béh !")
               End select
               Set c = .FindNext(c)
            Loop While Not c Is Nothing And c.Address <> Deb
        End If
    End With
    Tu dis
    A+

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    682
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 682
    Points : 723
    Points
    723
    Par défaut
    Bon, ça m'a enervé et je crois, en fait, qu'il n'est pas possible de faire un Replace sur des "*". J'ai donc procédé autrement, en y réfléchissant un peu, mais j'ai juste un petit problème de syntaxe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Sub Repeattttttt()
     
    Dim c As Range, Var As String
     
    Worksheets("Albert").Activate
    With ActiveSheet.UsedRange
        Set c = .Find("*|*|*", LookIn:=xlValues, lookat:=xlPart)
        If Not c Is Nothing Then
            Deb = c.Address
            Do
                Var = Mid(c, InStr(c, "|"), (Len(c) - InStr(c, "|")))
                MsgBox (Var)
                'Range(c.Address) = Replace(c, Var, VarVar)
                Set c = .FindNext(c)
            Loop While Not c Is Nothing And c.Address <> Deb
        End If
    End With
     
    End Sub
    Dans ma variable "Var" (épatant non? ), j'ai stocké ce que je devais doubler (mes |*| donc). Il ne me reste donc plus qu'à faire un replace dans ma chaîne "c" de "Var" par "VarVar". Mais comment l'écrire?

    'Range(c.Address) = Replace(c, "&Var", "&Var&Var") ?

    EDIT : j'avais pensé à ce que tu as mis au-dessus mais j'ai vite abandonné. Effectivement, il peut y avoir A, B ou A-B. Le problème c'est que ça peut être n'importe quelle lettre de l'a(na?)lphabet et n'importe quelle combinaison et j'aime pas le copier-coller pour résoudre tous les cas

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2007] Comment rechercher une dernière valeur spécifique dans une colonne.
    Par jurdenis21 dans le forum Excel
    Réponses: 7
    Dernier message: 12/01/2013, 15h11
  2. [MySQL] Recherche FULL TEXT IN BOOLEAN MODE et les Quotes
    Par GarGamel55 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 23/01/2006, 20h01
  3. supprimer une table qui a des quotes dans son nom
    Par kleenex dans le forum Access
    Réponses: 2
    Dernier message: 17/10/2005, 16h03
  4. Réponses: 7
    Dernier message: 26/10/2004, 11h02

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