VBA : problème recherche avec des chiffres

Résolu/Fermé
Benleq Messages postés 8 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 2 novembre 2014 - 30 juin 2011 à 13:57
Benleq Messages postés 8 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 2 novembre 2014 - 1 juil. 2011 à 11:10
Bonjour,

Je découvre VBA et je viens de faire un petit macro "moteur de recherche".

Lorsque l'on clique sur le bouton "recherche", une fenêtre s'ouvre : je rentre une référence (qui est dans la base de données (feuille BDD)) et il renvoie les données relatives à cette référence (notamment les différents emplacements où elle peut être stockée) dans la première feuille (nommé page d'ouverture). De plus, ce macro colorie ces emplacements sur le "palettier virtuel" de la feuille "palettier".

Mon problème : lorsque je rentre une référence avec que des lettres ou des lettres et des chiffres ca fonctionne parfaitement. Par contre quand c'est que des chiffres ca ne marche plus : il n'arrive pas à la retrouvée dans la BDD! Assez étrange ...

Je pensais donc que c'était un problème de déclaration de variable mais pas moyen de le résoudre.

Voici mon code (commenté) :

Correspondant au programme principal

Private Sub CommandButton1_Click()
    
    reponse = Application.InputBox("Veuillez rentrer la référence du produit")
    
    'arrete le programme lorsque l'on appuie sur le bouton annuler de la boite de dialogue
    If VarType(reponse) = vbBoolean Then Exit Sub

    'efface le contenu du tableau des emplacements de la page d'ouverture
    Range("B9:B1000").ClearContents
    Range("C9:C1000").ClearContents
    Range("D9:D1000").ClearContents
    
    'Remet tous les emplacements du palettier en blanc (efface)
    For j = 5 To 11 Step 2
        For k = 1 To 65
            If Worksheets("palettier").Cells(j, k).Value Like "7***" Then
                    Worksheets("palettier").Cells(j - 1, k).Interior.Color = vbWhite
            End If
        Next k
    Next j
    
    'appelle la fonction recherche
    Call recherche(reponse)

End Sub



Correspondand à la procédure recherche :


'permet de ne pas prendre en compte la différence entre majuscule et minuscule lors de comparaison
Option Compare Text

Sub recherche(mot)
    
    'declaration des variables
    nb_ligne_bdd = Worksheets("BDD").Cells(65536, 1).End(xlUp).Row
    m = 9
    variable_choix = 10
    Dim emplacement As Variant
    
    'recherche le mot clef dans la base de donnees
    For i = 1 To nb_ligne_bdd
    
        If Worksheets("BDD").Cells(i, 1).Value = mot Then
            
            emplacement = Worksheets("BDD").Cells(i, 2).Value
            
            'fais un copier coller des infos de la BDD dans le tableau de la page d'ouverture
            Worksheets("BDD").Range("A" & i & ":C" & i & "").Copy
            Worksheets("page d'ouverture").Range("B" & m & "").Select
            ActiveSheet.Paste
            
            'colorie les emplacements du palettier correspondant à la référence recherchée
            For j = 5 To 11 Step 2
                For k = 1 To 65
                If Worksheets("palettier").Cells(j, k).Value = emplacement Then
                    Worksheets("palettier").Cells(j - 1, k).Interior.Color = vbBlue
                End If
                Next k
            Next j

            m = m + 1
        End If
    Next i
    
    'permet de connaitre si la reference recherchée est ds la BDD
    If Worksheets("page d'ouverture").Cells(9, 2).Value = Empty And Len(mot) <> 0 Then
        variable_choix = 2
    End If
    
    'permet de savoir si aucun mot a etait rentre
    If Len(mot) = 0 Then
        variable_choix = 1
    End If
    
    'permet d'appliquer les cas au dessus
    Select Case (variable_choix)
        Case 1
            MsgBox "Veuillez rentrer une référence"
        Case 2
            MsgBox "La référence recherchée n'existe pas. Veuillez recommencer"
        Case Else
    End Select
    
 
End Sub




A quoi cela est-il dû ?

Merci d'avance

Cordialement


7 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
30 juin 2011 à 14:32
Bpnjour,

en regardant en diagonale

l'opérateur LIKE concerne des string "toto1" par exemple

si tu as un nombre il faut utilser "#####" le nbre de # et le nombre de chiffres (si tu en a 4 ou 6 ) l'instruction renvoie False
si tu veux début du nombre =7 écris "7###" ==> 7 suivi de 3 chiffres

maintenant tu peux feinter en convertissant le nombre en string
tavar=cstr(ta var) et en gardant "7***"
1
Benleq Messages postés 8 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 2 novembre 2014 3
30 juin 2011 à 14:59
Bonjour Michel_m,

Je ne pense pas que le problème vienne de là. En effet, cette étape est indépendante de la recherche et permet de colorier les cellules correspondant à l'ensemble des emplacements sur le palettier afin de tout remettre en blanc (Ces emplacements sont de la forme 7C01).

Je pense que le problème se situe dans la procédure recherche et plus particulièrement ici :

If Worksheets("BDD").Cells(i, 1).Value = mot Then


La variable mot correspond à ce qui est rentrer par l'utilisateur dans le inputbox.

Est ce le "Value" qui pose problème ou la variable mot ?


Voici une version simplifiée du code qui présente le même problème :

Procédure recherche :

Option Compare Text

Sub recherche(mot)
    
    LaDerniere = Worksheets("BDD").Cells(65536, 1).End(xlUp).Row
    k = 9
    
    For i = 1 To LaDerniere
        If Worksheets("BDD").Cells(i, 1).Value = mot Then
            Worksheets("BDD").Range("A" & i & ":C" & i & "").Copy
            Worksheets("page d'ouverture").Range("A" & k & "").Select
            ActiveSheet.Paste
            k = k + 1
        End If
    Next i
 
End Sub


Fonction principal :

Private Sub CommandButton1_Click()

    reponse = Application.InputBox("Veuillez rentrer la référence du produit")
    Call recherche(reponse)

End Sub
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
30 juin 2011 à 15:13
Bin continue de penser alors
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 215
Modifié par eriiic le 30/06/2011 à 23:32
Bonjour,

Sans trop lire le code (même pas du tout) je pense que la réponse de michel aurait pu t'aiguiller lorsque tu donnes ton analyse :
Je pense que le problème se situe dans la procédure recherche et plus particulièrement ici :
If Worksheets("BDD").Cells(i, 1).Value = mot Then
La variable mot correspond à ce qui est rentrer par l'utilisateur dans le inputbox.

Un inputbox retourne une chaine , et ça ne marche pas lorsque tu recherches une valeur numérique


Tu confirmes sur une autre ligne de code le problème détecté par michel : convertir en chaine toutes les valeurs susceptibles d'être numériques.
(partout où c'est nécessaire... ta ligne, celle signalée par michel, et peut-être ailleurs aussi...)
Sans oublier qu'un nombre positif converti commence par un espace et qu'un trim() en plus du str() serait le bienvenu

eric

PS: tu es nouveau sur le forum, en général (nul ne se trompe jamais) tu peux faire confiance aux remarques de michel ;-)
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
1 juil. 2011 à 08:21
merci, Eric :o)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Benleq Messages postés 8 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 2 novembre 2014 3
1 juil. 2011 à 10:53
Bonjour,

Je suis désolé que mon message vous soit perçu comme cela. Je voulais juste signaler que l'erreur affectant le fonctionnement global de la macro ne se situait pas ici. Et comme en survolant le code, Michel_m a tout de suite détecté cette erreur je pensais qu'en lui indiquant l'autre il la trouverai. Je n'ai pas fait le rapprochement comme quoi ces deux erreurs étaient similaires.

Je vous remercie de m'avoir répondu : cela devient maintenant plus clair pour moi.

J'ai donc rentrer dans mon code :

reponse = CStr(reponse)
reponse = Trim(reponse)


Mais cela ne marche pas.
J'ai placé ce code juste en dessous de :

reponse = Application.InputBox("Veuillez rentrer la référence du produit")


et avant :

Call recherche(reponse)


Quand je fais un TypeName(reponse) je retombe bien sur string.

Vous savez à quoi c'est dû?
0
pilas31 Messages postés 1825 Date d'inscription vendredi 5 septembre 2008 Statut Contributeur Dernière intervention 24 avril 2020 643
Modifié par pilas31 le 1/07/2011 à 11:04
Bonjour,

Et oui michel_m et eriiic ont raison (comme d'hab)

Il faut convertir. Mais plutôt en numérique à partir de la chaine saisie.

donc je pense en un truc du genre (dans recherche)

Sub recherche(mot)  
      
    LaDerniere = Worksheets("BDD").Cells(65536, 1).End(xlUp).Row  
    k = 9  

    If IsNumeric(mot) Then mot = CInt(mot)  

    For i = 1 To LaDerniere  
        If Worksheets("BDD").Cells(i, 1).Value = mot Then  
            Worksheets("BDD").Range("A" & i & ":C" & i & "").Copy  
            Worksheets("page d'ouverture").Range("A" & k & "").Select  
            ActiveSheet.Paste  
            k = k + 1  
        End If  
    Next i  
   
End Sub


si toutefois ces numériques sont des entiers sinon choisir une autre fonction

A+

Cordialement,
0
Benleq Messages postés 8 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 2 novembre 2014 3
1 juil. 2011 à 11:10
Merci beaucoup cela marche parfaitement !

Bonne continuation

Benoît
0