Recherche de données dans plusieurs onglets

Ju -  
 Ju -
Bonjour,
Je suis en train d'essayer de faire un petit programme via Excel et VBA et je bloque sur un point. J'ai 12 onglets excel (un par mois) et je désire retrouver un numéro précis dans ces 12 onglets via un formulaire VBA. J'ai entré le code suivant :

Private Sub btnRechercher_Click()

Worksheets("Janvier") = 1
Worksheets("Février") = 2
Worksheets("Mars") = 3
Worksheets("Avril") = 4
Worksheets("Mai") = 5
Worksheets("Juin") = 6
Worksheets("Juillet") = 7
Worksheets("Aout") = 8
Worksheets("Septembre") = 9
Worksheets("Octobre") = 10
Worksheets("Novembre") = 11
Worksheets("Décembre") = 12

If lstType.Value = "Bordereau de retour" Then

For i = 1 to 12

p = 4

While i.Cells(p, 4) <> txtNumero.Text (txtNumero est ma boite où j entre le code à trouver)
p = p + 1
Wend

If i.Cells(p, 4) = txtNumero.Text Then
lstDate1.Value = i.Cells(p, 1)
lstDate2.Value = i.Cells(p, 2)
lstDate3.Value = i.Cells(p, 3)
txtMasse.Text = i.Cells(p, 7)
txtVbenne.Text = i.Cells(p, 8)
End If

Next i

End If

End Sub


Et il me renvoie un message d'erreur me disant "propriété ou méthode non gérée par cet objet."

Je désirerais également entrer une commande permettant de cocher le bouton radio qui correspond au type de produit mais je ne vois pas comment faire sans faire une ligne pour chaque bouton radio.

Etant débutant je ne maitrise pas encore tout ça donc si quelqu un peut me venir en aide ...
Merci
Configuration: Windows XP
Internet Explorer 6.0

21 réponses

  • 1
  • 2
  1. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Bonjour,

    Peux-tu indiquer la ligne qui génère le message d'erreur, stp ?

    ;o)
    0
    1. Ju
       
      Heu c'est dès la première en fait :) Donc à priori il risque de me faire la même chose pour les suivantes ... Je ne comprend pas pourquoi...
      0
      1. Ju > Ju
         
        Personne ne peut il vraiment rien ?? :(
        0
  2. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Bonjour,

    C'est ça qui coinçe:

    Worksheets("Janvier") = 1
    Worksheets("Février") = 2
    Worksheets("Mars") = 3
    Worksheets("Avril") = 4
    Worksheets("Mai") = 5
    Worksheets("Juin") = 6
    Worksheets("Juillet") = 7
    Worksheets("Aout") = 8
    Worksheets("Septembre") = 9
    Worksheets("Octobre") = 10
    Worksheets("Novembre") = 11
    Worksheets("Décembre") = 12

    Que veux tu faire exactement avec ça ?

    ;o)
    0
    1. Ju
       
      Bah en fait je veux les nommer de 1 à 12 pour pouvoir les introduire dans la boucle For (genre l'onglet janvier c'est 1, février c'est 2 et ainsi de suite...). Je voudrais que mon formulaire examine toutes les pages une à une pour retrouver le numéro du bon de commande que je lui demande. Si ça se trouve il y a une commande plus simple mais ça je n'en sais rien :)
      0
  3. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Tu as 2 façons de nommer une feuille. Soit par le nom (name) de l'onglet, soit par le numéro (index) de l'onglet. Mais tu ne peux pas affecter un numéro comme tu l'as fait.

    Tu peux faire une boucle comme ça, pour avoir "Coucou" dans la cellule A1 de la feuille 1 à la feuille 12 :
    For i = 1 to 12
       Worksheets(i).Range("A1").Value = "Coucou"
    Next i


    ;o)
    0
    1. Ju
       
      Ah je ne savais pas que chaque feuille avait un numéro qui lui était attribué en plus de son nom. Alors j'ai fait la modif mais bien évidemment ça plante plus loin :) Le code est maintenant le suivant :
      Private Sub btnRechercher_Click()

      If lstType.Value = "Bordereau de retour" Then
      For i = 2 To 13

      p = 4

      While Worksheets(i).Cells(p, 4) <> txtNumero.Text
      p = p + 1
      Wend

      If i.Cells(p, 4) = txtNumero.Text Then
      lstDate1.Value = i.Cells(p, 1)
      lstDate2.Value = i.Cells(p, 2)
      lstDate3.Value = i.Cells(p, 3)
      txtMasse.Text = i.Cells(p, 7)
      txtVbenne.Text = i.Cells(p, 8)
      End If

      Next i

      End If

      End Sub


      Et la il plante à la ligne "While Worksheets(i).Cells(p, 4) <> txtNumero.Text" en me disant erreur définie par l'application ou par l'objet. J'ai entré cette ligne afin de lui faire chercher dans la page i le numéro que j'ai entré dans txtNumero de mon formulaire. Et quand il le trouve je voudrais qu'il éxécute les 7 lignes qui suivent qui me donnent le reste des informations.

      Merci pour ton aide Polux31
      0
  4. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Assures-toi bien que les feuilles 2 à 13 existent bien dans ton projet.

    Ensuite essaies en mettant ça :
    While Worksheets(i).Cells(p, 4).Value <> txtNumero.Text 
       p = p + 1 
    Wend 

    Ou
    While Worksheets(i).Range("D" & p).Value <> txtNumero.Text 
    p = p + 1 
    Wend 


    Je n'ai pas le temps de tester là, je suis désolé, je fais ça un peu à la volée ...

    ;o)
    0
    1. Ju
       
      Alors j'ai essayé tes 2 possibilités et les 2 plantent au même endroit que précédemment en me renvoyant le même message d'erreur. Je ne comprend pas ce qui cloche dans la commande de cette ligne.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Peux-tu me faire passer ton fichier par cjoint.com, stp ? ... tu colles le lien ici après.

    Enlèves tout ce qui est confidentiel et ne laisses que la partie qui doit utiliser la fonction.

    ;o)
    0
    1. Ju
       
      https://www.cjoint.com/?gyl36FIRPe

      Voilà le lien. Il n'y a rien de confidentiel dedans pour le moment :) La fonction qui ne marche pas est sur le formulaire qui s'appelle "données" et c'est lorsque l'on clique sur le bouton rechercher.
      Merci.
      0
  7. Polux31 Messages postés 7219 Statut Membre 1 204
     
    ok merci, je regarde ça en début d'aprem et je te dis ce qu'il faut modifier, si je trouve bien sûr ...

    bon app.

    ;o)
    0
  8. onesdf Messages postés 375 Date d'inscription   Statut Membre Dernière intervention   120
     
    Salut,

    Ton erreur est dûe à la condition de ta boucle :
    While i.Cells(p, 4) <> txtNumero.Text (txtNumero est ma boite où j entre le code à trouver)
    p = p + 1
    Wend 


    Si elle ne trouve pas txtNumero.Text en ligne 4, alors p est incrémenté et vérifie la ligne suivante ... Si le texte recherché n'est pas la feuille ta boucle s'exécute jusqu'à arriver à la dernier ligne qu'Excel peut gérer + 1 ... Ligne qu'excel ne peut donc pas gérer et celà génère un message d'erreur.

    Rajoute donc la condition que la cellule ne soit pas vide et celà devrait passer
    While i.Cells(p, 4) <> txtNumero.Text And Not(IsEmpty(i.Cells(p, 4) <> txtNumero.Text))
    p = p + 1
    Wend 
    0
  9. Ju
     
    Merci beaucoup les gars à priori ça marche maintenant !!! Si jamais je retrouve d'autres soucis je vous fais signe ;)
    0
  10. Polux31 Messages postés 7219 Statut Membre 1 204
     
    ok, pas de blème.

    ;o)
    0
  11. Ju
     
    Ma question ne se fait pas tarder... lol. Dans l'éventualité où il ne trouve pas le numéro demandé (faute de frappe de l'utilisateur ou bien oubli de rentrée de données), comment le faire sortir de la boucle et lui faire afficher un message d'erreur ?? Et tant qu'on y est, une fois la recherche de numéro de bon terminée et les valeurs manquantes ajoutées, lorsque je valide il me met la ligne complète sous l'existante alors que je voudrais qu'il la remplace ...
    Merci :)
    0
  12. Polux31 Messages postés 7219 Statut Membre 1 204
     
    pour la première question, voilà la fonction modifiée :
    Private Sub btnRechercher_Click()
    Dim ok As Boolean
    
    ok = False
    
        If txtNumero.txt = "" Then
            MsgBox "La zone Numéro doit être renseignée", vbExclamation, "Saisie Obligatoire"
            Exit Sub
        End If
        
       If lstType.Value = "Bordereau de retour" Then
        For i = 2 To 13
        
            p = 4
            
            While Worksheets(i).Range("D" & p).Value <> ""
                
                If Worksheets(i).Cells(p, 4) = txtNumero.Text Then
                    lstDate1.Value = Worksheets(i).Cells(p, 1)
                    lstDate2.Value = Worksheets(i).Cells(p, 2)
                    lstDate3.Value = Worksheets(i).Cells(p, 3)
                    txtMasse.Text = Worksheets(i).Cells(p, 7)
                    txtVbenne.Text = Worksheets(i).Cells(p, 8)
                    ok = True
                End If
            p = p + 1
            Wend
        Next i
        
       End If
    
        If ok = False Then
            MsgBox "Recherche infructueuse, ou erreur de saisie !!!", vbExclamation, "Message"
        End If
        
    End Sub


    Pour la seconde question, je vais regarder koikissepasse ...

    ;o)
    0
  13. Ju
     
    J'ai testé ton truc il y a un petit truc qui cloche : il me met un mesage d'erreur à la fin que le code que j'ai entré existe ou pas ...
    0
  14. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Ben ça marche chez moi, il y a juste une erreur de frappe au niveau de txtNumero.Text ... mais le test fonctionne ...

    Comprends pas là
    0
  15. Ju
     
    Yep j'ai vu et j'ai corrigé la faute de frappe mais il me renvoie quand même un message d'erreur quand le code existe tout en m'affichant les données du code entré... Bizarre :)
    0
  16. Polux31 Messages postés 7219 Statut Membre 1 204
     
    je viens encore de tester et ça fonctionne bien ici ... je te redonne la procédure, vérifie que tout est bien dans ton fichier :

    Private Sub btnRechercher_Click()
    Dim ok As Boolean
    
    ok = False
    
        If txtNumero.Text = "" Then
            MsgBox "La zone Numéro doit être renseignée", vbExclamation, "Saisie Obligatoire"
            Exit Sub
        End If
        
       If lstType.Value = "Bordereau de retour" Then
        For i = 2 To 13
        
            p = 4
            
            While Worksheets(i).Range("D" & p).Value <> ""
                
                If Worksheets(i).Cells(p, 4) = txtNumero.Text Then
                    lstDate1.Value = Worksheets(i).Cells(p, 1)
                    lstDate2.Value = Worksheets(i).Cells(p, 2)
                    lstDate3.Value = Worksheets(i).Cells(p, 3)
                    txtMasse.Text = Worksheets(i).Cells(p, 7)
                    txtVbenne.Text = Worksheets(i).Cells(p, 8)
                    ok = True
                End If
            p = p + 1
            Wend
        Next i
        
       End If
    
        If ok = False Then
            MsgBox "Recherche infructueuse, ou erreur de saisie !!!", vbExclamation, "Message"
        End If
        
    End Sub

    ;o)
    0
  17. Ju
     
    Maintenant il marche ... J'ai tout arrêté puis relancé il devait tourner depuis un peu trop longtemps !
    0
  18. Polux31 Messages postés 7219 Statut Membre 1 204
     
    lol pitete ...

    ;o)
    0
  19. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Bonjour,

    Voilà, j'ai un peu optimisé ton code ... ;o)

    J'ai fait une modif pour ta 2ème question, j'espère que ça ira.

    Voilà le lien : https://www.cjoint.com/?gzj5Qdy4Tl

    Bon courage

    ;o)

    Polux
    0
  • 1
  • 2