VBA : problème recherche avec des chiffres

Résolu
Benleq Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -  
Benleq Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -
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

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  2. Benleq Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   3
     
    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
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bin continue de penser alors
    0
  4. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      merci, Eric :o)
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Benleq Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   3
     
    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
  7. pilas31 Messages postés 1878 Statut Contributeur 648
     
    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
  8. Benleq Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   3
     
    Merci beaucoup cela marche parfaitement !

    Bonne continuation

    Benoît
    0