Question code VBA

J'espère que vous allez bien Avez-vous déjà pu jeter un oeil à mes interrogations? (désolé pour la quantité :-/)

Je suis en train de les examiner mais il y a de la matière ….

Top, un grand merci

Bonsoir,

ci-jointe nouvelle version qui doit régler la plupart de vos points et dans laquelle j'ai intégré ce que je proposais dans la version précédente.

Je vous conseille fortement de repartir de cette version car j'y ai intégré des modifications diverses.

soucis de taille de police (une partie gros et petite) : si on complète une bonne partie du userform ingrédient, certains parties sont en police petite, d'autre plus grande. Alors que le réglage est le même partout au niveaux des fonts.

Non réglé pour le moment

Est-il possible de rajouter la possibilité d'adjoindre une image à la recette? Elle serait visible dans un espace du formulaire, mais je présume que le stockage doit se faire quelque part? Chemin vers dossier? Comment faire?

C'est tout à fait possible. Mais il faut évidemment disposer de l'image. Le plus simple serait de les stocker dans le même répertoire que le classeur et de les nommer avec le même nom que la recette.

Possible de formater le prix indiquer dans le userform_recherche_prod : pour le moment il y a 4 colonnes. Deux de textes et deux autres en monétaire (prix unitaire et tarif total).

Est-ce possible de formater ces colonnes en €?

Oui, mais j'en vois pas l'intérêt.

Dans mon code, je demande que lors de l'ouverture du userform_recherche_prod il me fasse un tri sur le "prix unitaire" (cfr code ci dessous)

Cela fonctionne bien à l'ouverture du userform (au double clic dans la case ingrédient), MAIS dès que je tape une recherche, il ne tient plus compte du filtre.

A mon avis c'est car le filtre agit une fois à l'ouverture de l'userform, et pas à chaque raffrachissement de listbox dès qu'on tape un élément dans le champ de recherche jaune.

Est-ce faisable de faire en sorte que le filtre agisse de manière continue?

Bizarre, car je n'ai pas détecté de souci sur le filtrage. Le seul point est qu'il ne filtre pas selon la position des chiffres à filtrer.

Question sur la création de recette :

si je mets des ingrédients qui ont des allergènes réglés, la textbox allergenes se mets à jour dans la recette avec tous les allergènes des ingrédients sélectionnés.

Imaginons, aucun des ingrédient n'a un allergène. Je complète ma recette, la textbox allergène sera vierge.

Si je modifie ensuite un ingrédient dans ma BDD et que je lui rajoute un allergène, ma recette ne se mettra pas à jour toute seule DANS la BDD.

Et si je ré-ouvre la recette, l'allergène se met bien a jour car j'ai rajouté le code dans le textbox_ingrédient_afterupdate (et dans tous les cas, à l'enregistrement, il se met à jour).

En bref, existe-t-il une solution pour que si une MAJ à lieu dans une BDD, des infos déjà créées se mettent à jour seul (allergène par exemple).

La question peu se poser avec une multitude de choses (changement de prix,...)

C'est en soi une bonne question mais je dirai qu'elle est en général résolue par l'organisation de vos données. En principe une donnée ne doit être stockée qu'une fois dans une BDD et pour les autres BDD qui l'utilise, on emploie un lien ou une formule.

Telles que vos BDD sont organisées, il faudra passer par vos Userforms pour finaliser vos mises à jours.

Re Thev

Un grand merci de votre retour et surtout de votre précieuse aide Une partie des soucis ont été résolus.

Il reste quelques points de la liste qui n'ont pas encore trouvé solution d'après moi,

  • Les changement de méthode % / poids ne se fait plus. Pas de réaction au clic sur le label. Pour moi c'est dû au fait que c'est le mauvais label qui est indiqué dans la procédure sur label_méthode_click.
    Ce ne devrait pas être comme ceci? Mais même si je fais le changement, une bonne partie des changements ne se fait plus (disparition unité, apparitié cellule qté en pourcent, mise en forme %, ...

    Du coup, je n'ai pas su vérifier le point sur la checkbox PC qui bugait dans ma liste de questions (le 3eme soucis de la liste)
    Idem avec le point suivant (sauvegarde en % puis rechargement en %)
  • Si vous sélectionner dans le commandbutton recherche à côté du nom de la recette la recette pois chiche cuits puis une autre recette, puis à nouveau la recette pois chiche cuits on a de nouveau une erreur.
    L'erreur est division par zéro (comme s'il voulait diviser par la colonne 38 alors que normalement il ne devrait pas car c'est pas un produit à la pièce)
    Il cible le code dans Private Sub CheckBox_poids_par_pce_Click()
    prix_par_article = CDbl(sh_prod.Cells(ligne_produit, 10)) / (CDbl(sh_prod.Cells(ligne_produit, 8)) / CDbl(sh_prod.Cells(ligne_produit, 38)))
  • Quant à mon intérêt de voir formater dans le userform_recherche_prod les colonne de prix en €, c'est juste par soucis de lisibilité. Je ne trouve pas cela suffisament clair d'avoir des prix à 1 décimale, à deux décimale, à trois décimales, ..
    C'est plus la régularité du nombre de décimale qui m'intéresse que le nombre euro.
  • Concernant le filtre ComboTri = "prix unitaire", il fonctionne, MAIS uniquement à l'ouverture du userform_recherche_prod. Dès que je recherche une référence dans la textbox de couleur jaune, le filtre ne fait plus effet et je dois recliquer dessus pour que ça fonctionne.
    Il vaudra que ça fonctionne tout au long de l'événement Private Sub Tbx_recherche_Change() en quelque sorte (j'ai essayé de mettre ComboTri_click à la fin mais ça provoque des bugs).
  • Concernant l'ajout d'image, si c'est possible, quelle est la procédure pour que idéalement : je puisse choisir une image sur le PC - elle s'affiche dans le userform (redimensionnement préférable?) - et sauvegarde dans BDD (via dossier je présume).
    Ou alors ajout dans un dossier au même nom que la recette (dans le même dossier que le fichier, mais ensuite?
  • Concernant la question sur la modification d'un produit directement dans les ingrédients qui ne se fait pas de suite dans le userformrecette, ça ne fonctionne pas encore.
    Je m'explique. Si vous choisissez, dans la page ingrédient de l'userform recette le produit "Pomme de terre grosse Epluchee S/ Vide 10 Kg".
    Ensuite, vous cliquez sur le "+" (commandbutton) pour modifier l'ingrédient. Cet ingrédient ne possède pas de poids unitaire. Si vous réglez 0.1 en poids unitaire, et sauvegarder ensuite, logiquement cela devrait ajouter sur la ligne ingrédient la checkbox pièce à la fin pour pouvoir faire le calcul à la pièce (vu qu'on a rajouté un poids unitaire).
    Or, il ne le propose pas. Je dois aller sur une autre ligne, rajouter à nouveau le produit, et là c'est bon. il manque une sorte de "raffraichissement de ligne" après une maj des infos produit.
  • Concernant sur votre dernier point quant au fait qu'une construction différente de la BDD aurait permis de peut être régler le soucis en cas de modification d'ingrédient et allèrgènes changeant automatiquement, comment auriez vous procédé?

Un tout grand merci d'avance

Bonjour,

ci-jointe nouvelle version qui devrait répondre aux 2 premiers points.

Hello Thev

Merci de votre retour.

On y est presque

Encore deux petits éléments qui ne vont pas sur ces méthodes en % ;

  • La sauvegarde et le chargement de la méthode % fonctionne bien. Sauf pour le rechargement de la quantité pour la recette de base. Le nom et euro se recharge bien, mais pas la quantité & le poids.
  • Le label avec le controltiptext "pu" qui vise à afficher le prix unitaire pour chaque article ne s'affiche plus sur les lignes des ingrédients. Et celui de la recette de base est affiché alors qu'il devrait être non visible (idem pour le label unité) tant qu'une recette n'est pas sélectionnée. Par contre en cas de recette base sélectionnée, il fonctionne bien (à l'inverse des ingrédients).
  • Si je choisi "Betteraves, poires, menthe", puis "Pois chiches cuits " dans les recettes, j'ai l'erreur suivante : "Variable objet ou variable de bloc with non définie" avec la ligne "ligne_produit" en erreur dans le code suivant :
    '++++++++++ Définition des paramètre +++++++++++
    With tb_produit
        ligne_produit = .ListColumns("Reference produit").Range.Find(Txt_ingrédient.Value).Row - .HeaderRowRange.Row
        prix_par_unite_poids = CDbl(.ListColumns("Tarif total").DataBodyRange.Rows(ligne_produit)) / CDbl(.ListColumns("Quantité").DataBodyRange.Rows(ligne_produit))
        unite_de_poids = .ListColumns("Poids").DataBodyRange.Rows(ligne_produit)
        poids_unitaire = .ListColumns("poids unitaire").DataBodyRange.Rows(ligne_produit)
        If poids_unitaire <> Empty Then prix_par_article = CDbl(.ListColumns("Tarif total").DataBodyRange.Rows(ligne_produit)) / (CDbl(.ListColumns("Quantité").DataBodyRange.Rows(ligne_produit)) / CDbl(poids_unitaire))
    End With
  • Les checkbox pièce au changement de méthode poids==>pourcent==>poids ne s'affiche pas encore bien. Cfr les images que j'ai liées, vous verrez ce dont je parle. Le soucis que ça peut entrainer : si on nougat est à 0.50€ /PC, au troisième passage quand il affiche la checkbox, il va aller calculer le prix PC / colonne 38 et donc arriver à un prix unitaire très bas.

Merci d'avance

etape 3 retour methode pourcent vers methode quantite etape 2 methode pourcent etape 1 choix ingredients methode poids

Bonjour,

ci-jointe nouvelle version + arrondi à 2 décimales sur recherche produit + généralisation code tableaux structurés

Bonjour,

ci-jointe nouvelle version qui devrait résoudre les derniers soucis + ceux concernant la recherche produit

Concernant sur votre dernier point quant au fait qu'une construction différente de la BDD aurait permis de peut être régler le soucis en cas de modification d'ingrédient et allèrgènes changeant automatiquement, comment auriez vous procédé?

Dans votre cas, la seule amélioration possible est l'utilisation de formules et ce d'abord dans la BDD Recettes. Par exemple, les colonnes suivantes peuvent être calculés par formule : euro , poids, perte, pièce à partir des données de la Base Recette et de la Base Produits. A noter que dans un tableau structuré toutes les formules se répliquent automatiquement.

Par ailleurs, au niveau de votre base Produits, il serait beaucoup plus logique et simplificateur pour les formules de mettre en première colonne l'identifiant de chacune de vos lignes, c'est à dire la référence produit. Ce changement ne posera aucun problème pour les procédures où le code tableau structuré est utilisé mais nécessitera une adaptation dans les autres, notamment celle de la recherche produit.

Hello Thev

Grand merci pour votre temps et vos dernières corrections !! Beaucoup des petits bugs sont partis, et les améliorations demandées sont top (filtre prix unitaire, décimales, ...), c'est top !!

Encore deux trois bugs - je vous en ai illustré plusieurs avec images ;

  • Si on fait une nouvelle recette, la colonne quantité n'apparait plus. Il n'y a pas de cases pour introduire la quantité. La seule manière de l'afficher est de cliquer sur la méthode pour faire apparaitre la méthode pourcent, puis la méthode poids et là ça apparait.
  • Par défaut, dans la présentation, le label unité ne devrait pas être visible (ni le PU1). Il ne devraient apparaitre qu'à la sélection d'un produit. Normalement ces codes dans initialize ne sont pas censés faire cet effet?
    'Labels
    Label_unite_base.Visible = False
    Label_pu_base.Visible = False
    Label_méthode_de_calcul.Caption = "Méthode au poids"
    
  • Lors de la méthode pourcent, toutes les cases checkbox pièce doivent disparaitre, sans exception. Ce qui n'est plus le cas maintenant
  • Que ce soit en méthode pourcent ou poids, le calcul euro de la recette base (dernière ligne) ne se fait plus
  • Lors du rechargement d'une recette poids ou pourcent, il n'y a que le nom de la recette base (dernière ligne) qui se recharge, mais aucune des infos poids et cout euro.
  • Si je charge une recette avec 6 ingrédient, puis une recette à 1 ingrédient, tout les ingrédient s'efface bien, sauf le label PU
  • Si je charge une recette existante, puis que je veux aller lui rajouter un ingrédient, quand on sélectionne l'ingrédient, il n'affiche pas le taux de perte et les calculs poids / euro ne fonctionnent pas. Par contre si je clique sur la checkbox pce ensuite, il affiche le montant euro mais perte / poids ne fonctionnent pas.
  • Question : à quoi était dû le fait que la taille de la police variait alors que les réglages sont standards
  • La procédure au clic dans la case TextBox_ingrédient_manquant = empty a été remplacée par la fonction touche espace. Le soucis c'est qu'on ne peut plus rien écrire dedans avec des espaces du coup Le plus simple est peut être juste de supprimer la fonction empty alors tout simplement.
  • Quelle est la procédure à suivre du coup pour charger une image? (commandbutton charger image = ouverture dossier pour choisir image? Si oui, ça donne quoi en code. Et un aperçu dans le userform est possible?

Un grand merci d'avance

chargement recette aubergines et pommes de terre rechargement d une recette sur une autre rechargement recette pourcent corrections ok une fois produit selectionne ne doit pas etre present

Bonjour,

ci-jointe nouvelle version

Hello Thev

Merci beaucoup pour cette dernière version.

Je trouve encore 2-3 bugs

  • dans la méthode poids, si on indique une quantité inférieure à 1, ça ne calcule pas le poids et l'euro. Par contre supérieur à 1 avec décimales, ça fonctionne.
  • Après enregistrement, au rechargement de la recette, la ligne base ne recharge pas les données enregistrée avant. J'ai fait un test avec recette base pois chiches en mettant 2.3 en quantité, et à la recharge il me mets 1 en quantité. Il me fait aussi un soucis après rechargement avec les quantité pièce. Voir image 1 et image 2, j'ai mis 5 citron (PC), et au rechargement, il me mets 5 Kg. Et de manière générale, je vois que toute recette enregistrée avec une ligne avec case pce cochée est repassée hors case cochée après rechargement
  • j'ai fait un test de sauvegarde de recette en %. Il m'affiche un bug ciblé dans le code textbox ingrédient change, sur la ligne "ligne_produit = .ListColumns("Reference produit").Range.Find(ctrl.Value).Row - .HeaderRowRange.Row".
    Et au passage, il m'a repassé le tout en méthode quantité, et n'a retenu aucune quantité (voir imagte 3 - 4 )
    '++++++++++ Récupération des ingrédients de la recette et remplissage allergènes  +++++++++++
    TextBox_allergene.Value = Empty
    For Each ctrl In Me.Controls
        If TypeOf ctrl Is MSForms.TextBox And ctrl.ControlTipText = ingrédient Then
            If ctrl.Value <> Empty Then
                With tb_produit
                    ligne_produit = .ListColumns("Reference produit").Range.Find(ctrl.Value).Row - .HeaderRowRange.Row
                    '++++++ Allergènes++++++++++++++++++++++
                    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 .ListColumns(col_tb_produit).DataBodyRange.Rows(ligne_produit) = True Then
                            If InStr(1, TextBox_allergene.Value, .ListColumns(col_tb_produit)) = 0 Then TextBox_allergene.Value = TextBox_allergene.Value & .ListColumns(col_tb_produit) & " , "
                        End If
                    Next i
                End With
            End If
        End If
  • je mets une recette que j'ai tenté d'enregistrer en pce jointe (image 5). Ca a provoqué un bug, ciblé sur exactement la meme ligne que le code précédent. J'ai ensuite retenté de réencoder à l'identique, pas eu de bug direct, mais au rechargement de la recette à nouveau un bug ciblé sur exactement le même code

Grand merci d'avance

recette test avec bug image 4 apres rechargement methode pourcent image 3 avant enregistrement methode pourcent image 2 apres chargement image 1 avant enregistrement calcul ne se fait pas

Bonsoir,

ci-jointe nouvelle version

j'ai fait un test de sauvegarde de recette en %. Il m'affiche un bug ciblé dans le code textbox ingrédient change, sur la ligne "ligne_produit = .ListColumns("Reference produit").Range.Find(ctrl.Value).Row - .HeaderRowRange.Row".

Ce bug est dû à la présence de virgule dans une référence produit. Je l'ai remplacée par un point. De toute façon, il est nécessaire à l'enregistrement en BDD de remplacer les virgules par des points pour que les nombres s'enregistrent bien comme des nombres et non comme du texte.

La procédure au clic dans la case TextBox_ingrédient_manquant = empty a été remplacée par la fonction touche espace. Le soucis c'est qu'on ne peut plus rien écrire dedans avec des espaces du coup Le plus simple est peut être juste de supprimer la fonction empty alors tout simplement.

J'ai modifié et l'ai remplacé par la touche "Supp" via un changement de la procédure événementielle.

Concernant l'ajout d'image, si c'est possible, quelle est la procédure pour que idéalement : je puisse choisir une image sur le PC - elle s'affiche dans le userform (redimensionnement préférable?) - et sauvegarde dans BDD (via dossier je présume).

Ou alors ajout dans un dossier au même nom que la recette (dans le même dossier que le fichier, mais ensuite?

Je pense que le mieux est de stocker les images dans un sous-dossier du répertoire de votre classeur et ensuite dans de sauvegarder dans la BDD le chemin de l'image propre à chaque recette. L'image pourra se charger dans votre UserForm à l'aide de ce chemin dans un contrôle image.

Re Thev

Merci de votre retour

Encore qques blocages ;

  • Il ne calcule pas le total pour certains produits (voir image 1 : aubergine). Si je modifie le pourcentage de perte, si je sauvegarde et que je recharge (image 2), il ne retient pas et remet le % de perte par défaut du produit.
  • Au rechargement de la recette (image2), il n'indique toujours pas le total d'aubergine. Et en plus, il ne fait plus le total du citron mis en méthode pièce (via checkbox) avant enregistrement. Il a aussi oublié le format euro d'aubergine et citron.
  • Il y a le même soucis d'oubli du % de perte s'il a été modifié avec la méthode % après enregistrement (image 3 vers 4). Autre chose aussi : il ne devrait pas indiquer la checkbox pièce aux citrons en méthode % (aucune checkbox en méthode pourcent). Ce qui est étonnant, c'est qu'au rechargement de la recette, il la cache bien. Oubli du format euro du citron au rechargement également.
  • Si vous chargez la recette aubergine en dip, il ne calcule pas le cout du cumin ou de l'ail. (image 5 ). alors que pour la recette Aubergines. épices. graines de tournesol il calcule bien le total.

Ce bug est dû à la présence de virgule dans une référence produit. Je l'ai remplacée par un point. De toute façon, il est nécessaire à l'enregistrement en BDD de remplacer les virgules par des points pour que les nombres s'enregistrent bien comme des nombres et non comme du texte.

Je ne comprends pas trop ce que vous dites? Vous parlez d'un point dans un prix de la BDD? Tous les prix sont avec des virgules j'ai l'impression non? Ou vous parlez du nom du produit?

Grand merci d'avance

recette aubergines en dip image 4 rechargement pourcent image 3 avant rec pourcent image 2 rechargement image 1 avant rec

Je ne comprends pas trop ce que vous dites? Vous parlez d'un point dans un prix de la BDD? Tous les prix sont avec des virgules j'ai l'impression non? Ou vous parlez du nom du produit?

Il s'agissait de la virgule présente dans le nom du produit : noix de coco râpée 5,2 kg

D'autre part, au moment de l'enregistrement dans la BDD, une quantité 0,25 sera interprété comme du texte et non comme un nombre décimal. C'est pourquoi à ce moment, je change la virgule en point car sous VBA le point décimal est le point et non la virgule.

Hello Thev

Merci de votre retour, du coup c'est mieux si dans la création de la fiche produit je demande à la textbox nom produit de changer la virgule par un point.

Concernant les derniers soucis bloquants d'hier, s'ajoute un soucis concernant la ligne ingrédient base.

Si je fais une recette A avec la base pois chiche cuits et que je mets 1.5kg, il va enregistrer et retenir jusqu'à ce que je passe à la recette suivante. Si je fait une recette B, et que le mets 3.2 kg pour cette base, il va me le retenir, mais par contre il va aussi changer le poids de la base de la recette A de 1.5 à 3.2Kg. Il n'enregistre donc pas le poids de l'ingrédient base pour chacune des recette si un même ingrédient base est utilisé.

Merci d'avance

Merci de votre retour, du coup c'est mieux si dans la création de la fiche produit je demande à la textbox nom produit de changer la virgule par un point.

C'est déjà fait puisque je l'ai mis en place pour les nombres avec virgule. La boucle le prendra en compte également pour le nom du produit.

concernant les derniers soucis bloquants d'hier, s'ajoute un soucis concernant la ligne ingrédient base.

Si je fais une recette A avec la base pois chiche cuits et que je mets 1.5kg, il va enregistrer et retenir jusqu'à ce que je passe à la recette suivante. Si je fait une recette B, et que le mets 3.2 kg pour cette base, il va me le retenir, mais par contre il va aussi changer le poids de la base de la recette A de 1.5 à 3.2Kg. Il n'enregistre donc pas le poids de l'ingrédient base pour chacune des recette si un même ingrédient base est utilisé.

Le problème est que vous n'avez qu'un seul champ d'affichage pour le poids de base avec 2 sources différentes : la recette en cours et la recette de base. Pour le moment, la priorité d'affichage est celle de la recette de base si elle est présente.

ci-jointe nouvelle version

Hello Thev

Merci de votre retour

Concernant la recette base, le soucis, c'est que si on met une quantité dans la case quantité, il retient cette quantité comme si c'était lié à un formulaire.

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.

Merci d'avance (je check les autres maj)

Je viens de checker le fichier, il réside encore quelques bugs ;

  • Le rechargement d'une recette qui a été sauvegardé avec un ingrédient possédant une checkbox pièce coché (et donc avec prix/poids à la pce à la place d'au Kg) ne se recharge toujours pas avec la checkobx cochée (voir image). Cela changel e poids, le cout, ...
  • si commentaire mis dans la textbox ingrédients manquants , il ne se recharge pas non plus
  • Les calculs ne se font pas automatiquement dans le bas du formulaire pour les prix à la PC. Les infos des controltypetexte PV pièce et PV poids ne se rechargent pas non plus.
  • Avec la recette en image ci jointe, après avoir sauvegardé, quand je recharge, on a une génération de bug "incompatbilité de type" dans le code Textbox_poids_Change voir image

Merci d'avance

bug incomptabilite type apres enregistrement avant enregistrement

Bonjour,

ci-jointe nouvelle version

Rechercher des sujets similaires à "question code vba"