Question code VBA

Restofrais : si je sélectionne, il me met cmd dimanche pour livraison mardi. Donc la condition d'heure a bien fonctionné (si je mets l'heure + tard, il me propose bien cmd aujourd'hui pour livraison lundi), mais il aurait dû normalement me mettre cmd lundi pour mardi (car la cdtion du mardi = le lundi). Cela vient du fait je pense, que quand une condition est dépassée (ex: 9h), il prend la condition du jour de livraison (ici cdt cmd le lundi pour le mardi) -1 (et mets donc dimanche). Car ça fait pareil avec le Fournisseur 2 qui aurait dû me dire commande le mercredi 15/04 pour livraison lundi 20/04, et il a mis cmd mard 14/04 pour livraison lundi 20/04.

Le critère d'heure étant unique, il s'applique forcément à tous les jours de livraison possibles.

erroirist : pas d'heure de réglée. Premier jour de livraison possible = lundi. Condition du lundi = commande le vendredi. Il aurait donc du me dire commande le vendredi pour livraison le lundi. Je vois que SI par contre j'indique une heure (ex : 15h), il fonctionne correctement. Cela vient donc de la condition d'heure, et je présume du fait qu'elle ne soit pas indiqué. Si pas indiqué, peut être considéré heure max = on a toute la journée jusque minuit pour commander.

Corrigé en tenant compte du fait qu'il n'y a pas d'heure renseignée.

Four. X : si j'essaie, il me met "jour de livraison non reconnu dimanche". La bonne démarche aurait été : jour livraison dimanche possible mais conditon pas respectée car commande le mercredi et on est vendredi, donc passage au jour suivant. Jour suivant possible = le lundi avec la condition du dimanche. La c'est ok, donc il aurait dû mettre "je commande lundi pour livraison dimanche". Idem Fournisseur 1. Je pense qu'il y a un soucis avec le dimanche.

Bug corrigé.

ci-jointe nouvelle version

Parfait, merci

Concernant restofrais, il y a quand même un truc que je ne comprends pas dans la logique.

L'heure est dépassée pour une livraison le lundi (jour max commande vendredi avant 9H), donc il passe au jour de livraison suivant possible : le mardi.

Pour le mardi, la condition de commande est bien le lundi et non le dimanche (ce qu'il propose pourtant). Peu importe l'heure (à priori elle n'a pas d'impact dans cette situation, non?), je ne comprends donc pas pourquoi il retourne un jour en arrière?

Merci d'avance

Je vous remets juste un petit update du fichier (le votre en source, j'ai juste pas mal changé le code du userform_recette) car j'ai pas mal avancé dans une autre section.

By the way : j'aimerais dans le cas de cet userform_recette, dans le cadre du choix des ingrédients pouvoir mettre le filtre par défaut (qui pour le moment est "département") du userform_recherche_prod en nom d'ingrédient à la place de département. Est-ce possible? (car toute recherche se fait par défaut sur le nom d'ingrédient.

J'ai essayé de mettre le code suivant mais ça ne prend pas.

Private Sub Textbox_ingrédient_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Dim USF_appelé As Object
    Dim Txt_ingrédient As Object

    'récupération du contrôle ayant déclenché l'événement et masquage du formulaire
    Set Txt_ingrédient = Me.Controls(Textbox_ingrédient.Name)
    Me.Hide

    'ouverture de la recherche dans la liste d'ingrédients_txt disponibles
    UserForm_recherche_prod.Show
     UserForm_recherche_prod..ComboChoixColFiltre = "Reference"
    'regénération des instances de classe et affectation du produit sélectionné
    With UserForm_recherche_prod.ListBox_recherche_produit                      'prend en compte la ListBox_recherche_produit
        If .ListIndex > -1 Then Txt_ingrédient.Value = .Column(5, .ListIndex)   'récupère le valeur de la colonne 0 de la ListBox_recherche_produit dans la Textbox "InstallationIDTextBox"
    End With
    Unload UserForm_recherche_prod

    'réaffichage du formulaire
    Me.Show

End Sub

Grand merci d'avance

J'ai essayé de mettre le code suivant mais ça ne prend pas.

Ces instructions ne sont pas dans la bonne séquence :

UserForm_recherche_prod.Show
UserForm_recherche_prod..ComboChoixColFiltre = "Reference"

Par ailleurs, vous pouvez simplifier la procédure événementielle, comme ceci :

Private Sub Textbox_ingrédient_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

    'ouverture de la recherche dans la liste d'ingrédients_txt disponibles
     With UserForm_recherche_prod
        .ComboChoixColFiltre = "Reference"
        .Show
        With .ListBox_recherche_produit                      'prend en compte la ListBox_recherche_produit
            If .ListIndex > -1 Then Textbox_ingrédient.Value = .Column(5, .ListIndex)   'récupère le valeur de la colonne 0 de la ListBox_recherche_produit dans la Textbox "InstallationIDTextBox"
        End With
    End With
    Unload UserForm_recherche_prod

End Sub

ci-jointe nouvelle version avec correction pour les commandes Fournisseur au niveau de l'heure (ex RestoFrais)

Hello Thev

Grand merci

Alors, concernant Restofrais, j'ai laissé toutes les conditions du tableau identique, je n'ai rien touché.

Selon toute logique, vu que pour lundi il faut commander vendredi, et que c'est passé, il doit switcher au prochain jour de livraison qui est mardi.

C'est ok, il le fait bien. La condition de livraison du mardi est le lundi. Ce qui m'étonne, c'est qu'il devrait indiquer "Je passe commande le lundi 13/04 (vu que lundi en condition) pour être livré le mardi 14/04". Et pourtant, il m'indique "Je passe commande le dimanche 12/04 pour être livré le mardi 14/04".

Concernant le double click de la feuille recette , ca fonctionne parfaitement, merci

Autre question concernant cette userform recette. Le but est de constituer une recette. Pour chacun des ingrédients, lors de leur création, on a réglé dans l'userform produit des allergènes et des saisons via des checkbox dans des frames.

Tout est donc enregistré dans la BDD_produit. Pensez-vous que il est possible de générer facilement pour chaque recette allergènes et saison selon les ingrédients choisis? Si l'allergène 'gluten' est présent dans l'ingrédient 1, 2, 3, 4, il n'apparaitra qu'une seule fois car ça n'a pas de sens de l'afficher 4 fois (et cela pour chaque allergène).

Grand merci d'avance, je ne sais pas comment j'avancerais sans votre précieuse aide !!!

Alors, concernant Restofrais, j'ai laissé toutes les conditions du tableau identique, je n'ai rien touché.

Selon toute logique, vu que pour lundi il faut commander vendredi, et que c'est passé, il doit switcher au prochain jour de livraison qui est mardi.

C'est ok, il le fait bien. La condition de livraison du mardi est le lundi. Ce qui m'étonne, c'est qu'il devrait indiquer "Je passe commande le lundi 13/04 (vu que lundi en condition) pour être livré le mardi 14/04". Et pourtant, il m'indique "Je passe commande le dimanche 12/04 pour être livré le mardi 14/04".

Et pourtant, dans la version que je vous ai transmise , il m'indique "Je passe commande le lundi13/04 pour être livré le mardi 14/04". Au niveau du code, vous devez avoir ceci :

                date_commande_virtuelle = Date + délai_livraison - délai_commande - IIf(heure_j > heure_commande, 1, 0)
                If date_commande_virtuelle >= Date Then date_livraison = Date + délai_livraison: date_commande = date_livraison - délai_commande: Exit Do

Autre question concernant cette userform recette. Le but est de constituer une recette. Pour chacun des ingrédients, lors de leur création, on a réglé dans l'userform produit des allergènes et des saisons via des checkbox dans des frames.

Tout est donc enregistré dans la BDD_produit. Pensez-vous que il est possible de générer facilement pour chaque recette allergènes et saison selon les ingrédients choisis? Si l'allergène 'gluten' est présent dans l'ingrédient 1, 2, 3, 4, il n'apparaitra qu'une seule fois car ça n'a pas de sens de l'afficher 4 fois (et cela pour chaque allergène).

Vous ajoutez dans votre UserForm une page pour les allergènes avec pour valeur : le nombre d'ingrédients concernés. Après au niveau de votre BDD , soit vous reproduisez cette page telle quelle, soit vous y indiquez la valeur FAUX si nombre ingrédients =0 et la valeur VRAI si nombre ingrédients > 0.

Bonjour Thev

En effet, ça fonctionne , merci

Concernant les allergènes, pas moyen via le code suivant sans devoir passer par une page de plus?

J'ai ajouté une textbox_allergene, l'idée est que les allergenes s'affichent dedans. J'ai mis le code dans "Private Sub Textbox_ingrédient_Change()"

    '++++++ Allergènes++++++++++++++++++++++
    If tb_produit.ListColumns("Soja").DataBodyRange.Rows(ligne_produit) = True Then Soja = "Soja"
    If tb_produit.ListColumns("Arachide").DataBodyRange.Rows(ligne_produit) = True Then Arachide = "Arachide"
    If tb_produit.ListColumns("Poisson").DataBodyRange.Rows(ligne_produit) = True Then Poisson = "Poisson"
    If tb_produit.ListColumns("Crustacé").DataBodyRange.Rows(ligne_produit) = True Then Crustacé = "Crustacé"
    If tb_produit.ListColumns("Oeufs").DataBodyRange.Rows(ligne_produit) = True Then Oeufs = "Oeufs"

    TextBox_allergene.Value = Soja & "," & Arachide & "," & Poisson & "," & Crustacé & "," & Oeufs

Ca fonctionne quand il n'y a qu'un allergènes, pas pour les suivant. Et quand il passe à la linge ingrédient suivant, il efface le textbox du précédent.

Si je comprends vos conseils, vous conseillez ;

  • ajout page allergene dans le multipage
  • pour chaque ligne d'ingrédient (?), une textbox qui contient les allergènes, ou une textebox pour chaque allergène pour chaque ligne?

Merci d'avance

[[quote=Quentinvdb post_id=857576 time=1586684952 user_id=64416]

J'ai ajouté une textbox_allergene, l'idée est que les allergenes s'affichent dedans. J'ai mis le code dans "Private Sub Textbox_ingrédient_Change()"

[/quote]

Déjà si vous voulez procéder ainsi, il faut mettre le code dans " Private Sub CommandButton_enregistrer_Click" car n'oubliez pas que vous pouvez enlever ou modifier les ingrédients avant de procéder à l'enregistrement de votre recette.

ci-dessous exemple de code :

Private Sub CommandButton_enregistrer_Click()

    Dim ligne As ListRow
    Dim ligne_insertion As Long, ligne_produit As Long, i As Integer, col_tb_produit As Integer
    Dim ctrl As Control
    Dim nom_colonne As String
    Dim allergènes(): allergènes = Array("Soja", "Arachide", "Poisson", "Crustacé", "Oeufs", "Céleri", "Moutarde", "Graine de sésame", "Mollusque", "Lupin", "Anhydride sulfureux et les Sulfites", "Lait", "Céréales avec gluten (blé, seigne, orge, avoine ou espèce hybrides)")

    '++++++++++ 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
    Next ctrl

Si je comprends vos conseils, vous conseillez ;

ajout page allergene dans le multipage

pour chaque ligne d'ingrédient (?), une textbox qui contient les allergènes, ou une textebox pour chaque allergène pour chaque ligne?

ajout page allergene dans le multipage

pour chaque ligne d'allergène, une textbox qui contient le nombre d'ingrédients concernés.

Hello Thev,

Grand merci pour votre réponse, cela fonctionne parfaitement. Mini détail : la liste d'allergène se finit par une ",", possible de dire qu'au dernier élément, on ne met rien? Si complexe, pas grave, ce n'est qu'un détail.

Autre chose : je ne comprends pas la différence entre mettre ce code dans la partie sub enregistrer ou dans sub ingredient_change? Ca a l'air de fonctionner des deux côté. L'avantage de la partie change, c'est que l'on voit directement la liste d'allergènes, alors que pour la partie enregistrer, on le voit qu'après enregistrement et il faut recharger la recette pour en voir la liste.

En partie change, je vois que si on change un ingrédient, les allergènes évoluent bien.

(by the way : vous parler d'annuler une référence, c'est vrai que je ne l'ai pas prévu. Dans le cas de ce formulaire, quel est le plus simple? Ajouter un commandbutton pour chaque ligne avec "delete", et dans le code mettre au clic sur le command button textbox_ingrédient.clear ? Mais cela implique la création d'un module de classe si je comprends bien)

Grand merci d'avance

Autre chose : je ne comprends pas la différence entre mettre ce code dans la partie sub enregistrer ou dans sub ingredient_change? Ca a l'air de fonctionner des deux côté. L'avantage de la partie change, c'est que l'on voit directement la liste d'allergènes, alors que pour la partie enregistrer, on le voit qu'après enregistrement et il faut recharger la recette pour en voir la liste.

En partie change, je vois que si on change un ingrédient, les allergènes évoluent bien.

Si vous modifiez un ingédient, ce qui est possible en double en cliquant une nouvelle fois sur ce dernier, votre liste d'allergènes ne sera plus à jour car elle comportera toujours celles de l'ingrédient précédent.

A la limite, vous pouvez mettre le code à la fois au niveau du "change" et du "enregistrer". Au niveau du "enregistrer", vous êtes certain d'avoir le bon résultat.

(by the way : vous parler d'annuler une référence, c'est vrai que je ne l'ai pas prévu. Dans le cas de ce formulaire, quel est le plus simple? Ajouter un commandbutton pour chaque ligne avec "delete", et dans le code mettre au clic sur le command button textbox_ingrédient.clear ? Mais cela implique la création d'un module de classe si je comprends bien)

Du tout. Car vous disposez de l'événement "KeyPress" : KeyAscii = 127 correspond à la touche Suppr. Il vous suffit donc de tester cette valeur pour savoir que l'on a appuyé sur la touche "Suppr"

Ok, merci

Je l'ai écrit comme ceci - mais je n'ai pas d'effet :

Private Sub Textbox_ingrédient_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

    If KeyAscii = 127 Then Textbox_ingrédient.Clear

End Sub

Vous l’écririez comment?

Merci d'avance

je l'ai écrit comme ceci - mais je n'ai pas d'effet :

Private Sub Textbox_ingrédient_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

    If KeyAscii = 127 Then Textbox_ingrédient.Clear

End Sub

La méthode "Clear" n'a pas été définie dans le module de classe. Mais vous pouvez utiliser :

Textbox_ingrédient.Value = Empty

Après vérification, la touche "Suppr" ne déclenche pas l'événement. Donc le mieux, est d'utiliser la barre "Espace", ce qui donne le code suivant :

Private Sub Textbox_ingrédient_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

    If KeyAscii = 32 Then Textbox_ingrédient.Value = Empty

End Sub

Génial, ça fonctionne, merci beaucoup Thev.

Question sur une problématique à résoudre

En bref, j'ai une autre personne qui va compléter les recettes dans le userform_recette, et c'est donc elle qui sélectionnera les ingrédients. Il peut arriver que cette personne ait besoin d'un ingrédient qui n'est pas sur la liste.

Pour ne pas qu'il soit bloqué dans la réalisation de sa recette, et qu'il n'oublie pas certains éléments (le temps de me dire de rajouter tel ou tel ingrédient), je pensais à différentes solutions ;

  • La moins pratique mais la plus simple : je met une textbox qui agira sous forme de notes. Elle y note l'ingrédient avec les quantités, et de temps à autre je regarde les textbox "à compléter" ayant des infos, je rajoute les ingrédients, et je fais les modifications dans les recettes
  • La solution la plus pratique mais la plus complexe : elle double clic dans la case ingrédient. Le userform recherche produit, elle ne trouve pas ce qu'il faut. On ajoute un bouton "ajouter un produit" dans cet userform qui ouvre le userform_produit. Elle n'a pas beaucoup d'infos, donc elle va juste se limiter à mettre un nom produit sans aucune info de plus (prix, quantité, perte, ...).
    Premier soucis qui se pose lors de l'insertion d'un produit qui a juste un nom dans la liste des ingrédients (j'ai tenté en supprimant toutes les infos sauf nom produit dans la BDD) : on a pas les infos du produit (poids, perte, cout, ...) donc ça va faire un bug dans le userform recette sur la ligne ingrédient==> pourrait être éventuellement résolu en proposant une case à cocher dans le userform produit qui se nomme "A finaliser" et qui mettrait tous les paramètres qui ne peuvent pas être à 0 à 1
  • Pour avoir testé, il y a également un soucis si on ajoute un bouton "ajout produit" dans le userforme_recherche_prod : au clic dessus, bug en relations avec les USF.

Qu'exploreriez vous comme solution dans ce cas ci?

Premier soucis qui se pose lors de l'insertion d'un produit qui a juste un nom dans la liste des ingrédients (j'ai tenté en supprimant toutes les infos sauf nom produit dans la BDD) : on a pas les infos du produit (poids, perte, cout, ...) donc ça va faire un bug dans le userform recette sur la ligne ingrédient==> pourrait être éventuellement résolu en proposant une case à cocher dans le userform produit qui se nomme "A finaliser" et qui mettrait tous les paramètres qui ne peuvent pas être à 0 à 1

Je pense qu'effectivement la bonne solution dans ce cas, c'est de récupérer dans la TextBox ingrédient un produit se nommant "A finaliser".

1- Cette valeur peut être ensuite testée pour ne pas dérouler la procédure Private Sub Textbox_ingrédient_Change et éventuellement d'autres si nécessaire.

2- Pour pouvoir amener cette valeur dans la TextBox ingrédient , le mieux est de l'ajouter systématiquement en dernière ligne dans la ListBox du UserForm Recherche_Prod

Ok, merci beaucoup Thev

Voici un nouvel update ci-joint

J'ai quelques questions concernant un userform que j'ai créé (userform_crea_menu).

Explications de l'userform:

  • Destiné à régler les recettes pour une semaine de menu. Ces recettes ont été créées dans le userform_recette
  • On choisit une recette au double clic dans la case = ça fonctionne
  • A côté de chaque recette, il y a une colonne bleue et une colonne jaune. Ces colonnes reprennent des paramètres réglés dans le userform_paramètre qui consite à régler ceci :
    [list]On a une quantité (jaune = quantité, bleu = répartition en %) qui est réglée dans le userform paramètre pour chacun des plats d'une section (plat : plat chaud, accompagnement, section = buffet chaud). En bref, la ligne reprend la réparation prévue dans les paramètre, et l'alloue sur chaque ligne en reprenant en référence la case rose qui elle donne le volume total de la section buffet chaud.
  • Pourcentage (bleu) : répartition de la quantité donnée (colonne jaune du haut) pour la catégorie donnée (ici, buffet chaud). Donc si j'ai 25% de plat chaud (bleu), et qu'il y a 20 kg en quantité de buffet chaud (rose), la section va prendre 25% de 20 kg pour mettre dans la case jaune. Ce pourcentage est réglé dans le userform paramètre, donc on va récupérer cette info dans BD_param/list]

J'ai commencé à travailler sur base de modules de classes. COncrètement, la section BUFFET CHAUD est représentée comme elle devrait être. Pensez-vous que c'est la bonne méthode? Car pour chaque ligne dans les sections différentes, je vais devoir créer un module de classe (ca va faire beaucoup, pas de manière plus intelligente?).

Autre chose que je ne comprends pas ;

Dans mon code, cette partie est destinée à calculer la case jaune pour le "plat chaud". quand je teste, il arrive aussi à calculer pour "accompagnement", mais je ne comprends pas comment il y arrive car dans la formule on ne cite que Txt_plat_chaud

    If TextBox_poids_total.Value <> 0 Then Txt_poids.Value = (CDbl(Txt_plat_chaud) / 100) * CDbl(TextBox_poids_total)

Merci d'avance

J'ai commencé à travailler sur base de modules de classes. COncrètement, la section BUFFET CHAUD est représentée comme elle devrait être. Pensez-vous que c'est la bonne méthode? Car pour chaque ligne dans les sections différentes, je vais devoir créer un module de classe (ca va faire beaucoup, pas de manière plus intelligente?).

Pas bien compris.

cela veut-il dire que vous allez modifier les lignes Buffet Froid, Soupe, Sandwich, Dessert pour y insérer une colonne bleue et jaune ?

Chaque ligne de section différente : de quels contrôles s'agit-il ?

Autre chose que je ne comprends pas ;

Dans mon code, cette partie est destinée à calculer la case jaune pour le "plat chaud". quand je teste, il arrive aussi à calculer pour "accompagnement", mais je ne comprends pas comment il y arrive car dans la formule on ne cite que Txt_plat_chaud

Avec cette instruction, Txt_plat_chaud devient un accompagnement :

If ctrl.ControlTipText = accompagnement Then Set Txt_plat_chaud = ctrl

Re Thev

Pour la présentation, il faut uniquement se référer à la partie buffet chaud. Je n'ai pas encore inséré le reste en attendant d'avoir votre avis.

Ces cases bleues, roses, jaune seront donc déjà présente dans le userform_crea__menu.

En bref, ce que j'ai contruit pour la partie "buffet chaud", je vais le répliquer pour la suite. Mais vu qu'il y a beaucoup de ligne, je veux être certain de la procédure.

Le but de remplir cette grille, est d'avoir à la fin un menu pour chaque semaine, avec une quantité en poids pour chaque recette pour chaque jour, et ensuite de générer une liste de courses triée par fournisser (vu qu'on connait les ingrédients pour 1kg de recette via les fiches recettes, que l'on connait le fournisseur des ingrédients de la recette, on doit pouvoir générer des bons de commande pour générer une liste de courses). Et par bon de commande, j'entend le même type de BC que pour la partie userform_bon_commande. D'ailleurs, ce point sera assez complexe à réaliser, si jamais vous avez des idées ...

Donc, si je prends plat chaud, que je règle un plat pour le lundi, il va m'indiquer dans le bleu le % qui vient de la BD_PARAM (alimentée par le userform paramètre). Ce % fixe la quantité de kg à prévoir pour cette recette (case jaune). Cette quantité (case jaune) est égale à % (case bleue) x qté totale buffet chaud (case rose - provenance bd_param).

Et idem pour la ligne accompagnement. A savoir que la case bleu accompagnement du lundi + case bleu plat chaud lundi doit être égal à 100 pour représenter 100% de la quantité prévue pour le buffet chaud.

Le mécanise sera le même pour mardi, mercredi, ...

Et le même pour buffet froid, soupe, ... que je n'ai pas encore commencé à éditer.

Est-ce plus clair?

Grand merci

Bonsoir,

Pour le moment, j'avoue ne pas bien voir à quoi vont vous servir les modules de classe que vous avez créés pour vos cases bleues, jaunes et roses.

Pour répondre à votre problématique, une solution est de créer un frame pour chaque ligne d'emploi de votre recette. Ce que j'ai fait pour votre buffet chaud.

J'ai ensuite ajouté la propriété Parent dans le module de classe Txt_recette_MENU afin de récupérer le Frame parent dans lequel est encapsulée la ligne.

Enfin, j'ai ajusté les propriétés du premier TextBox des lignes 1 et 2.

ci-jointe nouvelle version

Grand merci Thev

Je vous reviens sur ce point par la suite. On a pas mal testé aujourd'hui l'encodage du userform_recette, et j'ai une série de soucis / amélioration que je voudrais faire évoluer. Les questions suivantes concernant donc le userform_recette

  • Dans la partie ingrédients, dans les colonnes textbox quantité ou pourcent, si j'efface une quantité par delete ou return, ça fait un bug (qui renvoie vers des partie de code différentes selon la méthode % ou quantité)
  • Quand je clique sur quantité pourcent, je règle par exemple 70 %. Ensuite, si je veux modifier, si je sélectionne 70 ou 70 + espace + %, il n'y a pas de soucis. Par contre, si je sélectionne 70 + espace, il y a un bug faisant référence au code
    txt_euro.Value = Format(CDbl(prix_par_unite_poids) * Replace(txt_qté_pourcent.Value, " %", ""), "###0.00 €")
    Si je me souviens bien, on avait eu exactement le même soucis avec le % de la colonne perte.
  • Dans mon userform recette, j'avais réglé les checkbox pièce en demandant que ;
    Cette checkbox ne soit jamais présente en cas de méthode de calcul % pour tous les articles
    Cette checkbox disparaisse si un article possède une unité en "PC". Elle n'est la que pour les articles en "L" ou "KG"
    Si on charge un ingrédient pour la première fois, si l'unité est "PC", la checkbox n'est pas là = OK
    Par contre, si on change la méthode de calcul de quantité vers % en cliquant sur le Label_méthode_de_calcul pour switcher de méthode, je me rends compte que
    1 - Méthode quantité = injection ingrédient = checkbox pas là = ok
    2 - Méthode Pourcent = check box toujours pas là = ok
    3 - Retour à la méthode quantité = la checkbox réapparait = pas ok.
    D'après moi ça se passe dans le code Private Sub Label_méthode_de_calcul_Click().
    J'ai tenté de lui mettre ce code dans la deuxième partie pour vérifier la condition, mais j'ai un bug lié à ligne produit.
    En effet, s'il n'y a pas d'article dans les ingrédients (l'utilisateur pourrait cliquer sur un changement de méthode sans qu'il y ait d'ingrédient), il ne trouve pas de ligne, et bug.
    Comment faire pour corriger cela?
            If TypeName(ctrl) = "CheckBox" Then
                If ctrl.ControlTipText = pièce Then ctrl.Visible = True
                'If sh_prod.Cells(ligne_produit, 38) = "" Then ctrl.Visible = False
               'If sh_prod.Cells(ligne_produit, "I") = "PC" Then ctrl.Visible = False
            End If
  • Si on sauvegarde une recette avec la méthode %, toute s'enregistre bien. Par contre, si je recharge la recette, il va vers la méthode quantité, et on a donc des bugs, plus rien ne fonctionne.
    J'ai tenté de contourner le soucis en ajoutant une textbox TextBox_méthode.Value = Label_méthode_de_calcul.Caption dans l'enregistrement et l'inverse dans le afterupdate de la recette.
    La méthode s'affiche bien, mais les bon % ne se chargent pas , et il y a des erreurs.
    Comment faire pour bien réinitialiser le tout?
  • 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.
  • Possible de proposer dans la ComboBox_recette_base UNIQUEMENT les recettes qui ont la CheckBox_prepa_base qui est true? Cela concerne le code suivant de initialize
    'RECETTE BASE ++++++
    With sh_recette
        nb_lignes_recette = Application.CountA(.Columns("A")) 'compte le nombre de lignes non vides de la colonne A de la feuille
    End With
    recette = liste_triée_sans_doublons(sh_recette.Range("A2").Resize(nb_lignes_recette))
    ComboBox_recette_base.List() = 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 €?
  • 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?
Private Sub Textbox_ingrédient_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

    'ouverture de la recherche dans la liste d'ingrédients_txt disponibles
     With UserForm_recherche_prod
        .ComboChoixColFiltre = "Reference produit"
        .ComboTri = "prix unitaire"
        .Show
        With .ListBox_recherche_produit                      'prend en compte la ListBox_recherche_produit
            If .ListIndex > -1 Then Textbox_ingrédient.Value = .Column(5, .ListIndex)   'récupère le valeur de la colonne 0 de la ListBox_recherche_produit dans la Textbox "InstallationIDTextBox"
        End With
    End With
    Unload UserForm_recherche_prod

End Sub
  • J'ai rajouté des Textbox dans le userform_recette dans la page ingrédients sur la droite (colonne nomée comment). Dès qu'une textbox ingrédient est complétée, il y a 0,00 qui apparait dans le champ de la textbox comment.
    Est-ce normal / évitable?
  • 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?
  • Si j'ajoute un ingrédient dans ma recette, le commandbutton_ingrédient apparait (+). Si je clique dessus, ça ouvre le userform_produit.
    Si je modifie quelque chose dans cet userform (par exemple page poids type - info poids à l'unité ou % net après perte) et que je sauvegarde, l'info n'est pas rechargée dans ma page ingrédient.
    Exemple : si je mets des tomates, qu'elles n'ont d'info sur le poids unitaire et un pourcent de perte de 100% dans la page "poids type" du produit.
    Je modifie et j'indique 0.100 en poids et 90% de perte, je clique sur enregistrer, l'info est bien remontée dans la BDD produit, mais n'est pas mise à jour dans ma page ingrédient (une checkbox pce aurait dû apparaitre par exemple)
  • J'ai une textbox dans laquelle j'ai un texte par défaut. Si je clique dedans la case se vide pour laisser place au vrai texte. Le hic : si je complète cette case pour de vrai lors de ma création de recette, mais que j'y reviens plus tard pour y apporter une modification, cela s'efface à nouveau.
Private Sub TextBox_ingrédient_manquant_Enter()
    TextBox_ingrédient_manquant.Value = Empty
End Sub
  • 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,...)

Désolé, ça fait beaucoup de questions Et de petits détails.

Je remets la nouvelle version ci jointe.

Un granddd merci !!

Hello Thev

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

Petit bug qu'on vient encore de soulever. J'avais ajouter un commandButton_recherche à côté du nom de la recette. Au clic dessus, ça ouvre un userform_recherche_recette. Possibilité de sélectionner une recette au double clic, et tout se recharge dans le formule.

Tout ceci fonctionne bien sauf que si je charge une recette, puis que je change de recette, si la première recette chargée a par exemple 10 ingrédients, et que la deuxième n'en a que 5, il va bien me charger les 5 ingrédients, et laisser les 5 derniers vides. Le soucis c'est qu'il ne vide pas les autres champs (unité reste pareil, quantité vidée mais à zéro, idem en perte, et il conserve poids et euro, ...). Ca génère donc des erreur car il fait des division par zéro car même si les 5 derniers champs ingrédients sont vides il les considère comme existant.

Ce qu'il faudra, c'est une manière de conserver le choix du double clic dans la listbox, mais de réinitialiser le contenu du formulaire quand on change de recette.

Si vous voulez faire le test, il suffit de charger une recette avec plus d'ingrédient en lieu 1, puis une recette avec moins d'ingrédient pour la deuxième fois, vous verrez ce que je veux dire.

Voici le code initial :

Private Sub CommandButton_recherche_Click()
    'ouverture de la recherche dans la liste d'ingrédients_txt disponibles
     With UserForm_recherche_recette
        .ComboChoixColFiltre = "Recette"
        .Show
        With .ListBox_recherche_recette                     'prend en compte la ListBox_recherche_produit
            If .ListIndex > -1 Then TextBox_recette.Value = .Column(0, .ListIndex)   'récupère le valeur de la colonne 0 de la ListBox_recherche_produit dans la Textbox "InstallationIDTextBox"
        End With
    End With
    Unload UserForm_recherche_recette

    TextBox_recette_afterupdate

End Sub

Et ce que j'ai essayé pour palier à ce soucis. Mais le problème est que la il me remet un useform totalement vide, il ne conserve pas le nom de la recette, et donc l'action TextBox_recette_afterupdate n'agit pas.

Private Sub CommandButton_recherche_Click()
    'ouverture de la recherche dans la liste d'ingrédients_txt disponibles
     With UserForm_recherche_recette
        .ComboChoixColFiltre = "Recette"
        .Show
        With .ListBox_recherche_recette                     'prend en compte la ListBox_recherche_produit
            If .ListIndex > -1 Then TextBox_recette.Value = .Column(0, .ListIndex)   'récupère le valeur de la colonne 0 de la ListBox_recherche_produit dans la Textbox "InstallationIDTextBox"
        End With
    End With
    choix_recette = TextBox_recette.Value
    Unload Me
    Unload UserForm_recherche_recette
    UserForm_Recette.Show
    TextBox_recette = choix_recette
    TextBox_recette_afterupdate

End Sub

Merci d'avance

Rechercher des sujets similaires à "question code vba"