Question code VBA
Hello Thev
Merci, mais il n'y a pas de fichier joint
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Merci, mais il n'y a pas de fichier joint
un oubli sans doute
L'idée de la recette base est de la considérer comme un ingrédient.
Je crée donc une recette , par exemple pois chiche cuits qui peut servir de base dans d'autres recettes. Elle a ses propres quantités.
Et puis je peux mettre des pois chiches cuits dans n'importe quelle recette, en quantité variable. Ce n'est pas parce que je mets 1 kg de pois chiches cuits dans la recette A que j'en mettrais 1Kg dans la recette B. C'est vraiment comme un ingrédient type aubergine, le besoin varie fonction de la recette. Il doit donc s'enregistre dans la BDD comme un ingrédient.
Cela ne ne parait pas simple. Comme il s'agit d'une recette, il peut y en avoir plusieurs. Je pense plutôt qu'il manque dans votre UserForm un retour sur votre recette de base si vous voulez en modifier les éléments, ce qui ferait alors que votre ligne de base (hormis le nom de la recette de base) ne servirait qu'à la recette en cours et non aussi à la modification de la recette de base.Il doit donc s'enregistrer dans la BDD comme un ingrédient.
Re Thev,
Merci pour le fichier.
Mais pour cette ligne de recette base, c'est bien l'idée. Si dans une recette, je choisis une recette base comme ingrédient, c'est uniquement pour la recette en cours et non pour une modification. En fait, la recette base choisie n'agit uniquement que comme un ingrédient parmi d'autres. On ne doit pas savoir modifier "pois chiche cuits" dans une recette où il sert d'ingrédient. Il n'est là que pour servir d'ingrédient, et rien d'autre. Si je veux modifier pois chiche cuit, je ré-ouvre tout simplement la recette pois chiche cuit (ou éventuellement commandbutton).
Et je viens de faire un tour dans le fichier, il ne reste plus que 2 petits bug, on y est presque !!
- On a encore une perte de format euro avant / après enregistrement (voir différences images). Ce bug arrive dans les deux méthodes (pourcent et poids)
- Le total de la recette ne prends pas en compte la ligne recette base lors du rechargement (alors que c'est bien pris en compte lors de la création de la recette
- Suite au dernier message: considérer la recette base utilisée dans une autre recette uniquement comme un ingrédient. La ligne ne sert qu'à ajouter l'ingrédient et non à le modifier. Chaque recette utilisant la base a donc sa propre proportion de cette recette base.
- Si je charge une recette déjà enregistrée, et que je veux lui ajouter un ingrédient que j'avais oublié, le calcul ne se fait pas (sauf si je clique sur la checkbox pièce puis que je déclick alors là ça fait effet.
- Si j'édite(via le commandebutton "+" à côté de l'ingrédient) un produit pour changer une des ces infos, quand je valide, ça bug et renvoie vers la ligne_produit dans la textbox_ingrédient_change (par exemple je choisis Yoghourt - je clique sur le "+" pour éditer - je mets ok , ça enregistre le produit, puis ça bug.
Un grand merci !!
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
ci-jointe nouvelle version
Hello Thev
Grand merci
- Si je créée la recette A, puis la B. Et que ensuite je charge la recette A, et ensuite la recette B, il y a un bug ciblé sur le code en image.
- Le Label_unite_base et le Label_pu_base ne s'affichent pas au sélection d'un recette base. Le label unité s'affiche après enregistrement et rechargement seulement. Mais le PU ne s'affiche jamais.
- Dans les conditions de vente, il faut sélectionner "au poids" ou "à la pièce" via le optionbutton. Quand j'enregistre, il retient bien le choix dans la BDD recette, mais lors du rechargement de la recette, si j'ai choisi pièce, il me recharge au poids.
- Dans l'image recette A, la ligne NOUGAT, le poids indiqué est étrange : déjà il ne prends pas en compte dans le total poids, mais aussi, le poids n'est pas juste. Si vous allez voir dans le poids unitaire de cet ingrédient, on a 0.04, donc il aurait du faire 0.04 x 0.15 = 0.006 et non 5.999. En creusant un peu, je me rends compte que tous les ingrédients avec une unité PC ont le même soucis. Il indiquent la quantité de la dernière colonne x 100 au lieu de la laisser tel quel.
- Ce bug est encore présent :
Mais je ne sais pas s'il est techniquement faisable de modifier un ingrédient en cours d'affichage sur le nom
Grand merci
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Si je créée la recette A, puis la B. Et que ensuite je charge la recette A, et ensuite la recette B, il y a un bug ciblé sur le code en image.
Je ne vois pas de quel bug il s'agit
Ce bug est encore présent :
Si j'édite(via le commandebutton "+" à côté de l'ingrédient) un produit pour changer une des ces infos, quand je valide, ça bug et renvoie vers la ligne_produit dans la textbox_ingrédient_change (par exemple je choisis Yoghourt - je clique sur le "+" pour éditer - je mets ok , ça enregistre le produit, puis ça bug.
Pas réussi à reproduire ce bug mais j'ai modifié la procédure événementielle en cause
ci-jointe nouvelle version
Hello Thev
Top, merci de votre retour.
Pour le commandbutton "+" pour modifier un produit, voici un exemple en image. J'ai choisi le nom Yoghourt, puis j'ai cliqué sur "+" et j'ai changé le nom. Je clique sur enregistrer, puis ça bug (ce qui peut paraitre logique, il ne reconnait plus le nom Yoghourt vu que je viens de le changer, il faudrait une sorte de procédure qui actualise le nom après modification).
Autre soucis constaté : si je recharge une autre recette, précédemment enregistrée qui contenant l'ingrédient encore connu sous le terme "yoghourt" d'avant sauvegarde, lors du rechargement de la recette, il bugera car il ne reconnaitra plus le nom de l'ingrédient. Est-ce qu'il ne serait pas utile (possible?) de faire une procédure qui dit : si je change un nom produit, je fais une recherche dans les recette déjà enregistrée dont un des ingrédient correspond à l'ancien terme, et je le change dans ces recette là (une sorte de recherchev(yoghourt), si vrai = remplacer (yaourt)). Il en est de même avec des changement de % pertes, poids unitaire, ... sur un produit.
Grand merci d'avance
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Autre soucis constaté : si je recharge une autre recette, précédemment enregistrée qui contenant l'ingrédient encore connu sous le terme "yoghourt" d'avant sauvegarde, lors du rechargement de la recette, il bugera car il ne reconnaitra plus le nom de l'ingrédient
La solution, c'est de rectifier au moment du rechargement de la recette.
ci-jointe nouvelle version
Merci beaucoup Thev
Alors, le changement de nom se passe bien. Idem au rechargement d'une recette. Par contre ;
- Si j'ai changé le % de perte au passage (voir image exemple , passage de perte de 35% à 50%), il ne prend pas en compte à la validation (voir image après enregistrement, le % est toujours à 35%) et du coup, il ne refait pas le calcul poids sur base du nouveau % de perte
- Si je change le poids (voir image exemple, passage de 0.12 à 0.2) il prend bien en compte cette nouvelle donnée dans le calcul de la colonne de poids (on voit bien un passage de 0.42 à 0.70). Par contre;
Il ne recalcule pas le label PU ==> Il est resté à 0.26€/pc. Avant on était sur 2.16€ = 1Kg, donc si citron = 0.12, alors PU = 0.26€. Au changement du poids unitaire à 0.2, il aurait du faire le calcul 0.2 x 2.16€ = 0.43€ /PC
- La colonne euro ne se fait pas en calcul après une mise à jour d'un nom de produit, on voit dans l'enregistrement qu'il est repassé en méthode de calcul au poids car le total euro indiqué est de 21.45€ (ce qui équivaut à 10 Kg) à la place de 0.43 € / PC x 10 = 4.30€(bien recalculé au rechargement de la recette par contre)
- Si je tente de recharge une autre recette qui est déjà enregistrée et qui contient l'ingrédient "Citron 6kg", à l'ouverture de la recette il m'envoie directement une msgbox "nouveau produit" et il ouvre le userform_produit avec l'ANCIEN NOM du produit qui n'existe évidemment plus et qui est vide du coup (voir image 3). Impossible d'enregistrer vu que champs vides, donc seul choix de cet userform_produit est d'annuler. Si je vais dans la liste des ingrédients (voir image 4), les infos poids, euro, ... sont restées, et le nom du produit a disparu.
Merci d'avance
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Si je tente de recharge une autre recette qui est déjà enregistrée et qui contient l'ingrédient "Citron 6kg", à l'ouverture de la recette il m'envoie directement une msgbox "nouveau produit" et il ouvre le userform_produit avec l'ANCIEN NOM du produit qui n'existe évidemment plus et qui est vide du coup (voir image 3). Impossible d'enregistrer vu que champs vides, donc seul choix de cet userform_produit est d'annuler. Si je vais dans la liste des ingrédients (voir image 4), les infos poids, euro, ... sont restées, et le nom du produit a dis
seul choix de cet userform_produit est d'annuler.
pourquoi? C'est le moment de remettre le bon nom du produit.
Il faudrait que l'update se fasse automatiquement.
Imaginons je fais les recettes, je mets à jour le nom de la référence citron 6kg en remplacant par citron petits 6kg.
Si j'ai 100 recettes, et que je modifier 2 mois après, c'est compliqué de se souvenir quel était le nom changé.
Est-ce que ce n'est pas possible que quand on change un nom, il en fasse la maj automatiquement sans devoir demander? (donc dans l'exemple ci dessus, la solution aurait été de rouvrir la recette précédemment enregistrée, de n'avoir pas d'ouverture d'userformproduit mais de constater quand dans les lignes ingrédients, le produit n'est plus nommé citron 6 kg mais "citron petits 6 kg" sans avoir besoin d'intervenir).
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Il faudrait que l'update se fasse automatiquement.
Trop compliqué de le mettre en place dans le UserForm Recette. Il faudrait l'installer dans le UserForm Produit en y prévoyant explicitement une fonction de modification du nom avec ancien et nouveau nom.
A vous de voir comment aménager l'apparence de ce UserForm dans ce sens.
Ok,
Mais si on change le nom d'un produit (citron 6kg ===> Citron petit 6kg), cela veut dire que dans le tb_produit, le nom change, et que le citron 6kg devient inexistant.
Il ne reste plus que ce nom dans le tb_recette qui pose pb (il peut résider dans les colonnes ingrédient1,2,3,4,... de la tb_recette)
N'est pas imaginable/simple de faire une manip qui lui dit que si je change le nom d'un ingrédient (prenons l'exemple des citron), il applique l'action suivante :
- Une recherche de l'ancien nom (citron 6kg) dans la tb_recette dans les colonnes ingrédients 1, 2, 3, ...
- Il fait une action du type if find(ancien_nom "Citron 6kg") dans tb_recette then ancien_nom (Citron 6 kg)=nouveau_nom.value (Citron petits 6kg)
Comme ça, cela permettrait de faire disparaitre toute trace de l'ancien nom.
Et concernant ces bugs, on est bien ok qu'ils ne dépendant pas de la procédure dont on parle? (voir image post précédent pour illustrer)
- Si je change le poids (voir image exemple, passage de 0.12 à 0.2) il prend bien en compte cette nouvelle donnée dans le calcul de la colonne de poids (on voit bien un passage de 0.42 à 0.70). Par contre;
Il ne recalcule pas le label PU ==> Il est resté à 0.26€/pc. Avant on était sur 2.16€ = 1Kg, donc si citron = 0.12, alors PU = 0.26€. Au changement du poids unitaire à 0.2, il aurait du faire le calcul 0.2 x 2.16€ = 0.43€ /PC
- La colonne euro ne se fait pas en calcul après une mise à jour d'un nom de produit, on voit dans l'enregistrement qu'il est repassé en méthode de calcul au poids car le total euro indiqué est de 21.45€ (ce qui équivaut à 10 Kg) à la place de 0.43 € / PC x 10 = 4.30€(bien recalculé au rechargement de la recette par contre)
Merci d'avance
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Et concernant ces bugs, on est bien ok qu'ils ne dépendant pas de la procédure dont on parle? (voir image post précédent pour illustrer)
Pour ces bugs, je pense les avoir résolu mais je pense y avoir passé assez de temps et 'il serait maintenant normal que vous repreniez la main sur votre application dont vous connaissez mieux que moi les calculs et les résultats.
ci-jointe nouvelle version
Mais si on change le nom d'un produit (citron 6kg ===> Citron petit 6kg), cela veut dire que dans le tb_produit, le nom change, et que le citron 6kg devient inexistant.
Il ne reste plus que ce nom dans le tb_recette qui pose pb (il peut résider dans les colonnes ingrédient1,2,3,4,... de la tb_recette)
N'est pas imaginable/simple de faire une manip qui lui dit que si je change le nom d'un ingrédient (prenons l'exemple des citron), il applique l'action suivante :
Une recherche de l'ancien nom (citron 6kg) dans la tb_recette dans les colonnes ingrédients 1, 2, 3, ...
Il fait une action du type if find(ancien_nom "Citron 6kg") dans tb_recette then ancien_nom (Citron 6 kg)=nouveau_nom.value (Citron petits 6kg)
Comme ça, cela permettrait de faire disparaitre toute trace de l'ancien nom.
On est bien d'accord qu'il faut écrire une procédure de ce genre mais elle doit être faite à partir de votre application produit, c'est à dire que votre Userform Produit doit intégrer une modification claire du nom de produit. Sans partir d'une recette, vous pouvez être amené à changer le nom d'un produit et il faudra évidemment le répercuter sur les recettes utilisant ce produit.
Hello Thev
Merci de votre retour et de ces derniers changements
Je comprends votre commentaire, désolé de vous avoir un peu assailli de question ces derniers temps. Il est vrai que le VBA est nouveau pour moi, et pas toujours évident de s'y retrouver. Le code de l'userform recette s'est complexifié au fur & à mesure du temps et donc c'est vrai qu'à un moment j'ai eu peur de rajouter des bugs. J'ai néanmoins continué à travaillé sur les autres userforms en attendant pour ne pas croiser vos ajouts. Est-ce que je peux continuer à vous poser des questions sur mes prochains blocages ou vous préférez que je passe un un autre post?
Je vais essaye de fait moi-même l'ajout gérant ancien nom / nouveau nom, je vous reviens si j'ai des blocages
Merci beaucoup de votre aide
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
Je pense qu'il est effectivement temps de clore ce post et pour vous de reprendre la main. La logique de ce forum est d'apporter assistance et non de faire le travail à votre place.
Donc pas de problème pour vous aider sur un blocage ou un problème ponctuel comme c'était le cas au début de ce post.
Hello Thev
J'ai avancé sur la procédure comme vous m'aviez dit de faire pour adapter les changements à partir de l'userform_produit et ça fonctionne !!
Ce que j'ai fait :
- Création d'une page en plus ("éditer produit") dans le multipage de l'userform produit qui apparait si le produit est déjà existant. S'il s'active, tous les champs qui peuvent être modifié se mette en enable=false pour éviter de changer une donnée existante.
- Si je veux modifier mon produit, je vais donc dans la page éditer produit. Je peux pour le moment changer le nom, changer le poids, changer le % de perte, changer le prix produit et changer la quantité totale du produit.
- Pour chacun des champs, j'ai veillé à ce que lors du clic sur enregistrer dans le produit, ça aille mettre à jour la BDD recette pour chacune des recettes existantes (donc si je change le nom citron en citron petit, tous les citrons se changent dans la BDD. De même pour toutes les infos ou calculs de poids / euro qui se refont aussi lors d'un changement de produit)
- J'ai également fait de même avec la recette base : si on change les infos d'une recette base, le prix va varier. Le hic c'est que le prix est déjà enregistré dans d'autres recette s'ils ont utilisé cette recette comme base. J'ai fait un lien qui permet de dire que lors de l'enregistrement d'une recette cochée comme base, il recherche dans la BDD recette si cette base est utilisée ailleurs, et recalcule le prix au kg final de la recette selon le prix qui a évolué.
- Tout ces changement permette une édition via le commandbutton_ingrédient ("+") dans le userform recette sans soucis.
Quelques interrogations ;
- Auriez-vous bien fait comme ça? J'ai testé sur plusieurs scénario, tout a l'air de bien fonctionner.
- Il me manque encore une info à updater : les allergènes, pour laquelle je n'arrive pas à écrire le code. Il faudrait que si dans l'userform produit on coche un nouvel allergène, il cherche dans la BDD toutes les recette ayant ce produit et fasse une maj de la colonne "info allergene" de la BDD. J'ai essayé avec ce code dans l'enregistrement de l'userform_produit (retiré car pas fonctionnel, mis à la suite de "MAJ NOM", mais ça ne passe pas. Comment l’écririez vous? (ici ce n'est pas nécessaire de faire passer via un enregistrement ancien / nouveau à priori, le changement peut être immédiat en concaténant les valeurs déjà existante d'allergène de la recette avec la nouvelle valeur éventuelle de l'ingrédient qui vient d'être modifié)
'MAJ allergenes
Dim allergènes(): allergènes = Array("Soja", "Arachide", "Poisson", "Crustacé", "Oeufs", "Céleri", "Moutarde", "Graine de sésame", "Mollusque", "Lupin", "Sulfites", "Lait", "Céréales avec gluten")
With tb_recettes
For y = 1 To .ListRows.Count
For numallergene = 1 To 12
'Nouveau taux perte
If .ListColumns("ingrédient" & numallergene).DataBodyRange.Rows(y) = TextBox_nom_produit Then
For i = 0 To UBound(allergènes)
col_tb_produit = Application.Match(allergènes(i), .HeaderRowRange.Value, 0) 'recherche colonne de l'allergène dans le tableau des produits
If Controls(Controls("Checkbox_" & col_tb_produit)) = True Then
If InStr(1, .ListColumns("info allergenes").DataBodyRange.Rows(y), Controls("Checkbox_" & col_tb_produit)) = 0 Then .ListColumns("info allergenes").DataBodyRange.Rows(y) = .ListColumns("info allergenes").DataBodyRange.Rows(y) & Controls("Checkbox_" & col_tb_produit) & " , "
End If
Next i
End If
Next numallergene
Next y
End With- Et dernière interrogation : comme expliqué en haut j'ai ajouté la procédure suivante dans l'userform recette à l'enregistrmeent qui permet de mettre à jour les infos de tarif des recettes où une base a été utilisée s'il y a eu un changement de prix. Ca fonctionne parfaitement. Le seul soucis est que ça se limite à une recette. Exemple : j'ai la recette base "pois chiche". J'utilise la base "pois chiches" dans la recette "salade de pois chiches". Si je met à jour pois chiche, le prix de "salade de pois chiche" va évoluer. Jusqu'ici, c'est l'effet recherché.
Par contre, si "salade de pois chiche" est elle - même une base utilisée dans "feuilleté de reste de salade de pois chiche", la MAJ des tarifs de la recette "pois chiche" n'ira pas jusqu'à cette recette. Et ça pourrait aller à l'infini (même si en pratique peu de chance). Existe-t-il une sorte de formulation qui permet de créer une réaction en chaine?
'MAJ PRIX PREPA DE BASE
If CheckBox_prepa_base.Value = True Then
With tb_recettes
For i = 1 To .ListRows.Count
If .ListColumns("Recette base").DataBodyRange.Rows(i) = TextBox_recette.Value Then
For numrecette = 1 To 12
valeur = CDec(.ListColumns("poids" & numrecette).DataBodyRange.Rows(i))
somme_poids = CDec(somme_poids) + CDec(valeur)
valeur = CDec(.ListColumns("euro" & numrecette).DataBodyRange.Rows(i))
somme_euro = CDec(somme_euro) + CDec(valeur)
Next numrecette
somme_poids = CDec(somme_poids) + CDec(.ListColumns("quantite poids base").DataBodyRange.Rows(i))
somme_euro = somme_euro + ((.ListColumns("quantite poids base").DataBodyRange.Rows(i)) * CDec(TextBox_prix_unitaire_kg))
prix_kg = CDec(somme_euro) / CDec(somme_poids)
.ListColumns("Prix au kg").DataBodyRange.Rows(i) = CDec(prix_kg)
If .ListColumns("PC calcul vente").DataBodyRange.Rows(i) <> Empty Then .ListColumns("Prix pièce").DataBodyRange.Rows(i) = CDec(somme_euro) / CDec(.ListColumns("PC calcul vente").DataBodyRange.Rows(i))
End If
Next i
End With
End IfLe fichier mis à jour est joint.
Merci d'avance
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
Pouvez-vous néanmoins conclure ce sujet à rallonge et en ouvrir éventuellement un autre afin de démarrer sur une nouvelle base permettant à d'autres personnes d'intervenir.
Je vais répondre à votre post mais ce sera la dernière fois pour ce sujet.
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Auriez-vous bien fait comme ça? J'ai testé sur plusieurs scénario, tout a l'air de bien fonctionner.
Peut être pas. Mais si ça fonctionne, c'est le principal
.
l me manque encore une info à updater : les allergènes, pour laquelle je n'arrive pas à écrire le code.
je vous joins une nouvelle version sur ce point avec mise en place d'un module de classe pour les allergènes
Par contre, si "salade de pois chiche" est elle - même une base utilisée dans "feuilleté de reste de salade de pois chiche", la MAJ des tarifs de la recette "pois chiche" n'ira pas jusqu'à cette recette. Et ça pourrait aller à l'infini (même si en pratique peu de chance ). Existe-t-il une sorte de formulation qui permet de créer une réaction en chaine?
Là-dessus, la bonne solution serait dès lors qu'une recette utilise une recette de base, de ne pas remplir les colonnes concernées : Prix au kg, Prix pièce, .... par des valeurs fixes mais par des formules faisant référence aux colonnes correspondantes de la recette de base concernée.
Pour ce qui concerne ce sujet, je ne répondrai plus que sur l'info à updater : les allergènes.
Pour le reste, vous ouvrez un nouveau sujet sur une problématique précise.