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 :

Résultat non attendu de l'opérateur Like


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Résultat non attendu de l'opérateur Like
    Bonjour,

    comme expliqué dans le titre, j'obtiens un résultat que je ne comprends en utilisant l'opérateur like.

    Pour simplifier :
    - j'ai d'un côté une liste d'individus contenant leur nom suivi de leur prénom complet ou abrégé (première lettre du prénom suivi d'un point). Cette liste est issue d'un autre fichier (copier/coller).
    - j'ai d'un autre côté un individu X identifié par son nom suivi de son prénom complet (non abrégé).

    Le but simplifié de la macro est de savoir si l'individu X apparaît dans la liste.
    Pour cela, j'utilise l'opérateur like mais le résultat n'est pas celui attendu : même lorsque l'individu X est dans la liste, le résultat est 'false'.

    Je joins à ma discussion un code simplifié.

    Merci d'avance pour votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Merci de mettre le code dans la discussion

    Tout le monde n'ouvre pas les fichiers Excel.

    Philippe

  3. #3
    Membre expérimenté Avatar de laetitia
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 281
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 281
    Points : 1 512
    Points
    1 512
    Par défaut
    bonjour idrysse31 Philippe le forum essai comme cela!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Option Explicit
    Option Compare Text
    Sub es()
      Dim i As Long
      Application.ScreenUpdating = False
        For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
           If Cells(i, 1) Like "*" & Cells(1, 2) & "*" Then
           Cells(i, 3) = "Comparaison OK"
            Else
           Cells(i, 3) = "Comparaison Not OK"
            End If
         Next i
    End Sub

  4. #4
    Futur Membre du Club
    Inscrit en
    Février 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Bonjour à tous,

    Philippe, le code original est le suivant :

    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
     
     
    Sub test()
     
        For i = 1 To 5
            If Right(Cells(i, 1), 1) = "." Then
                If Cells(1, 2) Like Left(Cells(i, 1), Len(Cells(i, 1)) - 1) Then
                    Cells(i, 3) = "Comparaison OK"
                Else
                    Cells(i, 3) = "Comparaison Not OK"
                End If
            Else
                If Cells(1, 2) Like "*" & Cells(i, 1) & "*" Then
                    Cells(i, 3) = "Comparaison OK"
                Else
                    Cells(i, 3) = "Comparaison Not OK"
                End If
            End If
        Next
     
    End Sub
    Laetitia, en utilisant le code suivant, ça ne marche toujours pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Option Explicit
    Option Compare Text
    Sub es()
      Dim i As Long
      Application.ScreenUpdating = False
        For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
           If Cells(1, 2) Like "*" & Cells(i, 1) & "*" Then
           Cells(i, 3) = "Comparaison OK"
            Else
           Cells(i, 3) = "Comparaison Not OK"
            End If
         Next i
    End Sub

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    Salut à toutes et tous,

    J'ai lu :
    1) les explications données, à savoir ;
    Cette liste est issue d'un autre fichier (copier/coller).
    et :
    j'ai d'un autre côté un individu X identifié par son nom suivi de son prénom complet (non abrégé).
    2)le code de laeticia (qui est intelligent, mais...)
    3) les réactions de idrysse31 :
    Laetitia, en utilisant le code suivant, ça ne marche toujours pas
    Et j'en tire personnellement quelques conclusions, que voilà :
    - le code donné par laeticia ne peut fonctionner que si les "choses" sont les mêmes, en ce qui concerne les caractères présents dans les deux cas. Il ne le peut si "croche en pattes"
    - "croche en pattes" ?, c'est quoi, çà ?
    Cà, ce peut être le résultat du "copier-coller" dont il est parlé en 1, pardi !
    Copier/coller comment et à partir de quoi ?
    Qui dit que ce copier/ coller ne contient pas, en lieu et place d'un espace (caractère 32), un tout autre caractère (tiens : au hasard : le caractère 160)
    Et alors là ? ===>> Ben ===>> le code de Laeticia "tomberait bien évidemment à l'eau"... Non , Laeticia ? ... N'est-ce pas ? )
    Bon ... passons à du sérieux :
    1) remplacer dans la liste copiée/collée le caractère 160 par le caracxtère 32 (qui, lui, semble être utilisé dans l'autre....
    2) essayer de traiter autrement : jouer sur l'espace : travailler avec un tableau dynamique pour alimenter un dictionnaire (Allez, Laeticia, vas-y : c'est la bonne voie). Utiliser ce dictionnaire pour chacun des articles de la deuxième liste.

    Moi, je vous laisse ici ('le reste est trop simple )

    Ah ouui :
    Une manière de vérifier le bien fondé de mes suppositions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    NOM = Cells(1, 1).Value
      For i = 1 To Len(NOM)
        MsgBox Asc(Mid(NOM, i, 1))
      Next
    Cà, c'est pour le 1er article dfe la première liste (celle copiée/collée)
    puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    NOM = Cells(1, 2).Value
      For i = 1 To Len(NOM)
        MsgBox Asc(Mid(NOM, i, 1))
      Next
    Cà, c'est pour ceux de la deuxième liste..
    Je parie que dans la deuxième figure le caractère 32 qui ne figure pas dans la 1ère ! .
    Sans toutefois réellement le parier, je n'exclurais pas qu'on trouvera dans la 1ère le caractère 160 en lieu et place du caractère 322.
    Bon amusement à toutes et tous .

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Février 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 517
    Points : 617
    Points
    617
    Par défaut
    Voilà ce que je vous propose, sur la base de deux listes, l'une en colonne A et l'autre en colonne B.
    Cette manière de procéder permet tout, dans les deux sens (y compris si certains prénoms sont également du type L. dans colonne B etr y compris si dans colonne B on trouve également des chr(160))
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Option Explicit
    Option Compare Text
     
    Private Sub CommandButton1_Click()
     
      Dim i As Long, tablo, NOM As String, PRENOM As String, pos As Integer
      Dim dico As Object
      Set dico = CreateObject("Scripting.Dictionary")
      NOM = Cells(3, 1).Value
      tablo = Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row).Value
      For i = 1 To UBound(tablo, 1)
         NOM = Trim(Replace(tablo(i, 1), Chr(160), " "))
         pos = InStr(NOM, " ")
         PRENOM = IIf(pos > 0, Mid(NOM, pos + 1, 1) & ".", "")
         If pos Then
           NOM = Left(NOM, pos - 1)
         End If
         If Not dico.exists(NOM & " " & PRENOM) Then dico.Add NOM & " " & PRENOM, i
      Next
      Erase tablo
      tablo = Range("B1:B" & Cells(Rows.Count, 1).End(xlUp).Row).Value
      For i = 1 To UBound(tablo, 1)
         NOM = Trim(Replace(tablo(i, 1), Chr(160), " "))
         pos = InStr(NOM, " ")
         PRENOM = IIf(pos > 0, Mid(NOM, pos + 1, 1) & ".", "")
         If pos Then
           NOM = Left(NOM, pos - 1)
         End If
         If dico.exists(NOM & " " & PRENOM) Then
            MsgBox " j'ai en colonne B " & tablo(i, 1) & "    qui correspond à un individu en colonne A"
         End If
      Next
    End Sub
    Un commentaire : je trouve que ce genre de traitement est assez dangereux pour plusieurs raisons :
    DURAND G. pourrait par exemple en effet correspondre tant à DURANG Georges, qu'à DURAND Gaston ou qu'à DURAND Gustave !

    J'ai établi ce code sur l'hypothèse de présence de chr(160), que je pense probable. Il se pourrait toutefois que l'espace soit dans les faits représenté par un autre caractère. Le petit test que j'ai mis à la fin de mon message précédent permettra de le repérer, ce caractère, et de l'utiliser alors en lieu et place, dans mon code, du chr(160)

    Voilà.

    EDIT : si vous voulez en plus connaître la ligne de l'homonyme en colonne A, voilà comment modifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If dico.exists(NOM & " " & PRENOM) Then
       MsgBox " j'ai en colonne B " & tablo(i, 1) & "    qui correspond à un individu en colonne A, ligne " & dico(NOM & " " & PRENOM)
    End If

    EDIT IMPORTANT
    :
    Il n'est par ailleurs pas impossible que la présence d'un caractère de séparation (que je suppose être le chr(160)) ne résulte pas de l'origine d'un copier/coller, mais soit délibérée.
    Je m'explique : certains noms patronymiques pourraient être composés et sans tiret (Exemple : Mac ARTHUR). Un caractère spécial (probablement le chr(160) est alors quelquefois utilisé pour séparer le nom patronymique (qui, lui, peut contenir un véritable espace) et le prénom.
    Que convient-il de faire dans un tel cas ?
    remplacer dans mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     NOM = Trim(Replace(tablo(i, 1), Chr(160), " "))
         pos = InStr(NOM, " ")
         PRENOM = IIf(pos > 0, Mid(NOM, pos + 1, 1) & ".", "")
         If pos Then
           NOM = Left(NOM, pos - 1)
         End If
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    NOM = Trim(tablo(i, 1))
         pos = InStr(NOM, chr(160))
         PRENOM = IIf(pos > 0, Mid(NOM, pos + 1, 1) & ".", "")
         If pos Then
           NOM = Left(NOM, pos - 1)
         End If
    tout simplement (et on gardera de cette manière l'espace (vrai) du patronyme, tout en séparant (à l'aide du chr(160) le prénom du patronyme

  7. #7
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    Bonjour,

    Pour simplifier :
    - j'ai d'un côté une liste d'individus contenant leur nom suivi de leur prénom complet ou abrégé (première lettre du prénom suivi d'un point). Cette liste est issue d'un autre fichier (copier/coller).
    - j'ai d'un autre côté un individu X identifié par son nom suivi de son prénom complet (non abrégé).

    Le but simplifié de la macro est de savoir si l'individu X apparaît dans la liste.
    je n'ouvre pas les fichiers joints et je me base sur ton énoncé première, ce qui ressemble fort à du traitement de données.
    Si on en déduit que tu veux trouver les occurrences d'une chaîne données dans des plages de cellules diverses (ou non), il est très énergivore d'utiliser des boucles, surtout si les plages en questions peuvent être de grandes dimension.

    Faire appel à des commandes natives peut se révéler beaucoup plus rapide.

    Je te soumet un extrait brut d'un code d'une vieille appli de dvdthèque perso qui pourrait répondre à ton besoin.

    Il s'agit au moment de la création d'une nouvelle fiche de vérifier si elle n'existe pas déjà. Si on confirme que l'on veut garder la saisie, il continue à parcourir la base et signale chaque positif jusqu'à épuisement des données.

    Dans l'image ci-dessous, j'ai saisi manuellement la valeur de NR2
    qui est la chaîne recherchée soit : "coups (les" et obtenu le résultat dans l'image. Si je supprime l'espace entre coups et la parenthèse, il ne trouve, fort logiquement, rien.

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    Option Explicit
     
    Sub EcritNew()
    Dim Comptit As String
    Dim Compact As String
    Dim Compcom As String
    Dim Rep As Byte
    Dim Rep5 As Byte
    Dim NR2 As String
    Dim Feuill5 As Object
    Dim Prem1 As String, Prem2 As String
    Dim nbLign As Integer
     
    'Call NoProtect
    'Call AttriNom
    Application.ScreenUpdating = False
     
     NR2 = "coups (les"
     
     For Each Feuill5 In Worksheets
        If Feuill5.Name <> ("Données") And Feuill5.Name <> ("PassNews") Then
        Feuill5.Activate
        Range("A6", Range("A65536").End(xlUp)).Select
        If Selection.Find(NR2) Is Nothing Then
            Range("A6").Select
            Worksheets(1).Activate
            Range("A6").Select
        Else
          Selection.Find(NR2, after:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, _
                SearchOrder:=xlByRows, SearchDirection:=xlNext).Activate
            Comptit = ActiveCell.Value
            Compact = ActiveCell.Offset(0, 1).Value
            Compcom = ActiveCell.Offset(0, 2).Value
     
          Rep5 = MsgBox("Ce Titre paraît exister, ci-dessous les ressemblances, Gardez vous cette Saisie ?" & Chr$(10) & Chr$(10) & _
                Comptit & " :  " & Compact & "  " & Compcom & "  ", vbYesNo + vbQuestion, "Home DVD application")
            Prem1 = ActiveCell.Address
            If Rep5 = vbNo Then
                Exit Sub  ' passe par maj2...
              Else
                While Rep5 = vbYes
                        Selection.FindNext(after:=ActiveCell).Activate
                        Comptit = ActiveCell.Value
                        Compact = ActiveCell.Offset(0, 1).Value
                        Compcom = ActiveCell.Offset(0, 2).Value
                        Prem2 = ActiveCell.Address
                            If Prem2 <> Prem1 Then
                                Rep5 = MsgBox("Ce Titre paraît exister, Gardez vous cette Saisie ?" & Chr$(10) & Chr$(10) & _
                Comptit & " :  " & Compact & "  " & Compcom & "  ", vbYesNo + vbQuestion, "Home DVD application")
                                If Rep5 = vbNo Then Exit Sub
                            Else
                                Rep5 = vbNo
                            End If
                Wend
            End If
        End If
        End If
      Next Feuill5
    End Sub

    cordialement,

    Didier

Discussions similaires

  1. [JAXB] Résultat non attendu
    Par SpeedOverflow dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 23/06/2011, 10h45
  2. sdelete et reaser : résultat non attendu
    Par DSGSLA dans le forum Sécurité
    Réponses: 4
    Dernier message: 16/03/2011, 11h17
  3. résultat d'un update non attendu
    Par the_frogkiller dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/07/2009, 10h43
  4. Opérateur Like
    Par clems34 dans le forum PostgreSQL
    Réponses: 10
    Dernier message: 26/08/2005, 16h22
  5. Opérateur like
    Par Troopers dans le forum ASP
    Réponses: 3
    Dernier message: 15/09/2003, 19h19

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