Tableau récapitulatif d'offres

Bonjour,

Je suis actuellement en stage et développe un outil sur excel pour permettre de réaliser plus rapidement des devis. Mais voilà, alors que mon fichier est presque terminé, je bloque sur un gros problème. En effet, afin que mon devis se remplisse automatiquement, il faut préalablement remplir une fiche de renseignements à la fin de laquelle se trouve un tableau dont le but est de récapituler les offres possibles en fonction des critères renseignés.

J'ai utilisé des fonctions SI imbriquées et des fonctions recherchev. Pourtant à chaque fois le résultat correspond systématiquement au dernier produit de ma liste alors qu'il y a des produits précédents qui répondent aux mêmes critères.

Y aurait-il quelqu'un qui pourrait m'aider ? Je pensais éventuellement construire une macro mais je suis novice dans ce domaine-ci...
Configuration: Windows Vista
Firefox 3.0.13

30 réponses

Résumé de la discussion

Le problème porte sur un fichier Excel destiné à générer des devis, où le tableau récapitulatif des offres répondant à des critères (marque, puissance, prix) ne retient que le dernier produit. Des solutions évoquées incluent l'utilisation de SI imbriqués et de RECHERCHEV, mais la recherche vise à afficher plusieurs offres correspondant aux critères plutôt que d'en afficher une seule. Plusieurs intervenants proposent une macro de recherche capable d afficher plusieurs résultats en fonction des critères, au lieu d'un seul, avec un exemple de code illustrant la récupération des offres correspondantes. D'autres échanges abordent l'ajustement des méthodes (ordre des critères, tolérances) et soulignent la nécessité de partager un exemple concret pour affiner les solutions sans conclure à une résolution finale.

Bobot (l’IA à votre service)
  1. Mais, de rien, si vous avez des demandes plus précises, n'hésitez pas !!
    0
    1. Trouvé! Quel idiot je suis !

         If (table_resultat(j) <> 0) Then
              prix_unitaire = Cells(table_resultat(j), colonne_prix_unitaire)
              If ((prix_unitaire < (prix_rech * 0.5) Or prix_unitaire > (prix_rech * 1.5)) Or prix_unitaire = "") Then
                  table_resultat(j) = 0
              End If
          
          End If
      


      J'avais mis "And" au départ, bien sûr, le prix ne peut pas à la fois être en dessous de celui recherché et au dessus... donc le If n'était jamais vérifié...

      Par ailleurs, attention au 0.5 et 1.5, ils correspondent à des zones trop grandes.
      Ex: si vous entrez 4 € dans la recherche

      Il prendra les offres de 0.5*4 = 2 € à 1.5 *4 = 6 € ... ce qui correspond peut-être à beaucoup d'offre ;)
      Si vous avez des prix de 0.5 en 0.5 et que vous voulez associez le triplet (3.5,4,4.5) à la recherche... alors remplacez les * par des + et mettez 0.5 € de chaque côté ;)

      bonne soirée
      0
      1. Un p'tit post juste pour vous remercier pour votre aide !!! grâce à vous j'ai pu résoudre mon problème de recherche et continuer à développer mon fichier !!! Merci beaucoup !!!
        0
    2. Je vais y travailler, pour la barre de progression, je sais en faire une intéressante, mais je n'ai plus le code sous la main. Mais, elle n'est utile que si votre macro mais plusieurs dizaines de secondes à s'exécuter.

      Je vous redis demain ;)
      0
      1. Ok ! Merci beaucoup !

        Pour indications, la macro met entre 5 et 10 secondes pour effectuer la recherche.

        Je vais tenter de résoudre le problème de critère de prix....

        Bonne soirée
        0
    3. Maintenant que la macro fonctionne, je constate quand même un petit problème : elle sélectionne l'ensemble des références d'une marque sans prendre en compte le critère "prix".

      Sinon que me proposez-vous pour l'améliorer ?

      - Peut-on créer une boîte de message avec une barre de progression pendant que la macro fait une recherche ?

      - Comment faire pour que la macro remplisse uniquement les renseignements utiles pour la table résultat de la feuille "dimensionnement"?

      En tout cas, merci beaucoup pour votre aide, elle m'est bien précieuse !
      0
      1. et bien il marche : https://www.cjoint.com/?istFFrZjpH

        c'était, comme je l'ai déjà dit, la recherche : si vous mettez la variable prix_unitaire au lieu de l'intitulé de la colonne "prix unitaire", alors il définit la colonne 20 (avec la recherche"4") ... et alors il exclut tout !

        maintenant cela fonctionne...
        si vous voulez, on peut maintenant l'améliorer ?
        0
        1. ahah ! mdr ! vérifiez l'intitulé exact des feuilles (attention accents, espaces, majuscules ?) ! je ne vois que cela !
          0
        2. vous pouvez m'envoyer le lien en mp :) ! sinon mon adresse mail c'est https://www.cjoint.com/?issMK7rRSK
          0
          1. Après une bonne demie heure de pause, j'ai réessayé la macro mais cette fois-ci avec le fichier que je vous avais préparé (cad uniquement les 2 feuilles concernées).

            Et là magique, la macro fonctionne !!!

            Maintenant la question est : pourquoi ne marche-t-elle pas sur le fichier qui comporte 11 feuilles ?
            0
        3. désolé, je n'ai plus du tout d'idées! normalement, cela devrait fonctionner, je ne comprend pas
          0
          1. Pourriez-vous alors me transmettre votre adresse e-mail afin de vous envoyer une version très edulcorée du fichier. (Je n'ai pas envie de le poster sur la toile).

            Merci pour votre aide.
            0
        4. remplacer :
          table_resultat(j) = 0 par table_resultat(j) = 1 et voir le résultat, normalement, on doit voir copier dans la zone de résultat le nombre d'offre correspondant à la marque
          0
          1. Toujours rien avec ce changement !

            J'ai remodifié le code en remplaçant "cells.find(what:="marque")" par "cells.find(what:="marque_rech"), idem pour le prix (même si vous m'avait dit de modifier précédemment). Avec cette modif, le curseur se déplace dans ma feuille "base" en respectant les critères de marque et de prix de ma feuille "dimensionnement".

            Par contre, la macro refuse de sélectionner (aucun message d'erreur). Le curseur se déplace uniquement sur les bonnes références mais ne les copie pas !
            0
          2. @Max29Pour précisions, quand je copie votre macro et que je modifie uniquement les différents intitulés, le curseur se bloque sur l'entête de la colonne "prix unitaire" de la feuille "base".
            0
        5. Ah, je crois avoir trouvé !
          vous avez fait la même erreur qu'avec le prix, sauf que cette fois la probabilité pour que le prix soit exactement trouvé est faible, enfin bref :

          If (prix_rech <> "") Then
          
          Cells.Find(what:="prix", after:=ActiveCell, LookIn:=xlFormulas, lookat _
          :=xlPart, searchorder:=xlByRows, searchdirection:=xlNext, MatchCase:= _
          False, searchformat:=False).Activate
          
          colonne_prix_unitaire = ActiveCell.Column
          
          While (j < 150) 
          
          


          Une nouvelle fois, on cherche l'entête, au cas où on rajouterais des colonnes dans la base ;)
          0
          1. Malheureusement, une fois encore, ca ne fonctionne pas !

            If (prix_rech <> "") Then

            Cells.Find(what:="prix unitaire", after:=ActiveCell, LookIn:=xlFormulas, lookat _
            :=xlPart, searchorder:=xlByRows, searchdirection:=xlNext, MatchCase:= _
            False, searchformat:=False).Activate

            colonne_prix_unitaire = ActiveCell.Column

            While (j < 150)

            If (table_resultat(j) <> 0) Then
            prix_unitaire = Cells(table_resultat(j), colonne_prix_unitaire)
            If ((prix_unitaire < (prix_rech * 0.9) And prix_unitaire > (prix_rech * 1.1)) Or prix_unitaire = "") Then
            table_resultat(j) = 0
            End If

            End If

            j = j + 1
            Wend

            End If
            0
        6. alors, faire le test suivant...
          changer le nom de colonne prix initiale, puis copier la et mettez le nom habituel, et mettez le format des cellules de la colonne au format nombre avec 0 virgule... nous verrons bien !! héhé
          0
          1. Les nombres à virgules sont prix en compte dans Variant, il me semble.
            Mais, peut-être que les nombres dans votre base, ne sont pas pris en tant que nombre ?
            Sont-ils alignés à gauche ou à droite ? Est-ce qu'il y a un . ou une , pour séparer les décimales du reste?
            0
            1. Ils sont alignés à droite et les décimales sont séparées par une virgule...
              0
          2. J'ai peut-être la solution grâce à votre question !

            Dans ma feuille "base", la colonne "prix unitaire" comporte des nombres à virgules. Hier, en regardant plusieurs forums et l'aide Microsoft j'ai cru voir qu'il y avait un code spécial à rentrer pour de tels nombres en lieu et place de "variant" ou "integer" ?

            Par "mon écran saute", j'entends le fait que ma macro semble se bloquer au moment de faire la sélection...
            0
            1. étrange, la macro fonctionne chez moi...

              comment est remplie la case prix dans la base désormais ?

              qu'est ce que vous voulez dire par "mon écran saute" !

              p.s.: on y arrive, on y arrive ^^ !
              0
              1. Je viens de corriger et modifier la macro comme vous venez de me l'indiquer ! Par contre, ma macro refuse toujours de sélectionner la ligne ! En gros mon écran saute à chaque fois que j'exécute la macro !
                0
                1. Ah j'allais oublier, votre tableau présentant 21 colonnes, copions la ligne entière tant qu'à faire :

                  Sheets("base").Activate
                  Range(Cells(table_resultat(l), 3), Cells(table_resultat(l), 10)).Select
                  Selection.Copy
                  Sheets("dimensionnement").Activate
                  Cells(m, 1).Activate
                  ActiveSheet.Paste 
                  


                  à remplacer par:

                  Sheets("base").Activate
                  Range(Cells(table_resultat(l), 1), Cells(table_resultat(l), 21)).Select
                  Selection.Copy
                  Sheets("dimensionnement").Activate
                  Cells(m, 1).Activate
                  ActiveSheet.Paste 
                  
                  0
                  1. :) ! j'ai trouvé deux erreurs :) !

                    je donne les extraits :

                    If (marque_rech <> "") Then
                    
                    Cells.Find(what:=(marque_rech), after:=ActiveCell, LookIn:=xlFormulas, lookat _
                    :=xlPart, searchorder:=xlByRows, searchdirection:=xlNext, MatchCase _
                    :=False, searchformat:=False).Activate
                    
                    colonne_marque = ActiveCell.Column
                    
                    While (Cells(i, colonne_marque).Value <> "") 
                    


                    devrait plutôt donner, car on cherche l'entête (si le nom de la marque se trouvait ailleurs dans le fichier, ça pourrait être embêtant, mais cela revient au même sinon):

                    If (marque_rech <> "") Then
                    
                    Cells.Find(what:="marque", after:=ActiveCell, LookIn:=xlFormulas, lookat _
                    :=xlPart, searchorder:=xlByRows, searchdirection:=xlNext, MatchCase _
                    :=False, searchformat:=False).Activate
                    
                    colonne_marque = ActiveCell.Column
                    
                    While (Cells(i, colonne_marque).Value <> "") 
                    


                    Mais surtout, la faute qui fait que votre macro ne rend rien, la mauvaise manipulation de la variable prix :

                    Dim prix As Variant
                    .
                    .
                    .
                    colonne_prix_unitaire = ActiveCell.Column
                    
                    While (j < 150)
                    
                    If (table_resultat(j) <> 0) Then
                    prix = Cells(table_resultat(j), colonne_prix_unitaire)
                    If ((prix_unitaire < (prix_rech * 0.9) And prix_unitaire > (prix_rech * 1.1)) Or prix_unitaire = "") Then
                    table_resultat(j) = 0
                    End If
                    
                    End If 
                    


                    Tous les résultats sont donc exclus ;) car prix_unitaire = 0, il faut évidemment écrire :

                    Dim prix_unitaire As Variant
                    .
                    .
                    .
                    colonne_prix_unitaire = ActiveCell.Column
                    
                    While (j < 150)
                    
                    If (table_resultat(j) <> 0) Then
                    prix_unitaire = Cells(table_resultat(j), colonne_prix_unitaire)
                    If ((prix_unitaire < (prix_rech * 0.9) And prix_unitaire > (prix_rech * 1.1)) Or prix_unitaire = "") Then
                    table_resultat(j) = 0
                    End If
                    
                    End If 
                    


                    voilà voilà, à plus tard !
                    0
                    1. Pas de problème, par contre sans le code, je ne vois pas du tout :s
                      copier coller ?
                      0
                      1. Voici le code entier de la macro :

                        Sub Recherche()

                        Dim marque_rech As String
                        Dim prix_rech As Variant
                        Dim colonne_marque As Integer
                        Dim colonne_prix_unitaire As Integer
                        Dim table_resultat(150) As Integer
                        Dim prix As Variant
                        Dim i As Integer
                        Dim j As Integer
                        Dim k As Integer
                        Dim l As Integer
                        Dim m As Integer
                        Dim n As Integer
                        i = 1
                        j = 1
                        k = 1
                        l = 1
                        m = 46
                        n = 1

                        Sheets("dimensionnement").Activate
                        marque_rech = Cells(10, 4).Value
                        prix_rech = Cells(14, 4).Value

                        Sheets("base").Select

                        If (marque_rech <> "") Then

                        Cells.Find(what:=(marque_rech), after:=ActiveCell, LookIn:=xlFormulas, lookat _
                        :=xlPart, searchorder:=xlByRows, searchdirection:=xlNext, MatchCase _
                        :=False, searchformat:=False).Activate

                        colonne_marque = ActiveCell.Column

                        While (Cells(i, colonne_marque).Value <> "")

                        If (marque_rech = Cells(i, colonne_marque).Value) Then
                        table_resultat(n) = Cells(i, colonne_marque).Row
                        n = n + 1
                        End If
                        i = i + 1
                        Wend

                        Else
                        MsgBox "Entrer une marque pour effectuer la recherche"
                        End If

                        If (prix_rech <> "") Then

                        Cells.Find(what:=(prix_rech), after:=ActiveCell, LookIn:=xlFormulas, lookat _
                        :=xlPart, searchorder:=xlByRows, searchdirection:=xlNext, MatchCase:= _
                        False, searchformat:=False).Activate

                        colonne_prix_unitaire = ActiveCell.Column

                        While (j < 150)

                        If (table_resultat(j) <> 0) Then
                        prix = Cells(table_resultat(j), colonne_prix_unitaire)
                        If ((prix_unitaire < (prix_rech * 0.9) And prix_unitaire > (prix_rech * 1.1)) Or prix_unitaire = "") Then
                        table_resultat(j) = 0
                        End If

                        End If

                        j = j + 1
                        Wend

                        End If

                        For l = 1 To 150
                        If (table_resultat(l) <> 0) Then
                        Sheets("base").Activate
                        Range(Cells(table_resultat(l), 3), Cells(table_resultat(l), 10)).Select
                        Selection.Copy
                        Sheets("dimensionnement").Activate
                        Cells(m, 1).Activate
                        ActiveSheet.Paste
                        m = m + 1
                        End If
                        Next l

                        End Sub

                        J'ai comparé à plusieurs reprises votre code à celui-ci et je ne vois pas où peut être l'erreur.
                        Pour info, mon classeur se compose de 11 feuilles. La feuille "dimensionnement" est la 4è feuille et la feuille "base", la dernière feuille.
                        Par ailleurs, la feuille "base" est un tableau de 21 colonnes. Seules 3 sont utilisées pour la macro et celles-ci ne sont pas adjacentes.

                        Je pense avoir plus ou moins bien résumé la chose...
                        0
                    2. Bonjour,

                      Le code de la fin du message 14 prenait en compte la demande sur le modèle ;), le code en gras correspond aux modifications à apporter...

                      bonne journée
                      0
                      1. Navré de vous importuner une xième fois (à force ma nullité peut agasser), mais avant de compléter ma macro, je dois résoudre un problème d'envergure.

                        Ma macro fonctionne correctement. Elle prend bien en compte les deux critères entrés pour l'instant (marque et prix) dans la feuille "dimensionnement" et sélectionne parfaitement les références qui y répondent dans la feuille "base". Pour autant, elle ne parvient pas à les copier.

                        Je pense que le problème peut venir du fait qu'elle ne prenne pas en compte la fin de la macro cad le code "for".

                        Si vous pouviez m'aider à résoudre ce problème, ce serait je pense mon ultime recours à votre précieuse aide !!!
                        0
                    3. Les lettres i, j, k ect sont arbitraires et pris comme "compteur de boucle" dans plusieurs cas.

                      Par ailleurs, aucun résultat ne s'affichent s'y les prix/puissances dans la table où la recherche s'effectue sont d'une forme autre que nombre, en effet on compare dans le code des valeurs numériques...

                      Je m'explique, dans la première recherche (premier grand if), on met dans un tableau toutes les lignes qui correspondent à la marque souhaitez, éliminant ainsi une bonne partie des références. Ensuite, lors de la recherche du prix, on compare celui ci à la valeur souhaitez pour chacun des lignes préalablement définies par la marque. Ainsi, si la comparaison du prix n'est pas satisfaisante, alors on met la valeur de la référence à 0 pour l'éliminer et on regarde la suivante. Ici, aucun résultat ne peut sortir, car à chaque fois la comparaison échoue.
                      Du coup, la macro ne rend rien...

                      Bien sûr, il y a des solutions de rechanges...

                      Je peux peut-être améliorer la macro si vous souhaitez m'envoyer votre fichier (seule la structure du fichier, vous pouvez le dépouillez de toutes informations sensibles ;), je pourrais faire quelque chose de beaucoup plus intéressant, avec une recherche plus ciblée et des options plus intéressantes!
                      (vous pouvez transmettre le lien cjoint en mp...)

                      En espérant avoir répondu aux questions ...
                      0
                      1. Je suis désolé mais je ne pourrai vous communiquer le fichier ! Même en le simplifiant je dois conserver des données internes...

                        En revanche, est-il possible que vous m'indiquiez des codes possibles pour améliorer la macro ?

                        En reprenant votre fichier, il faudrait par exemple rajouter à la feuille "produit" une colonne modèle. C'est ensuite ce modèle et la marque qui doivent apparaître en premier dans la table de résultat.

                        Pour les critères, je vais modifier ma logique de sorte que ce ne soit plus que des valeurs numériques...
                        0
                    • 1
                    • 2