Modification d'un article : création d'une nouvelle ligne

Bonjour à toutes et à tous,

Feuille accueil : clic sur le bouton de commande crédits budgétaires

Le formulaire UF02 crédits budgétaires se charge : catégorie : dans la liste déroulante, clic sur Budget primitif dépenses alimentaires; Nature article : dans la liste déroulante, clic sur Dépenses alimentaires; Article : dans la liste déroulante, clic sur Vinaigre assaisonnement. Un message : cet article existe déjà, clic sur OK; Vider les tb Prix unitaire et Quantité et mettre Zéro dans les deux; Total BP : il devient zéro (parfait); Clic sur validation. Pour tester vous-même, vous pouvez changer Article.

Dans la feuille BD budgets primitifs, dans la premier tableau structuré (à l'extrême gauche), maintenant il y a deux lignes Vinaigre assaisonnement (j'ai dû rajouter une ligne tri et renuméroter dans récupérationinfos car la ligne ne prenait pas sa place normale). Je souhaiterais que la ligne initiale existante soit modifiée et non pas qu'une nouvelle ligne soit créée. D'avance merci à celle, à celui, à celles, à ceux qui m'aideront à régler ce problème.

Bonjour,

SI je comprends bien, si l'article est déjà existant alors, on ne change que la date de création sans ajouter une nouvelle ligne.

Cdlt

Bonjour Arturo83,

Merci. J'ai modifié l'article agneau en supprimant prix unitaire et quantité que j'ai mis à zéro. Feuille BD budgets primitifs : ligne agneau : seule la date de modification a été prise en compte. Prix unitaire, Quantités et Total BP sont restés avec les anciennes mentions.

Ok, alors ceci:

Private Sub cmdValidation_Click()
    Dim I As Long, J As Integer, Lig As Long

    If ArticleExistant = False Then 'Variable déclarée en haut du module
        'Nouveau crédit budgétaire : dans la feuille BDBudgetsPrimitifs, tableau structuré TabCréditsBudgétaires, ajouter une ligne vide en fin de tableau.
        With Range("TabBDCréditsBudgétaires").ListObject
            If .ListRows.Count = 0 Then
                .ListRows.Add: I = 1
            Else: .ListRows.Add: I = .ListRows.Count 'Dernière ligne du tableau.
            End If
        End With
        'Insérer les données dans la feuille BD budgets primitifs, tableau structuré TabBDCréditsBudgétaires, dans la dernière ligne nouvellement ajoutée. DataBodyRange : cet-
        'te propriété renvoie un objet Range qui représente la plage de valeurs, à l'exception de la ligne d'en-tête dans une table. Type de données en lecture seule. i,1: le 1 re-
        'présnte la première colonne du tableau, le 2 la deuxième colonne du tableau et ainsi de suite.
        With sh04.ListObjects("TabBDCréditsBudgétaires").DataBodyRange
            .Item(I, 1) = cbCatégorie.Value
            .Item(I, 2) = tbCodeCatégorie.Value
            .Item(I, 3) = cbNatureArticle.Value
            .Item(I, 4) = tbCodeNatureArticle.Value
            .Item(I, 5) = cbArticle.Value
            .Item(I, 6) = tbCodeArticle.Value
            .Item(I, 7) = cbPériode.Value
            .Item(I, 8) = tbCodePériode.Value
            .Item(I, 9) = cbConditionnement.Value
            .Item(I, 10) = tbCodeConditionnement.Value
            .Item(I, 11) = tbPrixUnitaire.Value
            .Item(I, 12) = tbQuantité.Value
            .Item(I, 13) = tbTotalBudgetPrimitif.Value
            .Item(I, 14) = tbDateCréation.Value
            .Item(I, 15) = tbNuméroCréation.Value
        End With
        If cbCatégorie = "Budget primitif dépenses alimentaires" Then
            Call GénérerBudgetPrimitifDépensesAlimentaires
        'ElseIf cbNomNatureCréationMenu = "Menu journalier" Then
        '    Call GénérerMenusJournaliers
        'ElseIf cbNomNatureCréationMenu = "Menu viande midi weekend" Then
            'Call GénérerMenusViandesMidiWeekend
        End If
    ElseIf ArticleExistant = True Then 'Variable déclarée en haut du module
        'on repère la ligne de l'article et on ne change que la date de création
        Lig = Application.Match(cbArticle.Value, sh04.ListObjects("TabBDCréditsBudgétaires").DataBodyRange.Columns(5), 0)

        'dans TabBDCréditsBudgétaires
        sh04.ListObjects("TabBDCréditsBudgétaires").DataBodyRange.Cells(Lig, 11) = tbDateCréation.Value 'Prix unitaire
        sh04.ListObjects("TabBDCréditsBudgétaires").DataBodyRange.Cells(Lig, 12) = tbDateCréation.Value 'Quantité
        sh04.ListObjects("TabBDCréditsBudgétaires").DataBodyRange.Cells(Lig, 13) = tbDateCréation.Value 'Total BP
        sh04.ListObjects("TabBDCréditsBudgétaires").DataBodyRange.Cells(Lig, 14) = tbDateCréation.Value 'Date création

        'dans TabBDBudgetPrimitifDépensesAlimentaires
        sh04.ListObjects("TabBDBudgetPrimitifDépensesAlimentaires").DataBodyRange.Cells(Lig, 4) = tbDateCréation.Value 'Total BP
        sh04.ListObjects("TabBDBudgetPrimitifDépensesAlimentaires").DataBodyRange.Cells(Lig, 5) = tbDateCréation.Value 'Date création
    End If
    Call TrierTabBDCréditsBudgétaires
    Call TrierTabBDBudgetPrimitifDépensesAlimentaires
    Call RenuméroterCréditsBudgétaires
    Call RenuméroterBudgetPrimitifDépensesAlimentaires
    ArticleExistant = False 'Variable déclarée en haut du module
End Sub

Merci. Je vais modifier et tester et vous donnerai mon avis vers 11 heures15, 11 heures 30. Qu'appelez-vous Variable déclarée en haut du module ?

Modification et tests effectués. résultat mauvais : Prix unitaire, Quantité, total BP : c'est la date qui s'inscrit.

'dans TabBDCréditsBudgétaires
sh04.ListObjects("TabBDCréditsBudgétaires").DataBodyRange.Cells(Lig, 11) = tbDateCréation.Value 'Prix unitaire
sh04.ListObjects("TabBDCréditsBudgétaires").DataBodyRange.Cells(Lig, 12) = tbDateCréation.Value 'Quantité
sh04.ListObjects("TabBDCréditsBudgétaires").DataBodyRange.Cells(Lig, 13) = tbDateCréation.Value 'Total BP
sh04.ListObjects("TabBDCréditsBudgétaires").DataBodyRange.Cells(Lig, 14) = tbDateCréation.Value 'Date création

'dans TabBDBudgetPrimitifDépensesAlimentaires
sh04.ListObjects("TabBDBudgetPrimitifDépensesAlimentaires").DataBodyRange.Cells(Lig, 4) = tbDateCréation.Value 'Total BP
sh04.ListObjects("TabBDBudgetPrimitifDépensesAlimentaires").DataBodyRange.Cells(Lig, 5) = tbDateCréation.Value 'Date création

Dans ces instructions, n'y aurait-il pas trop de date création ? Je vais tester. J'ai rectifié et cela donne le résultat attendu. Merci. Je clos ce fil. C'est certainement normal, dans la feuille BD budgets DM1, aucune modification n'est intervenue (il manque certainement des procédures).

Merci d'aller dans le fil

RécupérationCréditsBudgétaires, RécupérationInfosCréditsBudgétaires, Indice

et de me répondre à mon message du mercredi 14 février 2024 de 16 heures 50

Pour le problème soulevé dans Modification d'un article, je vous ai écrit ce que je pensais, ce que j'ai modifié et le résultat qui en a écoulé.

Si cela renvoi uniquement la date de création, vous vous doutez bien que cela est dû à un copié/collé et que j'ai oublié de changer les termes par la suite, mais ça vous auriez pu le faire aisément.

la variable déclaré en haut de module, je ne peux pas être plus clair, , remontez tout en haut du module, la variable est: Dim ArticleExistant As Boolean.

Etant donné qu'elle est placée avant toutes les sub de ce module, elle s'applique à l'ensemble des macros de ce module sans avoir besoin de la déclarer à chaque fois.

Le correctif:

Private Sub cmdValidation_Click()
    Dim I As Long, J As Integer, Lig As Long

    If ArticleExistant = False Then 'Variable déclarée en haut du module
        'Nouveau crédit budgétaire : dans la feuille BDBudgetsPrimitifs, tableau structuré TabCréditsBudgétaires, ajouter une ligne vide en fin de tableau.
        With Range("TabBDCréditsBudgétaires").ListObject
            If .ListRows.Count = 0 Then
                .ListRows.Add: I = 1
            Else: .ListRows.Add: I = .ListRows.Count 'Dernière ligne du tableau.
            End If
        End With
        'Insérer les données dans la feuille BD budgets primitifs, tableau structuré TabBDCréditsBudgétaires, dans la dernière ligne nouvellement ajoutée. DataBodyRange : cet-
        'te propriété renvoie un objet Range qui représente la plage de valeurs, à l'exception de la ligne d'en-tête dans une table. Type de données en lecture seule. i,1: le 1 re-
        'présnte la première colonne du tableau, le 2 la deuxième colonne du tableau et ainsi de suite.
        With sh04.ListObjects("TabBDCréditsBudgétaires").DataBodyRange
            .Item(I, 1) = cbCatégorie.Value
            .Item(I, 2) = tbCodeCatégorie.Value
            .Item(I, 3) = cbNatureArticle.Value
            .Item(I, 4) = tbCodeNatureArticle.Value
            .Item(I, 5) = cbArticle.Value
            .Item(I, 6) = tbCodeArticle.Value
            .Item(I, 7) = cbPériode.Value
            .Item(I, 8) = tbCodePériode.Value
            .Item(I, 9) = cbConditionnement.Value
            .Item(I, 10) = tbCodeConditionnement.Value
            .Item(I, 11) = tbPrixUnitaire.Value
            .Item(I, 12) = tbQuantité.Value
            .Item(I, 13) = tbTotalBudgetPrimitif.Value
            .Item(I, 14) = tbDateCréation.Value
            .Item(I, 15) = tbNuméroCréation.Value
        End With
        If cbCatégorie = "Budget primitif dépenses alimentaires" Then
            Call GénérerBudgetPrimitifDépensesAlimentaires
        'ElseIf cbNomNatureCréationMenu = "Menu journalier" Then
        '    Call GénérerMenusJournaliers
        'ElseIf cbNomNatureCréationMenu = "Menu viande midi weekend" Then
            'Call GénérerMenusViandesMidiWeekend
        End If
    ElseIf ArticleExistant = True Then 'Variable déclarée en haut du module
        'on repère la ligne de l'article et on ne change que la date de création
        Lig = Application.Match(cbArticle.Value, sh04.ListObjects("TabBDCréditsBudgétaires").DataBodyRange.Columns(5), 0)

        'dans TabBDCréditsBudgétaires
        sh04.ListObjects("TabBDCréditsBudgétaires").DataBodyRange.Cells(Lig, 11) = tbPrixUnitaire.Value 'Prix unitaire
        sh04.ListObjects("TabBDCréditsBudgétaires").DataBodyRange.Cells(Lig, 12) = tbQuantité.Value 'Quantité
        sh04.ListObjects("TabBDCréditsBudgétaires").DataBodyRange.Cells(Lig, 13) = tbPrixUnitaire.Value * tbQuantité.Value 'Total BP
        sh04.ListObjects("TabBDCréditsBudgétaires").DataBodyRange.Cells(Lig, 14) = tbDateCréation.Value 'Date création

        'dans TabBDBudgetPrimitifDépensesAlimentaires
        sh04.ListObjects("TabBDBudgetPrimitifDépensesAlimentaires").DataBodyRange.Cells(Lig, 4) = tbPrixUnitaire.Value * tbQuantité.Value  'Total BP
        sh04.ListObjects("TabBDBudgetPrimitifDépensesAlimentaires").DataBodyRange.Cells(Lig, 5) = tbDateCréation.Value 'Date création
    End If
    Call TrierTabBDCréditsBudgétaires
    Call TrierTabBDBudgetPrimitifDépensesAlimentaires
    Call RenuméroterCréditsBudgétaires
    Call RenuméroterBudgetPrimitifDépensesAlimentaires
    ArticleExistant = False 'Variable déclarée en haut du module
End Sub

re,

Oui, j'ai bien pensé que cela était dû à des copier coller avec l'oubli de modifier; Quant à la variable déclarée en haut du module, c'est que je ne vois rien la concernant.

Elle est utilisée dans:

-RenuméroterCréditsBudgétaires

-cmdValidation_Click (si l'article est déjà existant, on recherche la ligne sur laquelle il se trouve et on remplace les valeurs, s'il n'existe pas on l'ajoute à la suite)

Private Sub RenuméroterCréditsBudgétaires()

Dim NbLignes As Long, K As Long, N As Long

'Va refaire la numérotation validation par le code catégorie.

NbLignes = Range("TabBDCréditsBudgétaires").ListObject.ListRows.Count

'K = 1

For N = 1 To NbLignes

'Si la valeur code catégorie de l'élément N du tableau est identique au tbCodecatégorie, alors on renumérote l'élément.

If Range("TabBDCréditsBudgétaires[Code catégorie]").Item(N) = tbCodeCatégorie.Value Then

Range("TabBDCréditsBudgétaires[Numéro création]").Item(N) = tbCodeCatégorie.Value & "-" & Format(N + 1, "00")

Range("TabBDBudgetPrimitifDépensesAlimentaires[Numéro création]").Item(N) = tbCodeCatégorie.Value & "-" & Format(N + 1, "00")

'K = K + 1

ArticleExistant = True 'Variable déclarée en haut du module

End If

Next N

End Sub

Je ne la vois pas. Dans un précédent message, vous m'avez indiqué dim ArticleExistant as bollean, c'est cela que je cherche en vain. Malgré cela, il n'y a aucun message d'erreur ni à l'exécution ni à la compilation.

budgets

Merci. Il y a des procédures qui sembleraient pouvoir être annulées : les boutons de commande Effacer des feuilles BD budgets primitifs, bd budgets DM1 et BD budgets DM2 semblent inutiles puisque un clic sur générer vide le contenu automatiquement. Dans ce cas que deviendront les procédures Purger ? Pour la validation , pour la génération , éventuellement pour renuméroter, un select case pourrait-il être utile ? Mon idée : une partie sans select case qui serait commune quelle que soit la catégorie, une partie avec select case pour ce qui serait différent (je pense notamment aux plus dm1, moins dm1, plus dm2, moins dm2, entre autres).

Une nouvelle idée vient de germer, à vous de me dire ce que vous en pensez et si cela est faisable : créer huit tables mensuelles budgets primitifs dans une même feuille (TabBudgetsPrimitifDA1, TabBudgetsPrimitifsDB2, et ainsi de suite jusqu'à huit). Puis huit tables DM1, puis huit tables DM2. À moins que 1, 2 soient pris pour des mois, alors cela risquerait d'être impossible. Si besoin mensuelle pourrait être remplacée par catégorie. Pour budgets mensuels, ce la ne posera aucun problème puisque là il s'agira bien de mois.

Si vous pensez qu'elles sont inutiles, vous avez 2 solutions, soit vous les supprimez, soit vous les mettez en remarque avec un commentaire spécifiant qu'elles sont momentanément inutilisées. ainsi elles seront toujours récupérables si dans les évolutions futures, elles s'avéraient utiles, de plus ça ne gêne pas au bon fonctionnement. c'est à vous de voir.

Suite à votre dernière modif, vous avez trop d'idées, c'est bien, mais vous remettez tout en question à chaque fois, à la longue ce n'est plus gérable.

Restez sur une formule qui marche bien et, peut-être que bien plus tard, quand vous serez plus à l'aise avec le VBA, vous pourrez envisager d'y apporter des modifications. Perso, je ne me sens pas le courage de tout chambouler pour un résultat aussi maigre.

ok . Je suis toujours en train de travailler sur les feuilles DM1 et DM2 puis sur BM pour répondre à la sollicitation de BeGood. Je pense terminer ce soir.

Bonjour Arturo83, Bonjour BeGood,

J'ai fait ce qu'Arturo83 et BeGood m'ont conseillé de faire.

1) Pour Arturo83, sauf erreur ou omission de ma part, la modification d'un article entraîne la création d'une nouvelle ligne. Dans votre fichier du samedi 17 février 2024, 6 heures 19, la modification d'un article n'est pas prise en compte, rien ne se produit dans la feuille BD budgets primitifs

2) Pour BeGood, j'ai créé et rempli manuellement ou par un copier-coller les tableaux structurés des feuilles BD budgets BM1 et BD budgets DM2.

Merci de m'aider à résoudre ce problème et me dire si les tableaux structurés sont corrects.

Bonjour,

macro incomplète:

Private Sub RenuméroterCréditsBudgétaires()
Dim NbLignes As Long, K As Long, N As Long
    'Va refaire la numérotation validation par le code catégorie.
    NbLignes = Range("TabBDCréditsBudgétaires").ListObject.ListRows.Count
    K = 1
    For N = 1 To NbLignes
        'Si la valeur code catégorie de l'élément N du tableau est identique au tbCodecatégorie, alors on renumérote l'élément.
        If Range("TabBDCréditsBudgétaires[Code catégorie]").Item(N) = tbCodeCatégorie.Value Then
            Range("TabBDCréditsBudgétaires[Numéro création]").Item(N) = tbCodeCatégorie.Value & "-" & Format(K, "00")
            K = K + 1
        End If
    Next N
End Sub

j'avais mis ça:

Private Sub RenuméroterCréditsBudgétaires()
Dim NbLignes As Long, K As Long, N As Long
    'Va refaire la numérotation validation par le code catégorie.
    NbLignes = Range("TabBDCréditsBudgétaires").ListObject.ListRows.Count
    'K = 1
    For N = 1 To NbLignes
        'Si la valeur code catégorie de l'élément N du tableau est identique au tbCodecatégorie, alors on renumérote l'élément.
        If Range("TabBDCréditsBudgétaires[Code catégorie]").Item(N) = tbCodeCatégorie.Value Then
            Range("TabBDCréditsBudgétaires[Numéro création]").Item(N) = tbCodeCatégorie.Value & "-" & Format(N + 1, "00")
            Range("TabBDBudgetPrimitifDépensesAlimentaires[Numéro création]").Item(N) = tbCodeCatégorie.Value & "-" & Format(N + 1, "00")
            'K = K + 1
            ArticleExistant = True 'Variable déclarée en haut du module
        End If
    Next N
End Sub

le fichier correspondant (attention, il n'intègre pas les dernières modifications que vous auriez pu faire entre temps)

Merci, cela fonctionne maintenant. J'ai fait un copier-coller de votre procédure Renuméroter

Bonjour,

Votre fichier a des avancées mais ne répond pas entièrement aux questions que je vous avais posées.

Merci de me dire si les tableaux structurés sont corrects. Comment voulez-vous qu'on le sache ?

Pour les BP, DM1 et DM2 votre fichier ne montre que les dépenses alimentaires. Pour le BM il ne montre que le mois de janvier. Il n'y a pas d'explications sur la manière dont vont se remplir les différentes tables.

Toutes vos tables ont exactement le même nombre de lignes et d'article : est-ce vraiment normal ? Y-aura-t-il un BP pour chacun des articles de la table Article Budgétaires ? Y-aura-t-il un BDM1 pour chacun des articles de la table BP ?

Il y a encore plein d’interrogations auxquelles vous n'avez pas clairement répondu. On va les prendre une par une :

À la question 3) (sur l'autre fil ) : Peut-il y avoir un budget DM1 pour un article n'ayant pas de budget primitif (BP). Vous aviez répondu Oui et pourtant vous avez dit également : dm1 : crédits budget primitif pour lequel soit on l'augmente (plus dm1) soit on le réduit (moins dm1)
C'est une contradiction : expliquez

Bonsoir BeGood,

Pour l'instant, la feuille BD Budgets primitifs se remplit avec la procédure cmdValidation_Click; par la suite, les feuilles bd Budgets DM1, BD budgets DM2 et BD budgets BM se rempliront également par cette même procédure avec, si cela est possible, en ayant recours à un ou deux Select Case.

Il y aura une bd budgets DM1, une BD budgets DM2, une BD budgets mensuels pour chacun des articles de la BD budgets primitifs laquelle aura tous les articles prévus dans la liste de choix de chaque tableau structuré (d'où le nombre de lignes sera différent).

Peut-il y avoir un budget DM1 pour un article n'ayant pas de budget primitif (BP). Vous aviez répondu Oui et pourtant vous avez dit également : dm1 : crédits budget primitif pour lequel soit on l'augmente (plus dm1) soit on le réduit

n'ayant pas de budget primitif : par là, j'entends que total BP sera égal à zéro : donc en DM1 ou en DM2, cet article aura un plus DM1 ou un plus DM2; même chose pour un DM2 dans le cas où l'article concerné serait à Zéro en Total DM1.

Je reste à votre entière disposition pour répondre, du mieux que je pourrais, à vos interrogations.

BP : agneau : total bP =0. DM1 : plus DM1 : 20.00

DM1 : cassoulet : total DM1 : 0 DM2 : Plus DM2 : 50.00

Je vous donne des chiffres au hasard pour expliquer au mieux mes principes. Dépenses alimentaires : 119 articles : bp, dm1, dm2, bm : chacun 119 articles; mêmes principes pour les autres items de nature articles.

Bonjour,

Vous avez 437 articles dans votre BD articles budgétaires. Faut-il comprendre d'après vos explications que vous aurez également 437 lignes dans chacune de vos BD globales Primitif DM1, DM2 et BM ?

(je parle bien de TabBDCréditsBudgétaires, TabBDBudgetsDécisionModificativeNuméroUne, TabBDBudgetsDécisionModificativeNuméroDeux, TabBDBudgetsMensuels)

(pas trop pratique vos noms à rallonge !)

Et pour la BD mensuel (TabBDBudgetsMensuels) comment prendrez-vous en compte le mois ?

Bonjour BeGood,

Oui, j'aurai bien 437 lignes dans chacune de mes bd globales.

Budget mensuel : je prendrai modèle sur MENUS 2024, feuilles BD menus midi retraite, BD menus journaliers et BD menus viande midi weekend avec table mensuelle.

Rechercher des sujets similaires à "modification article creation nouvelle ligne"