Budgets.xlsm : procédure private sub cbNomArticlesBudgets

Bonjour à toutes et à tous,

J'espère que quelqu'un va pouvoir résoudre mon nouveau problème.

Feuille Accueil : clic sur création articles budgets

UserForm UF01_CréationArticlesBudgets : dans la zone de liste modifiable cbNomCréationBudgets : clic sur Articles budgets, dans la zone de liste modifiable cbNomCatégorie, clic sur Dépenses alimentaires : selon le contenu du cbNomCatégorie, je souhaiterais que la Zone de liste modifiable cbNomArticlesBudgets se remplisse du contenu correspondant (et uniquement ce contenu) soit à partir du tableau structuré TabNomProduitsBudgets, soit à partir de listes individuelles TabNomArticlesDépensesAlimentaires, TabNomArticlesDépensesBancaires et ainsi de suite (qui n'existent pas pour l'instant).

Le second Budgets.xlsm comporte un TabNomArticlesDépensesAlimentairesdans la feuille Liste, et diverses modifications dans le code de l'uSerForm UF01_CréationArticlesBudgets mais qui n'aboutissent pas au résultat escompté.

D'avance merci pour votre aide.

9budgets.xlsm (82.96 Ko)
12budgets.xlsm (87.55 Ko)

Bonjour,

Si j'ai bien compris, à chaque changement de "cbNomCatégorie", "cbNomArticlesBudgets" doit proposer la liste liée au choix de "cbNomCatégorie"

Si c'est bien ça alors, essayez ceci:

Cdlt

Bonjour Arturo83,

Merci de m'avoir proposé ta solution qui donne exactement ce que je souhaitais. Je garde Module1 où puisse-je transférer son code dans l'UserForm UF01_CréationArticlesBudgets et, dans l'affirmative, dans quelle procédure ? D'avance merci pour ta réponse.

Je garde Module1 où puisse-je transférer son code dans l'UserFormUF01_CréationArticlesBudgets et, dans l'affirmative, dans quelle procédure ?
Laissez-le dans le module 1.
Cdlt

Merci. J'ai vu dans le code de l'UserForm UF01_CréationArticles budgets qu'il est fait mention du module1, je n'avais pas regardé. Donc ma question était inutile. Comme je ne sais pas si en mettant ce fil comme étant résolu, et que j'envoie un message : sera-t-il possible que vous puissiez le lire quand même ? Dès que j'ai votre réponse, je clôturerai ce fil.

Oui j'ai tout lu, vous pouvez le passer en résolu.

Bonjour Arturo83,

Je reviens vers vous pour vous demander si cela ne vous ennuierait pas de commenter le code du module1 car je n'ai pas tout compris, notamment le "M" et le "L" ? D'avance merci. Une première approche : "L" représente la colonne L du tableau structuré TabNomProduitsBudgets et, dans le même tableau "M" correspond à la colonne M. Que fait vient faire le nombre de caractères (NbCar) ?

Plutôt que de longs discours, 2 exemples seront plus faciles pour comprendre.

1er exemple: Dans le formulaire le code de la catégorie est "DA", il faut chercher dans la colonne "M" tous les articles commençant par "DA" et ignorer tous les caractères qui suivent "DA" dans le code trouvé, donc Len(DA)= 2 caractères, et donc dans la colonne M, tous les codes dont les 2 premiers caractères de gauche commencent par "DA" seront retenus pour constituer la liste.

2ème exemple: Dans le formulaire le code de la catégorie est "DNA", il faut chercher dans la colonne "M" tous les articles commençant par "DNA" et ignorer tous les caractères qui suivent "DNA" dans le code trouvé, donc Len(DNA)= 3 caractères, et donc dans la colonne M, tous les codes dont les 3 premiers caractères de gauche commencent par "DNA" seront retenus pour constituer la liste.

Est-ce plus parlant pour vous?

Oui, c'est plus clair. Merci.

I représente donc le tableau structuré. i=3 : on se place sur la troisième ligne du tableau structuré. for i = 4 to dernlig_f2 : De la quatrième ligne du tableau structuré jusqu'à sa dernière ligne.

Est-il normal que le mot clé Until n'apparaisse pas ?

With UF01_CréationArticlesBudgets.cbNomArticlesBudgets 'Dans le formulaire CréationArticlesBudgets, Zone de liste modifiable cbNomArticlesBudgets
For I = 4 To DerLigne_F2 Pour i qui part de la quatrième ligne jusqu'à la dernière ligne de F2 (F2 = taleau structuré concerné)
If Left(F2.Cells(I + 1, "M"), NbCar) = CodeProduits Then si à gauche de la cellule ou de la colonne "M" du tableau structuré, quatrième ligne + 1 (soit cinquième ligne) le nombre de caractères (NbCar), je ne trouve pas l'expression qui convient
Do While Left(F2.Cells(I + 1, "M"), NbCar) = CodeProduits si à gauche de la cellule ou de la colonne "M" du tableau structuré, quatrième ligne + 1 (soit cinquième ligne) le nombre de caractères (NbCar), je ne trouve pas l'expression qui convient, alors on prend, affiche la valeur, le contenu de la colonne L dudit tableau dont le nom, dans la ligne ci-après, est remplacé par un point
.Value = F2.Cells(I + 1, "L")
If .ListIndex = -1 Then .AddItem .Value Pourquoi -1 ? On ajoute, affiche la valeur, le contenu de la colonne L dudit tableau dont le nom, dans la ligne ci-après, est remplacé par un point.
I = I + 1
Loop
.ListIndex = -1 Pourquoi -1 ?
End If
Next I
End With

En bleu, mes explications, mes commentaires, qui ne sont pas forcément exacts. J'essaie de comprendre ce qui se passe, ce que chaque ligne de code est sensée faire.

'Les instructions Do...Loop permettent d'exécuter un bloc d'instructions un nombre de fois indéfini, tant qu'une condition a la valeur True ou jusqu'à ce qu'elle prenne la valeur
'True.

'Répétition d 'instructions tant qu'une condition a la valeur True
'Vous pouvez utiliser le mot clé While de deux manières pour vérifier une condition dans une instruction Do...Loop. Vous pouvez contrôler la condition avant d'entrer dans la boucle, ou le faire après au moins une exécution de la boucle. Dans la procédure , vous vérifiez la condition avant d'entrer dans la boucle. Si colonne M, contient la valeur DNA, les instructions à l'intérieur de la boucle ne sont jamais exécutées. (à rectifier si pas correct).

Bonjour,

Est-il normal que le mot clé Until n'apparaisse pas ?

OUI, la boucle utilisée est Do While.... Loop signifie: Faire tant que la condition est vraie on boucle et on recommence.

tandis que Do.... Loop Until signifie: on boucle tant que la condition n'est pas vrai, ce qui n'est pas le but recherché?

********************************************************************************************************

Pour le Index -1, j'ai oublié de l'enlever, car lors des essais, je forçais cette valeur à chaque passage dans la boucle pour être sûr d'avoir un fonctionnement correct, n'étant pas nécessaire on peut le supprimer.

Voici le code légèrement modifié et argumenté:

Sub Liste_Noms_Produits()
    Dim f2 As Worksheet
    Dim i As Long
    Set f2 = Sheets("Liste de choix")

    DerLig_f2 = f2.ListObjects("TabNomProduitsBudgets").DataBodyRange.Rows.Count
    Preparation_Liste = True
    With UF01_CréationArticlesBudgets.cbNomArticlesBudgets ''Dans le formulaire CréationArticlesBudgets, Zone de liste modifiable cbNomArticlesBudgets
        For i = 4 To DerLig_f2 'Pour i qui part de la 4ème ligne jusqu'à la dernière ligne de F2 (F2 = taleau structuré concerné)
            If Left(f2.Cells(i + 1, "M"), NbCar) = CodeProduits Then 'si le nombre de caractères (en partant de la gauche) de la cellule de la ligne "i" , colonne "M" du tableau structuré est égal au "code produits", alors:
                Do While Left(f2.Cells(i + 1, "M"), NbCar) = CodeProduits ' faire ce qui suit tant que la condition ci-dessus est vraie
                    .AddItem f2.Cells(i + 1, "L") 'on ajoute le contenu de cette cellule dans la combobox
                    i = i + 1 'on incrémente i pour lire la cellule suivante
                Loop 'on passe à la ligne suivante
            End If
        Next i 'on continue jusqu'à la dernière ligne, pour la cas où les valeurs ne seraient pas triées
    End With
    Preparation_Liste = False 'pour éviter de repasser par le code de "cbNomArticlesBudgets_Change" lors de l'ajout d'une valeur dans "cbNomArticlesBudgets"
End Sub

Cdlt

BonjourArturo83,

Merci pour votre nouvelle réponse argumentée.

Bonnes journée et continuation. Prenez bien soin de vous.

À plus.

Bonjour Arturo83,

UserForm UF01_CréationArticlesBudgets : cbNomConditionnementArticlesBudgets : À l'exécution, la liste n'est pas visible, je n'arrive pas à voir pourquoi. Merci de m'apporter ton aide.

11budgets.xlsm (90.25 Ko)

Bonjour,

UserForm UF01_CréationArticlesBudgets : cbNomConditionnementArticlesBudgets : À l'exécution, la liste n'est pas visible, je n'arrive pas à voir pourquoi.

Mais cette liste, ne devrait-t-elle pas être établie après avoir sélectionner une valeur dans "cbNomPériodeArticlesBudgets", car actuellement le code est inexistant pour cette dernière.

Pas compris. Toutefois, ces deux cb sont indépendantes de l'une de l'autre. Et pour la cbNomPériodeArticlesBudgets, la liste apparaît bien même si les cb précédentes sont vides. Ces deux cb sont initialisés dans l'uSerForm_Activate

votre problème se situe dans les propriétés de la cb, il faut mettre ColumnCount =1

budgets


Merci. J'ai dû faire une fausse manœuvre pour qu'il soit à zéro. Cela fonctionne maintenant. Prochaine étape : la prédéfinition des cbpériode et conditionnement.

Une question : pour dépenses alimentaires et dépenses non alimentaires, je ne me souviens pas pour quelle raison, mais le numéro article est obligatoirement composé d'un nombre à trois chiffres. Pensez-vous qu'il soit possible de contourner ce problème ?

Bonjour,

Je ne comprends pas où est le problème, s'il faut mettre 3 chiffres dans la liste des données alimentaires, eh bien, mettez 3 chiffres (en mettant un 0 devant les 2 autres)

Sinon, si vous ne pouvez pas toucher à la liste et que vous souhaitiez que le 0 non significatif soit ajouter par le code (VBA), voici la macro correspondante modifiée:

Private Sub cbNomArticlesBudgets_Change()
    If Preparation_Liste = True Then Exit Sub
    'Effacer le contenu des Zones de liste modifiable (cb) et des Zones de tetxe (tb) si la zone de liste modifiable cbNomCréationBudgets est vide.
    On Error GoTo Sortie
    If cbNomCréationBudgets.Value = "" Then
        For Each Ctrl In Me.Controls
            If TypeOf Ctrl Is MSForms.ComboBox Or TypeOf Ctrl Is MSForms.TextBox Then Ctrl = Empty
        Next Ctrl
    End If
    With [TabNomProduitsBudgets].ListObject
        i = 0
        tbCodeNomArticlesBudgets = WorksheetFunction.VLookup(cbNomArticlesBudgets.Value, Range("TabNomProduitsBudgets"), 2, False)
        If Len(tbCodeNomArticlesBudgets) = 4 Then tbCodeNomArticlesBudgets = cbNomArticlesBudgets & "0" & Right(tbCodeNomArticlesBudgets, 2)

        'I = Application.Match(cbNomArticlesBudgets & cbNomCatégorie, .ListColumns("Clé produits budgets").DataBodyRange.Value, 0)
        'If I > 0 Then tbCodeNomArticlesBudgets = .ListColumns("Code nom produits budgets").DataBodyRange(I)
    End With
Sortie:
End Sub

Cdlt

Bonjour Arturo83,

Le fichier dans lequel le code articles des dépenses alimentaires et des dépenses non alimentaires (ils dépassaient le chiffre 100) avaient un nombre à trois chiffres.

15modeleliege.xlsm (222.32 Ko)

Il faudrait m'en dire un peu plus, on ouvre le formulaire et à partir de là, que fait-on? que doit-on trouver ? A quel endroit?

Bref, j'ai besoin que vous me détailliez le processus.

Rechercher des sujets similaires à "budgets xlsm procedure private sub cbnomarticlesbudgets"