Tableau récapitulatif d'offres
Fermé
Max29
-
14 août 2009 à 15:54
bouket Messages postés 143 Date d'inscription mardi 11 août 2009 Statut Membre Dernière intervention 16 octobre 2011 - 19 août 2009 à 20:01
bouket Messages postés 143 Date d'inscription mardi 11 août 2009 Statut Membre Dernière intervention 16 octobre 2011 - 19 août 2009 à 20:01
A voir également:
- Tableau récapitulatif d'offres
- Tableau croisé dynamique - Guide
- Tableau ascii - Guide
- Tableau word - Guide
- Trier tableau excel - Guide
- Tableau coefficient marge ✓ - Forum Excel
30 réponses
bouket
Messages postés
143
Date d'inscription
mardi 11 août 2009
Statut
Membre
Dernière intervention
16 octobre 2011
22
14 août 2009 à 17:28
14 août 2009 à 17:28
Bonjour,
Je pense que les If imbriquées se comportent de la façon suivante : Si ils rencontrent plusieurs possibilités, ils ne gardent que la dernière ...
Pour que cela marche, il faut effectivement, je pense (mais peut-être que quelqu'un à une solution plus simple ^^), faire une macro, pour enregistrer les choix valables au fur et à mesure.
Pour se faire, je vous conseille de nous expliquer plus en détails votre fichier, ou, pourquoi pas, poster votre document Excel (élaguée si confus)...
Bon après-midi !
Je pense que les If imbriquées se comportent de la façon suivante : Si ils rencontrent plusieurs possibilités, ils ne gardent que la dernière ...
Pour que cela marche, il faut effectivement, je pense (mais peut-être que quelqu'un à une solution plus simple ^^), faire une macro, pour enregistrer les choix valables au fur et à mesure.
Pour se faire, je vous conseille de nous expliquer plus en détails votre fichier, ou, pourquoi pas, poster votre document Excel (élaguée si confus)...
Bon après-midi !
Il y a 3 critères importants que la formule doit prendre en compte : la marque, la puissance et le prix.
Les fonctions recherche ont pour matrice une autre feuille du fichier qui correspond à une base produit et qui contient également ces 3 critères.
Voici la formule telle quelle est pour le moment : =SI(ET(C48="aleo";RECHERCHEV(C48;'BASE PRODUIT'!$B$5:$Z$19;24)=$D$15;RECHERCHEV(C48;'BASE PRODUIT'!$B$5:$Z$19;25)=$D$16);RECHERCHEV(C48;'BASE PRODUIT'!$B$5:$Z$19;3))
J'ai tenté de construire une macro recherche mais je bloque également ! Est-il possible d'imbriquer des fonctions SI dans une macro ?
Les fonctions recherche ont pour matrice une autre feuille du fichier qui correspond à une base produit et qui contient également ces 3 critères.
Voici la formule telle quelle est pour le moment : =SI(ET(C48="aleo";RECHERCHEV(C48;'BASE PRODUIT'!$B$5:$Z$19;24)=$D$15;RECHERCHEV(C48;'BASE PRODUIT'!$B$5:$Z$19;25)=$D$16);RECHERCHEV(C48;'BASE PRODUIT'!$B$5:$Z$19;3))
J'ai tenté de construire une macro recherche mais je bloque également ! Est-il possible d'imbriquer des fonctions SI dans une macro ?
bouket
Messages postés
143
Date d'inscription
mardi 11 août 2009
Statut
Membre
Dernière intervention
16 octobre 2011
22
14 août 2009 à 21:35
14 août 2009 à 21:35
oui, on peut tout faire avec une macro, dîtes moi ce que vous n'arrivez pas à faire faire à votre fichier ^^!
Ce que je cherche donc à faire c'est une macro recherche qui permettrait d'afficher les offres de produit possibles en fonction des critères émis. En gros, le but de la macro est d'afficher plusieurs résultats comme pourrait le faire un logiciel professionnel.
Voici le code macro que j'avais entré (après plusieurs recherches sur internet) :
Sub Test()
Dim Formule As String
Dim Module As Integer
Formule = "=VLOOKUP(C48,'BASE PRODUIT'!B5:Z19,3,FALSE)"
ActiveCell.Offset(0, 0).Value = Formule
ActiveCell.Offset(1, 0).Select
End Sub
Voici le code macro que j'avais entré (après plusieurs recherches sur internet) :
Sub Test()
Dim Formule As String
Dim Module As Integer
Formule = "=VLOOKUP(C48,'BASE PRODUIT'!B5:Z19,3,FALSE)"
ActiveCell.Offset(0, 0).Value = Formule
ActiveCell.Offset(1, 0).Select
End Sub
bouket
Messages postés
143
Date d'inscription
mardi 11 août 2009
Statut
Membre
Dernière intervention
16 octobre 2011
22
14 août 2009 à 22:30
14 août 2009 à 22:30
Désolé, j'ai l'impression d'être simplet ! Mais, pouvez vous donner un exemple concret de où et quoi doit aller chercher la macro ?
Je pense que la macro devrait plutôt s'apparenter à quelque chose du goût :
Je vais chercher quelque chose qui correspond, je l'enregistre et je le met dans la première case vide de mon tableau, puis suite de la recherche, si nouvelle chose qui correspond, je l'enre... et ainsi de suite !
Est-ce proche de ce que vous souhaitez faire ?
+
Je pense que la macro devrait plutôt s'apparenter à quelque chose du goût :
Je vais chercher quelque chose qui correspond, je l'enregistre et je le met dans la première case vide de mon tableau, puis suite de la recherche, si nouvelle chose qui correspond, je l'enre... et ainsi de suite !
Est-ce proche de ce que vous souhaitez faire ?
+
Le principe de fonctionnement du tableau est le suivant :
il faut remplir préalablement plusieurs préférences dont la marque, la puissance et le prix. Il faut en outre renseigner les dimensions de l'installation.
Après tout cela, ce que j'aimerais c'est que mon tableau indique toutes les offres possibles qui répondent aux critères rentrés.
Par exemple, pour une marque X, une puissance Y et un prix W, dans ma base produit je vois qu'il y a 3 offres correspondantes et je voudrais donc que ces 3 offres apparaissent dans le tableau (puisque vous l'aurez compris la base produit ne sera pas visible)
L'intérêt de ce tableau est de permettre à l'utilisateur de choisir le produit sur lequel faire le devis.
En espérant que ces indications te permettent de mieux comprendre mon problème ^^.
++
il faut remplir préalablement plusieurs préférences dont la marque, la puissance et le prix. Il faut en outre renseigner les dimensions de l'installation.
Après tout cela, ce que j'aimerais c'est que mon tableau indique toutes les offres possibles qui répondent aux critères rentrés.
Par exemple, pour une marque X, une puissance Y et un prix W, dans ma base produit je vois qu'il y a 3 offres correspondantes et je voudrais donc que ces 3 offres apparaissent dans le tableau (puisque vous l'aurez compris la base produit ne sera pas visible)
L'intérêt de ce tableau est de permettre à l'utilisateur de choisir le produit sur lequel faire le devis.
En espérant que ces indications te permettent de mieux comprendre mon problème ^^.
++
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
eriiic
Messages postés
24600
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 octobre 2024
7 239
15 août 2009 à 09:53
15 août 2009 à 09:53
Bonjour,
dépose donc un fichier exemple sur cijoint.fr et colle ici le lien fourni
eric
dépose donc un fichier exemple sur cijoint.fr et colle ici le lien fourni
eric
bouket
Messages postés
143
Date d'inscription
mardi 11 août 2009
Statut
Membre
Dernière intervention
16 octobre 2011
22
15 août 2009 à 15:25
15 août 2009 à 15:25
Je travaille sur le code, j'ai plusieurs questions concernant la qualité des recherches que la macro doit effectuer...
Le prix, la marque et la puissance doivent être recherché dans quel ordre, avec quel rigueur, je veux dire:
si je trouve la bonne marque, le bon prix mais que la puissance est légèrement inférieur, dois-je quand même le faire figurer dans la recherche... ?
Plus vous serez précis sur la qualité de la recherche qui doit être effectuer, mieux cela sera :) !
Le prix, la marque et la puissance doivent être recherché dans quel ordre, avec quel rigueur, je veux dire:
si je trouve la bonne marque, le bon prix mais que la puissance est légèrement inférieur, dois-je quand même le faire figurer dans la recherche... ?
Plus vous serez précis sur la qualité de la recherche qui doit être effectuer, mieux cela sera :) !
Globalement, si on choisit une marque X la macro doit uniquement chercher les références de cette marque X (de même pour les autres marques - 3 au total). Ensuite, si le prix reste un critère important, la puissance peut varier. Je m'explique :
L'utilisateur définit une puissance souhaitée (par exemple 2500<>3000). Ensuite il rentre les dimensions de l'installation ce qui lui permet d'avoir le nombre théorique de produit à installer. Simultanément, dans la base prix, le nombre effectif de produit par référence est calculé. Finalement, le résultat final peut légèrement différé des préférences de départ.
Pour revenir à nos moutons, il faudrait donc (dans la mesure du possible) que la macro aille chercher les produits en fonction de la marque désirée, du prix souhaitée et de la puissance avec une marge de + ou - 10%.
NB : je m'excuse mais je ne pourrai vous communiquer le fichier (celui-ci doit rester confidentiel).
L'utilisateur définit une puissance souhaitée (par exemple 2500<>3000). Ensuite il rentre les dimensions de l'installation ce qui lui permet d'avoir le nombre théorique de produit à installer. Simultanément, dans la base prix, le nombre effectif de produit par référence est calculé. Finalement, le résultat final peut légèrement différé des préférences de départ.
Pour revenir à nos moutons, il faudrait donc (dans la mesure du possible) que la macro aille chercher les produits en fonction de la marque désirée, du prix souhaitée et de la puissance avec une marge de + ou - 10%.
NB : je m'excuse mais je ne pourrai vous communiquer le fichier (celui-ci doit rester confidentiel).
bouket
Messages postés
143
Date d'inscription
mardi 11 août 2009
Statut
Membre
Dernière intervention
16 octobre 2011
22
15 août 2009 à 22:47
15 août 2009 à 22:47
je comprend, je vais donc tenir compte de la marge de 10 % autour de la valeur rentrée par l'utilisateur ;)
à demain !
à demain !
bouket
Messages postés
143
Date d'inscription
mardi 11 août 2009
Statut
Membre
Dernière intervention
16 octobre 2011
22
16 août 2009 à 15:15
16 août 2009 à 15:15
Bonjour,
Voici le lien vers le fichier que j'ai préparé : https://www.cjoint.com/?iqpoAhqMTU
Je vous laisse découvrir et poser vos questions sur le code ;) (je n'ai pas mis de commentaire pour que vous essayer de comprendre la logique par vous même, et placiez vos propre commentaire)
++
Voici le lien vers le fichier que j'ai préparé : https://www.cjoint.com/?iqpoAhqMTU
Je vous laisse découvrir et poser vos questions sur le code ;) (je n'ai pas mis de commentaire pour que vous essayer de comprendre la logique par vous même, et placiez vos propre commentaire)
++
Salut,
De nouveau merci pour cette macro. J'ai essayé aujourd'hui de la transposer pour mon fichier. Pour mieux la comprendre je l'ai recopiée petit à petit (et pas de copier/coller). Par contre, j'ai un problème. Après avoir rentré le code cells.find(...).Activate vba me demande de rajouter with. Du coup je le fais mais après il me réclame de définir la colonne marque comme objet ou variable.
Je vais continuer à plancher dessus mais si vous pouvez me donner un p'tit coup de main ce ne serait pas de refus !
Par ailleurs, j'ai deux précisions à rajouter :
- il me semble que dans votre macro vous n'ayez pas pris en compte le modèle de la marque (exemple : dans votre fichier, en plus de vos marques il faudrait des modèles comme la clio, la mégane pour renault).
- quand il y a plusieurs offres possibles comment la macro réagit-elle ?
De nouveau merci pour cette macro. J'ai essayé aujourd'hui de la transposer pour mon fichier. Pour mieux la comprendre je l'ai recopiée petit à petit (et pas de copier/coller). Par contre, j'ai un problème. Après avoir rentré le code cells.find(...).Activate vba me demande de rajouter with. Du coup je le fais mais après il me réclame de définir la colonne marque comme objet ou variable.
Je vais continuer à plancher dessus mais si vous pouvez me donner un p'tit coup de main ce ne serait pas de refus !
Par ailleurs, j'ai deux précisions à rajouter :
- il me semble que dans votre macro vous n'ayez pas pris en compte le modèle de la marque (exemple : dans votre fichier, en plus de vos marques il faudrait des modèles comme la clio, la mégane pour renault).
- quand il y a plusieurs offres possibles comment la macro réagit-elle ?
bouket
Messages postés
143
Date d'inscription
mardi 11 août 2009
Statut
Membre
Dernière intervention
16 octobre 2011
22
17 août 2009 à 19:28
17 août 2009 à 19:28
non en effet, je n'ai pas tenu compte du modèle d'une marque, on peut remédié à cela en liant la recherche de la marque au modèle...
Dans la partie recherche de la marque, il suffit de rajouter une condition supplémentaire sur le modèle !
Comme je ne savais pas comment rendre la recherche, j'ai simplement fait en sorte que les différentes offres possibles se mettent les unes en dessous des autres (cela correspond à la variable m qui commence à la ligne 6 et qui n'incrémente à chaque fois que l'on ajoute une offre)
sinon, je vous propose de me passer le code que vous avez modifiez, pour voir comment remédier au problème du with et de la recherche de la colonne ;) !
à plus tard!
Dans la partie recherche de la marque, il suffit de rajouter une condition supplémentaire sur le modèle !
Comme je ne savais pas comment rendre la recherche, j'ai simplement fait en sorte que les différentes offres possibles se mettent les unes en dessous des autres (cela correspond à la variable m qui commence à la ligne 6 et qui n'incrémente à chaque fois que l'on ajoute une offre)
sinon, je vous propose de me passer le code que vous avez modifiez, pour voir comment remédier au problème du with et de la recherche de la colonne ;) !
à plus tard!
modele_rech = Cells(4, 2).Value Sheets("produit").Activate 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 Cells.Find(What:="modèle", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, SearchFormat:=False).Activate colonne_modele = ActiveCell.Column While (Cells(i, colonne_marque).Value <> "") If (marque_rech = Cells(i, colonne_marque).Value And modele_rech = Cells(i, colonne_modele).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
Voici le code sur lequel ma macro bloque :
Sub Recherche()
Dim marque_rech As String
Dim puissance_rech As Variant
Dim prix_rech As Variant
Dim colonne_marque As Integer
Dim colonne_puissance_totale As Integer
Dim colonne_tranche As Integer
Dim table_resultat(150) As Integer
Dim puissance As Variant
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
puissance_rech = Cells(13, 4).Value
prix_rech = Cells(14, 4).Value
Sheets("base produit").Activate
colonne_marque = ActiveCell.Column
If (marque_rech <> "") Then
Cells.Find(what:=(marque_rech), after:=ActiveCell, LookIn:=xlFormulas, lookat:=xlPart, searchorder:=xlByRows, searchdirection:=xlNext, MatchCase:=False, searchformat:=False).Activate
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
End If
End Sub
Plus précisément, c'est au niveau du code commençant par "Cells.Find(...).Activate". Vba m'annonce "Erreur d'exécution '91' : variable objet ou variable de bloc With non définie".
Je tiens à préciser que sur votre fichier, la macro fonctionne très bien.
Sub Recherche()
Dim marque_rech As String
Dim puissance_rech As Variant
Dim prix_rech As Variant
Dim colonne_marque As Integer
Dim colonne_puissance_totale As Integer
Dim colonne_tranche As Integer
Dim table_resultat(150) As Integer
Dim puissance As Variant
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
puissance_rech = Cells(13, 4).Value
prix_rech = Cells(14, 4).Value
Sheets("base produit").Activate
colonne_marque = ActiveCell.Column
If (marque_rech <> "") Then
Cells.Find(what:=(marque_rech), after:=ActiveCell, LookIn:=xlFormulas, lookat:=xlPart, searchorder:=xlByRows, searchdirection:=xlNext, MatchCase:=False, searchformat:=False).Activate
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
End If
End Sub
Plus précisément, c'est au niveau du code commençant par "Cells.Find(...).Activate". Vba m'annonce "Erreur d'exécution '91' : variable objet ou variable de bloc With non définie".
Je tiens à préciser que sur votre fichier, la macro fonctionne très bien.
bouket
Messages postés
143
Date d'inscription
mardi 11 août 2009
Statut
Membre
Dernière intervention
16 octobre 2011
22
17 août 2009 à 20:04
17 août 2009 à 20:04
Enfait, il s'agit d'une erreur assez simple à résoudre, vous avez placé la recherche de l'entête de colonne après avoir attribué le numéro de la colonne
doit se situer juste après la recherche. En effet, celle ci à pour seul but d'activer la cellule d'entête de la colonne qu'on cherche, et après on note la colonne de la cellule qu'on a activé ...
Peut surement se simplifier d'ailleurs en (mais que je trouve moins clair) :
colonne_marque = ActiveCell.Column
doit se situer juste après la recherche. En effet, celle ci à pour seul but d'activer la cellule d'entête de la colonne qu'on cherche, et après on note la colonne de la cellule qu'on a activé ...
Cells.Find(what:=(marque_rech), after:=ActiveCell, LookIn:=xlFormulas, lookat:=xlPart, searchorder:=xlByRows, searchdirection:=xlNext, MatchCase:=False, searchformat:=False).Activate colonne_marque = ActiveCell.Column
Peut surement se simplifier d'ailleurs en (mais que je trouve moins clair) :
colonne_marque = Cells.Find(what:=(marque_rech), after:=ActiveCell, LookIn:=xlFormulas, lookat:=xlPart, searchorder:=xlByRows, searchdirection:=xlNext, MatchCase:=False, searchformat:=False).Column
Je suis désolé d'insister, mais même en corrigeant cette erreur, vba m'indique le même message d'erreur au même niveau (en gras)
Sheets("base produit").Activate
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
J'ai simplement modifié le nom des feuilles par rapport à votre modèle. Peut-être faut-il modifier d'autres paramètres au début de la macro comme "i", "j", "k"... ou alors changer "integer" par "object" ou "variante".
Pour info, je travaille sur excel 2007.
Sheets("base produit").Activate
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
J'ai simplement modifié le nom des feuilles par rapport à votre modèle. Peut-être faut-il modifier d'autres paramètres au début de la macro comme "i", "j", "k"... ou alors changer "integer" par "object" ou "variante".
Pour info, je travaille sur excel 2007.
J'ai réussi (après d'immenses efforts) à trouver la solution de mon problème. Par contre, maintenant que la macro semble fonctionner (en tout cas elle n'affiche plus de message d'erreur), il ne se passe rien.
Je pense savoir d'où vient le problème c'est pourquoi j'aimerais bien que vous me précisiez un peu plus ce que représentent les lettres "i, j, k, l, m, n".
Sont-elles le résultat d'un choix arbitraire ? Sont-elles des variables inhérentes aux macros ?
Je tiens d'ailleurs à préciser que mes critères de choix n'apparaissent pas sous forme numérique mais de la manière suivante (exemple) :
- puissance : 2000<>3000
- prix : 2.50<>3.00
Une telle présentation peut-elle avoir une incidence sur le bon fonctionnement de la macro ?
++
Je pense savoir d'où vient le problème c'est pourquoi j'aimerais bien que vous me précisiez un peu plus ce que représentent les lettres "i, j, k, l, m, n".
Sont-elles le résultat d'un choix arbitraire ? Sont-elles des variables inhérentes aux macros ?
Je tiens d'ailleurs à préciser que mes critères de choix n'apparaissent pas sous forme numérique mais de la manière suivante (exemple) :
- puissance : 2000<>3000
- prix : 2.50<>3.00
Une telle présentation peut-elle avoir une incidence sur le bon fonctionnement de la macro ?
++
bouket
Messages postés
143
Date d'inscription
mardi 11 août 2009
Statut
Membre
Dernière intervention
16 octobre 2011
22
18 août 2009 à 02:50
18 août 2009 à 02:50
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 ...
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...
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...
bouket
Messages postés
143
Date d'inscription
mardi 11 août 2009
Statut
Membre
Dernière intervention
16 octobre 2011
22
18 août 2009 à 12:16
18 août 2009 à 12:16
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
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 !!!
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 !!!
bouket
Messages postés
143
Date d'inscription
mardi 11 août 2009
Statut
Membre
Dernière intervention
16 octobre 2011
22
18 août 2009 à 14:55
18 août 2009 à 14:55
Pas de problème, par contre sans le code, je ne vois pas du tout :s
copier coller ?
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...
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...
bouket
Messages postés
143
Date d'inscription
mardi 11 août 2009
Statut
Membre
Dernière intervention
16 octobre 2011
22
18 août 2009 à 15:24
18 août 2009 à 15:24
:) ! j'ai trouvé deux erreurs :) !
je donne les extraits :
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):
Mais surtout, la faute qui fait que votre macro ne rend rien, la mauvaise manipulation de la variable prix :
Tous les résultats sont donc exclus ;) car prix_unitaire = 0, il faut évidemment écrire :
voilà voilà, à plus tard !
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 !
bouket
Messages postés
143
Date d'inscription
mardi 11 août 2009
Statut
Membre
Dernière intervention
16 octobre 2011
22
18 août 2009 à 15:28
18 août 2009 à 15:28
Ah j'allais oublier, votre tableau présentant 21 colonnes, copions la ligne entière tant qu'à faire :
à remplacer par:
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
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 !
bouket
Messages postés
143
Date d'inscription
mardi 11 août 2009
Statut
Membre
Dernière intervention
16 octobre 2011
22
18 août 2009 à 15:42
18 août 2009 à 15:42
é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 ^^ !
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 ^^ !
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...
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...
bouket
Messages postés
143
Date d'inscription
mardi 11 août 2009
Statut
Membre
Dernière intervention
16 octobre 2011
22
18 août 2009 à 16:05
18 août 2009 à 16:05
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?
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?
bouket
Messages postés
143
Date d'inscription
mardi 11 août 2009
Statut
Membre
Dernière intervention
16 octobre 2011
22
18 août 2009 à 16:21
18 août 2009 à 16:21
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é
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é