Optimisation d'un outil de recherche macro

ravenolhm

XLDnaute Nouveau
Bonsoir le forum ! Je cherche en ce moment à perfectionner mon « moteur » de recherche sur une feuille Excel. Le fichier laissé en exemple est une très brève reconstitution du vrai fichier ! Voilà un petit topo pour le développer un peu plus :

La feuille est composé de 2000 désignations produits avec 2 références (Brute et Finit) par désignation.

L’utilisateur entre la réf brute (en entier à la main, ou automatiquement grâce à une douchette pour une lecture code barre) en F2 puis clique sur le bouton de recherche qui exécute la macro suivante :

Code:
Application.CutCopyMode = False
    Range("F2").Select
    Selection.Copy
    Cells.Find(What:=Range("F2"), After:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlColumns, SearchDirection:=xlNext, _
        MatchCase:=False, SearchFormat:=False).Activate
    
    Application.CutCopyMode = False
    ActiveCell.Offset(0, 1).Range("A1,B1").Select
    Selection.Copy
    Range("G2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=True, Transpose:=False
        Application.CutCopyMode = False

La macro renvoie la désignation en G2 sous la forme de valeur et non de formule sans les blancs avec la réf finit du produit concerné

Jusqu’ici c’est le monde des bisounourse ! Mais les personnes exploitants le logiciel sont souvent amenées à faire des erreurs de saisie, donc références inconnues, où de zipper le mauvais code barre. Ce qui engendre une msgbox de MVBA qui les déstabilisent quand ils ont le malheur de cliquer sur Débogage…

Je souhaite de ne plus faire apparaitre ce message, et de rendre le moteur un peu plus efficace, en trois points :

- Sur une fiche produit s’y trouvent plusieurs références avec des différent code barre. Ils sont chacun agrémentés d’une lettre en début de chaine de caractère : P (suivit de 10 caractères alphanumériques) pour le produit. S (suivit de 9, ou -, caractères numériques) pour l’étiquette et V (suivit de 8, ou -, caractères numériques) pour le fournisseur. Je cherche donc à manipuler ma chaine de caractère en F2 pour un « traitement » préliminaire avec un IF/Elsif/Endif pour détecter la présence du P, elsif exit sub !

- Deuxième traitement préliminaire : compter le nb de caractère dans la chaine en F2, si le nombre est compris entre 10 (inclus) et 11 (inclus), la macro s’exécute, sinon msgbox…

- Je souhaite que la recherche ne s’exécute que dans la matrice [A3 : A2003]

Enfin, si l’outil de recherche ne trouve pas la référence après tous ces traitements et ce champs définit, une msgbox du style « la référence que vous chercher n’est pas dans ce fichier, veuillez vérifier la référence recherchée ! » est affichée.

N’hésiter pas à critiquer quoi que ce soit même si cela ne répond pas aux modifications souhaitées, toutes réflexions sont bonnes à prendre !

Je vous souhaite à tous une agréable fin de soirée !
 

Pièces jointes

  • Recherche Ref Employés.xls
    55 KB · Affichages: 75

Etienne2323

XLDnaute Impliqué
Re : Optimisation d'un outil de recherche macro

Salut ravenolhm, le forum :)
voici un essai. Il y a longtemps que je n'ai pas programmé alors soyez indulgent avec moi ;)

VB:
Option Explicit
Sub recherche()
Dim F1 As Worksheet
Dim Critere_Recherche As String
Dim c As Range, Plage_Depot1 As Range, Plage_Depot2 As Range
Dim Nb_Car As Byte
Dim DL As Long

With Application
    .ScreenUpdating = False
    .CutCopyMode = False
End With

Call P_0_unprotect

Set F1 = Worksheets("feuil1") 'Set la page d'activité dans une variable

F1.Activate
Critere_Recherche = F1.Range("F2").Value 'Met le critère de recherche dans une variable
Set Plage_Depot1 = F1.Range("G2")
Set Plage_Depot2 = F1.Range("H2")

'On va vider les plages de dépôt
Plage_Depot1.ClearContents
Plage_Depot2.ClearContents

'Valide si le critère de recherche est vide ou non. Si c'est le cas, alors on sort de la macro
If Critere_Recherche = "" Then
    MsgBox "Le critère de recherche est vide. Veuillez recommencer la recherche. Merci!", vbOKOnly, "Erreur de recherche"
    GoTo Fin
End If

'On va y aller avec 2 tests pour déterminer si le critère de recherche est valide

'1er test : Valider si la première lettre est un P. Si ce n'est pas le cas, alors on sort
If Left(Critere_Recherche, 1) <> "P" Then GoTo Fin

'2e test : On va tester le nombre de caractères
Nb_Car = Len(Critere_Recherche)
If Nb_Car < 10 Or Nb_Car > 11 Then GoTo Fin

DL = Cells(65536, 1).End(xlUp).Row 'Détermine la dernière ligne de la colonne A

'On va ensuite effectuer la recherche uniquement sur la colonne A
Set c = Range(Cells(1, 1), Cells(DL, 1)).Find(Critere_Recherche, LookIn:=xlValues, lookat:=xlWhole)
If Not c Is Nothing Then
    Plage_Depot1.Value = Cells(c.Row, 2).Value 'On va déposer le contenu de la colonne B dans la première plage de dépot
    Plage_Depot2.Value = Cells(c.Row, 3).Value 'On va déposer le contenu de la colonne C dans la seconde plage de dépot
Else
    MsgBox "La référence que vous cherchez est introuvable. Veuillez réessayer. Merci !", vbOKOnly, "Erreur de recherche"    
    GoTo Fin
End If

Call Archive

Fin:

Call P_1_protect
F1.Activate
Application.Goto Range("A1"), True

'On termine en vidant les sluts de mémoire utilisées
Set F1 = Nothing
Set c = Nothing
Set Plage_Depot1 = Nothing
Set Plage_Depot2 = Nothing

End Sub

Cordialement,

Étienne
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 242
Messages
2 086 528
Membres
103 243
dernier inscrit
SAH