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 :

Chaîne la plus grande présente dans une sous chaîne [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre émérite

    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Juin 2012
    Messages
    877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2012
    Messages : 877
    Points : 2 427
    Points
    2 427
    Par défaut Chaîne la plus grande présente dans une sous chaîne
    Bonjour le Forum,

    Je me heurte à un problème de chaîne de caractère.

    Je dispose de deux colonnes : la première contient des chaînes composées de deux parties disons A et B
    la deuxième contient uniquement des chaînes de parties A.

    Je souhaite trouver A dans ma première colonne et donc écrire B.

    Exemple :

    Dans une ligne de ma première colonne, j'ai TOOLS-ALL
    Dans une ligne (pas le même numéro) de ma deuxième colonne, j'ai TOOLS.

    Je veux donc trouver TOOLS dans ma première colonne et donc isoler ALL (sans le tiret de début) dans une variable.

    Plusieurs contraintes :
    Dans les parties A, je peux avoir plusieurs tirets (DER-FGR-GTY)
    Dans les parties B également. (DER-FGR-GTY-GHUI-YJNG)

    J'ai réussi à la faire en statique via des formules (NBCAR, CHERCHE, STXT) mais cela est utilisé dans un Userform ensuite et il me faudrait du VBA.

    Des pistes ?

    Merci.

    Miistik
    Si la réponse vous a été donnée, pensez au Tag .
    Un petit aide à se sentir utile. Merci.

    "La folie. C'est de faire et refaire la même chose en espérant que le résultat sera différent."
    Albert Einstein

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Par formule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SUBSTITUE(A12;D12&"-";"")
    En Vba
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Replace(MotA, MoTB & "-", "")
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  3. #3
    Membre émérite

    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Juin 2012
    Messages
    877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2012
    Messages : 877
    Points : 2 427
    Points
    2 427
    Par défaut
    Bonjour,

    Cela fonctionne merci.

    Cependant, l'exemple utilisé est "statique".

    Fonctionnellement, je dispose d'une valeur dans un ComboBox qui correspond à une valeur de ma première colonne.
    Dans un Textbox, je souhaite écrire la partie A (TOOLS dans mon exemple).
    Dans le ComboBox initial, écrire B (ALL dans mon exemple).

    Le souci provient du fait que je ne sais pas où se trouve A dans ma deuxième colonne.
    Je dispose juste du nom complet A et B (avec A=TOOLS et B=ALL séparé par un tiret)

    Je souhaite donc vraiment (comme le titre) chercher la plus grande chaîne (de ma deuxième colonne) présente dans une chaîne (celle de ma première colonne)

    Exemple :
    Je dispose de ERF-GHT-YHJN-TYU-TGV-GHN-UJN (première colonne)

    Je souhaite matcher avec la plus grande chaîne de ma deuxième colonne.
    Donc ERF-GHT matche
    ERF-GHT-YHJN matche
    ERF-GHT-YHJN-TYU-TGV-GHN matche.
    Je vais donc garder ERF-GHT-YHJN-TYU-TGV-GHN .
    Si la réponse vous a été donnée, pensez au Tag .
    Un petit aide à se sentir utile. Merci.

    "La folie. C'est de faire et refaire la même chose en espérant que le résultat sera différent."
    Albert Einstein

  4. #4
    Membre confirmé
    Homme Profil pro
    conseiller
    Inscrit en
    Janvier 2013
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : conseiller
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 367
    Points : 649
    Points
    649
    Par défaut
    Bonjour,
    tu peux utiliser Instr pour déterminer la correspondance entre les différentes valeurs de la colonne B et la valeur testée en colonne A.
    A chaque fois qu'une correspondance est trouvée tu compares la longueur de la chaîne de la correspondance avec celles précédemment trouvée et tu gardes la chaîne la plus longue.
    EX:
    1ère correspondance ERF-GHT je la stocke dans une variable texte
    2ème correspondance ERF-GHT-YHJN-TYU-TGV-GHN => je compare la longueur des 2 chaines et garde ERF-GHT-YHJN-TYU-TGV-GHN
    3ème correspondance : ERF-GHT-YHJN => je compare la longueur des 2 chaines et garde ERF-GHT-YHJN-TYU-TGV-GHN
    A+

  5. #5
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Bonjour.

    Une illustration de la fonction Instr (suggestion de davido84) et de la fonction Mid

    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
    20
    21
    22
    23
    Sub tt()
    For ja = 1 To 19
     
     chaineA = Cells(ja, "A")
     
     maxi = 0
     memLigne = 0
     
    For i = 1 To 19
     
     chaineD = Cells(i, "D")
     If InStr(chaineA, chaineD) = 1 Then 'ou If Mid(chainea, 1, Len(chaineD)) = chaineD Then
      If Len(chaineD) > maxi Then
       maxi = Len(chaineD)
       memLigne = i
      End If
     End If
     
    Next
     Cells(ja, 2) = memLigne
     
    Next
    End Sub
    Cordialement

    Docmarti.

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut heu
    bonjour
    Exemple :
    Je dispose de ERF-GHT-YHJN-TYU-TGV-GHN-UJN (première colonne)

    Je souhaite matcher avec la plus grande chaîne de ma deuxième colonne.
    Donc ERF-GHT matche
    ERF-GHT-YHJN matche
    ERF-GHT-YHJN-TYU-TGV-GHN matche.
    Je vais donc garder ERF-GHT-YHJN-TYU-TGV-GHN .
    si je me fis a ton exemple et donc que les portions identique sont dans le meme ordre dans A et B c'est d'une simplicité absolu

    exemple
    en A1 tu a "ERF-GHT-YHJN-TYU-TGV-GHN-UJN"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    chaine=range("A1")
    for i= 1 to len(chaine)
    set cel=columns("B:B").find(mid(chaine,1,i),lookat:=xlpart)
    if not cel is nothing then chaineB=mid(chaine,1,i)
    next
    msgbox chaineB
    et tu peut metre le tout dans une autre boucle pour toute les lignes de A




    maintenant si les portions ne sont pas forcement dans le meme ordre on peut commencer a parler de regular expression ,matches,submatches, like, etc....

    utilisation de 2 variable object "vbscript.regex")
    la premier decoupe la chaine A par un patern du genre pattern="(\D+)+[/\-/]"
    la 2 eme decoupe la chaineB idem
    et comparaison des match
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Membre émérite

    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Juin 2012
    Messages
    877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2012
    Messages : 877
    Points : 2 427
    Points
    2 427
    Par défaut
    Bonjour,

    Merci à vous pour la diversité des solutions.

    J'obtiens bien ce que je souhaite. A moi d'automatiser un peu plus tout cela.

    @patricktoulon : Je ne commenterai pas la "simplicité absolu" mais merci quand même.
    Si la réponse vous a été donnée, pensez au Tag .
    Un petit aide à se sentir utile. Merci.

    "La folie. C'est de faire et refaire la même chose en espérant que le résultat sera différent."
    Albert Einstein

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 31/10/2015, 16h53
  2. cherche la plus grande valeur dans une matrice
    Par thtghgh dans le forum MATLAB
    Réponses: 9
    Dernier message: 28/12/2009, 19h35
  3. Sous-chaîne dont les bornes sont dans une autre colonne
    Par Rak111 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 09/11/2009, 20h58
  4. [RegEx] Sous-chaîne dans une sous-chaîne : optimisation RegExp
    Par mathieugamin dans le forum Langage
    Réponses: 3
    Dernier message: 17/12/2007, 08h44
  5. Recherche d'une chaîne dans une sous chaîne
    Par teen6517 dans le forum Langage
    Réponses: 3
    Dernier message: 29/03/2007, 19h10

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