Recherche complexe pour un novice

Bonjour,

je souhaites pouvoir faire une recherche dans un fichier, de plaque d'imatriculation.

il faudrait taper le numero recherché dans une celulle et que je sois ensuite orienté sur la celulle corespondante des deux colonnes (voir tableau)

le probleme c'est qu'il doit prendre en compte aussi le plus approchant : exemple 97-WCA-54, doit pouvoir aussi renvoyer vers 97WCa 54 dans le tableau, raison pour laquelle un simple filtrage ne suffit pas.

Je vous remercie de votre aide sachant que je débute.

4listing-badge.zip (125.62 Ko)

Php

Bonjour PHP, bonjour le forum,

En pièce jointe ton fichier modifié avec la macro événementielle Change ci-dessous. Tape une valeur en P3 et valide avec la touche [Entrée]. Lescellules contenant le texte tapé se colorent de rouge...

Le code :

Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim VC As String 'déclare la variable VC (Valeur Cherchée)
Dim VT14 As String 'déclare la variable VT14 (Valeur Tableau colonne 14)
Dim VT15 As String 'déclare la variable VT14 (Valeur Tableau colonne 15)

If Target.Address <> "$P$3" Then Exit Sub 'si le changement a lieu ailleurs qu'en P3, sort de la procédure
Columns("N:O").Interior.Color = xlNone 'enlève les couleurs aux colonnes N et O
If Target.Value = "" Then Exit Sub 'si P3 est effacée, sort de la procédure
TV = Me.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes i du tableau des valeurts TV
    'définit la valeur cherchée VC (en supprimant les espaces s'il y en a)
    VC = IIf(InStr(1, Target.Value, " ", vbTextCompare) > 0, UCase(Replace(Target.Value, " ", "")), UCase(Target.Value))
    'redéfinit la valeur cherchée VC (en supprimant les tirets s'il y en a)
    VC = IIf(InStr(1, Target.Value, "-", vbTextCompare) > 0, UCase(Replace(Target.Value, "-", "")), VC)
    If Not TV(I, 14) = "" Then 'condition : si la donnée ligne I colonne 14 de TV n'est pas vide
        'définit la valeur du tableau en colonne 14 VT14 ((en supprimant les espaces s'il y en a)
        VT14 = IIf(InStr(1, TV(I, 14), " ", vbTextCompare) > 0, UCase(Replace(TV(I, 14), " ", "")), TV(I, 14))
        'redéfinit la valeur du tableau en colonne 14 VT14 ((en supprimant les tirets s'il y en a)
        VT14 = IIf(InStr(1, TV(I, 14), "-", vbTextCompare) > 0, UCase(Replace(TV(I, 14), "-", "")), VT14)
        'si la valeur cherchée VC est contenue dans VT14, colore la cellule de rouge
        If VT14 Like "*" & VC Then Cells(I, 14).Interior.ColorIndex = 3
    End If 'fin de la condition
    If Not TV(I, 15) = "" Then 'condition : si la donnée ligne I colonne 15 de TV n'est pas vide
        'définit la valeur du tableau en colonne 15 VT15 ((en supprimant les espaces s'il y en a)
        VT15 = IIf(InStr(1, TV(I, 15), " ", vbTextCompare) > 0, UCase(Replace(TV(I, 15), " ", "")), TV(I, 15))
        'redéfinit la valeur du tableau en colonne 15 VT15 ((en supprimant les tirets s'il y en a)
        VT15 = IIf(InStr(1, TV(I, 15), "-", vbTextCompare) > 0, UCase(Replace(TV(I, 15), "-", "")), VT15)
        'si la valeur cherchée VC est contenue dans VT15, colore la cellule de rouge
        If VT15 Like "*" & VC & "*" Then Cells(I, 15).Interior.ColorIndex = 3
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
End Sub

Le fichier :

3php-ep-v01.zip (129.85 Ko)

Bonjour,

Tres bien et complexe a priori, mais il faudrait que la recherche fonctionne aussi si on tape AV-149-ZX-92 et que le résultat dans la celulle est AV149ZX92 5 (sans tiret) par exemple. Car des fois dans le résultat il y a pas de tiret ou c'est en minuscule, ou un espace suplementaire.

Merci

0php-ep-v01.zip (72.17 Ko)
0php-ep-v01.zip (72.17 Ko)

Re,

Ça fonctionne avec ou sans tirets, avec ou sans espaces mais si tu mets un numéro en plus (5 dans ton cas), là ça ne fonctionne plus. Essaie avec : AV149ZX92...

Le code modifié avec un compteur...

Private Sub Worksheet_Change(ByVal Target As Range) 'au changement dans l'onglet
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim VC As String 'déclare la variable VC (Valeur Cherchée)
Dim VT14 As String 'déclare la variable VT14 (Valeur Tableau colonne 14)
Dim VT15 As String 'déclare la variable VT14 (Valeur Tableau colonne 15)
Dim C As Integer 'déclare la variable C (Compteur)
Dim MSG As String 'déclare la variable MSG (MeSsaGe)

If Target.Address <> "$P$3" Then Exit Sub 'si le changement a lieu ailleurs qu'en P3, sort de la procédure
Columns("N:O").Interior.Color = xlNone 'enlève les couleurs aux colonnes N et O
If Target.Value = "" Then Exit Sub 'si P3 est effacée, sort de la procédure
TV = Me.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes i du tableau des valeurts TV
    'définit la valeur cherchée VC (en supprimant les espaces s'il y en a)
    VC = IIf(InStr(1, Target.Value, " ", vbTextCompare) > 0, UCase(Replace(Target.Value, " ", "")), UCase(Target.Value))
    'redéfinit la valeur cherchée VC (en supprimant les tirets s'il y en a)
    VC = IIf(InStr(1, Target.Value, "-", vbTextCompare) > 0, UCase(Replace(Target.Value, "-", "")), VC)
    If Not TV(I, 14) = "" Then 'condition : si la donnée ligne I colonne 14 de TV n'est pas vide
        'définit la valeur du tableau en colonne 14 VT14 ((en supprimant les espaces s'il y en a)
        VT14 = IIf(InStr(1, TV(I, 14), " ", vbTextCompare) > 0, UCase(Replace(TV(I, 14), " ", "")), TV(I, 14))
        'redéfinit la valeur du tableau en colonne 14 VT14 ((en supprimant les tirets s'il y en a)
        VT14 = IIf(InStr(1, TV(I, 14), "-", vbTextCompare) > 0, UCase(Replace(TV(I, 14), "-", "")), VT14)
        'si la valeur cherchée VC est contenue dans VT14, colore la cellule de rouge, incrémente le compteur C
        If VT14 Like "*" & VC Then Cells(I, 14).Interior.ColorIndex = 3: C = C + 1
    End If 'fin de la condition
    If Not TV(I, 15) = "" Then 'condition : si la donnée ligne I colonne 15 de TV n'est pas vide
        'définit la valeur du tableau en colonne 15 VT15 ((en supprimant les espaces s'il y en a)
        VT15 = IIf(InStr(1, TV(I, 15), " ", vbTextCompare) > 0, UCase(Replace(TV(I, 15), " ", "")), TV(I, 15))
        'redéfinit la valeur du tableau en colonne 15 VT15 ((en supprimant les tirets s'il y en a)
        VT15 = IIf(InStr(1, TV(I, 15), "-", vbTextCompare) > 0, UCase(Replace(TV(I, 15), "-", "")), VT15)
        'si la valeur cherchée VC est contenue dans VT15, colore la cellule de rouge, incrémente le compteur C
        If VT15 Like "*" & VC & "*" Then Cells(I, 15).Interior.ColorIndex = 3: C = C + 1
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
Select Case C 'agit en fonction de C
    Case 0 'cas C=0
        MSG = "Aucune occurrence trouvée !" 'définit le message MSG
    Case 1 'cas C=1
        MSG = "1 occurrence trouvée !" 'définit le message MSG
    Case Else 'tous les autres cas
    MSG = C & " occurrences trouvées !" 'définit le message MSG
End Select 'fin de l'action en fonction de C
MsgBox MSG 'affiche le message MSG
End Sub

Oui je viens de voir, en faite il faut faire une recherche en majuscule, sans tiret, sans espace et il trouve, meme si il y a des tirets ou espace dans le résultat.

Merci beaucoup

Re,

Ça fonctionne aussi en minuscule avec ou sans tirets dans la recherche! Teste au moins ?!...

Oui je vais essayer le compteur, je laisse ouvert au cas ou apres quelques manip, merci

Super le compteur, par compte je suis pas sur qu'il va jusqua la ligne 1500 ? ( si j'en rajoute)

Re,

je te redis la même chose... Teste avant de poser des questions !...

Comme les variable I et C sont déclarées de type Integer les limites sont : 32 767 lignes. Si tu n'en as pas assez, déclare les variable I et C de type LONG...

Rechercher des sujets similaires à "recherche complexe novice"