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 :

Comparaison de 2 chaines


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2006
    Messages
    542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 542
    Par défaut Comparaison de 2 chaines
    Bonsoir à tous

    N'ayant rien trouvé d'équivalent, voici ma question.

    J’aimerais faire une comparaison de 2 chaînes en VBA de ce type :

    "abcd" et "adbc" (mêmes caractères, mais pas à la même place) et que cela soit Vrai.

    Le nombre de caractères peut aller jusqu’à une bonne vingtaine. Il peut y avoir plusieurs fois les mêmes caractères, mais la comparaison est 1 pour 1, c’est à dire : "abcda" = Vrai avec "dbcaa" , mais pas "dbca"

    Merci d’avance pour votre aide

    Eric

  2. #2
    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
    Par défaut
    Bonjour,

    je vais d'abord te laisser faire sur ces indications, de sorte à ce que ty t'y mettes toi également) :
    - boucler caractère par caractère sur la chaine 1
    - utiliser instr pour vérifier si ce caractère est dans la chaine2
    - si pas dans la chaine2 ===>> faux et quitter la boucle
    - si dans la chaine 2 : le supprimer de la chaine 2

    - continuer la boucle

  3. #3
    Membre émérite
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2006
    Messages
    542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 542
    Par défaut
    Bonsoir à tous
    Bonsoir ucfoutu

    Merci de ta réponse plus que rapide, je dirais..... immédiate.

    J'avais espéré un "Like" ou un "Find" super élaboré, mais cela n'a pas l'air d'exister

    Eric

  4. #4
    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
    Par défaut
    Non, aucune fonction pré-existante ne fera ce que tu cherches à faire et qui s'exprime tout simplement ainsi :

    "Vérifier si une chaine est un anagramme d'une autre chaine et retourner True ou False, selon le cas".

    Mais c'est relativement facile (surtout après ce que je t'ai indiqué).
    Reviens donc si tu rencontres (en nous l'exposant) une difficulté d'application.

    EDIT :
    C'est même très très très facile...
    Je viens de mettre en application ce que je t'ai indiqué ===>> 7 lignes de code (dont 3 seulement qui en sont réellement) et en moins de 75 secondes (chrono en main), essais compris...

    Alors : à toi maintenant et tu seras ensuite le bienvenu si besoin en était

  5. #5
    Membre émérite
    Homme Profil pro
    retraité
    Inscrit en
    Mai 2006
    Messages
    542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mai 2006
    Messages : 542
    Par défaut
    Re

    Voilà ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub test_comparaison()
    Dim a, b, i, test, caractere_cherche    'initialisation mini pour tester
    a = "abcd"
    b = "dcba"
    For i = 1 To 4
        caractere_cherche = Mid(a, i, 1)
        test = InStr(1, b, caractere_cherche, 1)
        If test <> 0 Then b = Replace(b, caractere_cherche, "") Else Exit For
    Next i
    End Sub
    Merci ucfoutu

    Eric

  6. #6
    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
    Par défaut
    Je te félicite (tu vois, quand on veut ? )

    Juste une chose pour avoir une meilleure performance : évite le replace (gourmand) et préfère-lui une gestion directe.

    Tu peux le faire ainsi (exemple) :

    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
    Option Explicit
    Private Sub Command1_Click()
      Dim chaine1 As String, chaine2 As String
      chaine1 = "bazoukabazoukaabcde bazoukabazoukaabcde bazoukabazoukaabcde voilà voilà voilà"
      chaine2 = "àivlo zakabouzakabouedcba zakabouzakabouedcba zakabouzakabouedcba vloià iàvol"
      MsgBox anagramme_oui_non(chaine1, chaine2)
    End Sub
     
     
    Private Function anagramme_oui_non(ByVal ch1 As String, ch2 As String) As Boolean
      Dim i As Integer, pos As Integer
      If Len(ch1) <> Len(ch2) Then Exit Function
      For i = 1 To Len(ch1)
        pos = InStr(ch2, Mid(ch1, i, 1))
        If pos = 0 Then Exit Function
        ch2 = Left(ch2, pos - 1) & Mid(ch2, pos + 1)
      Next
      anagramme_oui_non = True
    End Function
    C'est suffisamment rapide (très) pour que je ne t'encourage pas à mettre en oeuvre une autre méthode (non encore à ton niveau) très légèrement plus rapide.

    Félicitation et bonne nuit.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2007
    Messages
    491
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 491
    Par défaut
    bonjour,

    Je pense que tu peux utiliser une fonction récursive.

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

Discussions similaires

  1. [VB6] comparaison d'une chaine ligne par ligne
    Par kubiczek dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 11/05/2006, 22h52
  2. Comparaison de deux chaines
    Par sam.fet dans le forum Linux
    Réponses: 5
    Dernier message: 09/05/2006, 14h54
  3. comparaison de deux chaines de caractères
    Par zazou41 dans le forum C++
    Réponses: 6
    Dernier message: 27/02/2006, 14h26
  4. Comparaison de 2 chaines
    Par harlock59 dans le forum Linux
    Réponses: 1
    Dernier message: 10/12/2005, 01h06
  5. Réponses: 5
    Dernier message: 06/10/2003, 17h49

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