Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 07/03/2010, 14h41   #1
Invité de passage
 
Inscription : février 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 4
Points : 1
Points : 1
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
Type de fichier : xls CompChaine.xls (20,5 Ko, 6 affichages)

Dernière modification par idrysse31 ; 07/03/2010 à 14h50. Motif: Mauvais fichier joint
idrysse31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2010, 16h03   #2
Rédacteur/Modérateur
 
Avatar de Philippe JOCHMANS
 
Homme Philippe JOCHMANS
Développeur informatique
Inscription : mai 2005
Messages : 17 173
Détails du profil
Informations personnelles :
Nom : Homme Philippe JOCHMANS
Âge : 43
Localisation : France, Loir et Cher (Centre)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Communication - Médias

Informations forums :
Inscription : mai 2005
Messages : 17 173
Points : 29 874
Points : 29 874
Envoyer un message via MSN à Philippe JOCHMANS Envoyer un message via Skype™ à Philippe JOCHMANS
Bonjour

Merci de mettre le code dans la discussion

Tout le monde n'ouvre pas les fichiers Excel.

Philippe
__________________
Détaillez vos questions, sinon vous aurez des réponses erronées et vous irez tout droit dans le et lisez les règles sinon
Si vous pensez commencer sans un livre, oublier : livres pour débuter
Vous pouvez consulter mes articles sur Access et PowerPoint
Le blog Office.

Inutile de m'envoyer un MP pour des questions techniques ou de me relancer , je n'y répondrais pas.
Philippe JOCHMANS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2010, 18h02   #3
Membre Expert
 
Avatar de laetitia
 
Inscription : décembre 2002
Messages : 1 281
Détails du profil
Informations personnelles :
Âge : 21

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

Code :
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
__________________
SALUTATIONS
laetitia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2010, 18h49   #4
Invité de passage
 
Inscription : février 2010
Messages : 4
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 4
Points : 1
Points : 1
Bonjour à tous,

Philippe, le code original est le suivant :

Code :
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 :
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
idrysse31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2010, 20h25   #5
Inactif
 
Inscription : février 2010
Messages : 517
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 517
Points : 513
Points : 513
Salut à toutes et tous,

J'ai lu :
1) les explications données, à savoir ;
Citation:
Cette liste est issue d'un autre fichier (copier/coller).
et :
Citation:
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 :
Citation:
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 :
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 :
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 .
babaothe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2010, 07h58   #6
Inactif
 
Inscription : février 2010
Messages : 517
Détails du profil
Informations forums :
Inscription : février 2010
Messages : 517
Points : 513
Points : 513
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 :
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 :
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 :
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 :
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

Dernière modification par babaothe ; 08/03/2010 à 10h46.
babaothe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2010, 12h01   #7
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 201
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 201
Points : 4 195
Points : 4 195
Bonjour,

Citation:
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 :
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
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 07h07.


 
 
 
 
Partenaires

Hébergement Web