Tableau récapitulatif d'offres
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
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.
-
Mais, de rien, si vous avez des demandes plus précises, n'hésitez pas !!
-
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
-
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 ;) -
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 ! -
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 ? -
ahah ! mdr ! vérifiez l'intitulé exact des feuilles (attention accents, espaces, majuscules ?) ! je ne vois que cela !
-
voici le lien de mon fichier (très simplifié) : https://www.cjoint.com/?ista3OaNs4
-
-
vous pouvez m'envoyer le lien en mp :) ! sinon mon adresse mail c'est https://www.cjoint.com/?issMK7rRSK
-
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 ?
-
-
désolé, je n'ai plus du tout d'idées! normalement, cela devrait fonctionner, je ne comprend pas
-
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-
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 ! -
@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".
-
-
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 ;)
-
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
-
-
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é -
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? -
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... -
é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 ^^ ! -
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 !
-
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 -
:) ! 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 !
-
Pas de problème, par contre sans le code, je ne vois pas du tout :s
copier coller ?-
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...
-
-
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-
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 !!!
-
-
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 ...-
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...
-
- 1
- 2