Numéro article : prévoir un code à trois chiffres maximum pour le tri

Bonjour à tous et à toutes,

Quelqu'un m'a donné la solution mais je ne me souviens pas qui ni quand. Certains codes articles se présentent ainsi DA001, DA002, etc.; si on met DA01, DA002, etc. le tri ne se fait pas correctement. Merci de m'aider à modifier le code afin de résoudre ce problème.

33budgets-smp.xlsm (247.34 Ko)

Salut Christian,

Comment ou à quel moment ces codes sont-ils générés ? Et où sont-ils placés ?

Comment ou à quel moment effectues-tu le tri ?

Cordialement.

Salut,

Dans un premier temps tu colle cette fonction dans un module et tu l'exécute. Elle va formater tous les éléments de la colonne sur quatre chiffres.

Sub FormatColumn()
    Dim TempValue As String
    Dim Item As Excel.Range
        For Each Item In Range("MonTableau[MaColonne]")
            TempValue = "DA" & Format(Val(Mid$(Item.Value, 3)), "0000")
            Item.Value = TempValue
        Next Item
End Sub

Ensuite quand tu ajoute une ligne tu dois la formater exemple :

        Dim lstRow As Excel.ListRow
        Set lstRow = Range("MonTableau").ListObject.ListRows.Add
            With lstRow
                .Range(.Parent.ListColumns("ID").Index).Value = "DA" & Format(TextBox1.Value, "0000")
                .Range(.Parent.ListColumns("Nom").Index).Value = TextBox2.Value
                '...
                '...
            End With
        If Not lstRow Is Nothing Then Set lstRow = Nothing

Mais comme déjà dit je conseille de ne pas mettre de lettre dans les identifiants lignes d'un tableau, le code en est grandement assoupli quand tu veux ajouter une nouvelle ligne donc connaître le dernier index.

Sub FormatColumn()
        Dim lstRow As Excel.ListRow
        Set lstRow = Range("MonTableau").ListObject.ListRows.Add
            With lstRow
                .Range(.Parent.ListColumns("MaColonne").Index).Value = _
                        Application.WorksheetFunction.Max(.Parent.ListColumns("MaColonne").DataBodyRange) + 1
                .Range(.Parent.ListColumns("Nom").Index).Value = TextBox2.Value
                '...
                '...
            End With
        If Not lstRow Is Nothing Then Set lstRow = Nothing
End Sub

Bonjour Yvouille,

Feuille Liste de choix, tableaux structurés TabDA et TabDNA : colonnes Code article : il comprend trois chiffres. Le tri (dans la procédure Private Sub cmdValidation_Click()), se fait bien, aucun problème. TabDA, au lieu de mettre DA001 à DA099, on met DA01, DA02, DA03 ainsi de suite jusqu'à DA99; le tri ne se fait plus correctement.

Feuille accueil, clic sur le bouton de commande Articles budgétaires

Formulaire UF01ArticlesBudgétaires : Type article :Article dépense alimentaire

Catégorie article : Dépenses alimentaires

Article : Yaourts matin (c'est le dernier de la liste déroulante

Clic sur Validation Aller dans la feuille BD articles budgétaires pour voir le résultat.

Type article et catégorie articles : sans changement

Article : Thon

Clic sur validation. Aller dans la feuille BD articles budgétaires pour voir le résultat (le thon est en premier, Yaourts matin est en second, c'est parfait; La colonne numéro création a bien réagi aux instructions prévues).

Maintenant, dans la feuille liste de choix, tableau structuré TabDA, modifier DA001 à DA099 en DA01 à DA99.

Type article et Catégorie article : sans changement

Article : merci de saisir dans le même ordre pour que vous puissiez voir le problème :

Yaourts matin clic sur validation. Voir BDArticlesBudgétaires

Thon clic sur validation. Voir BDArticlesBudgétaires

Avocats desserts clic sur validation. Voir BDArticlesBudgétaires

Rôti de cheval clic sur validation. Voir BDArticlesBudgétaires

Bonjour Jean-Paul,

Qu'appelles-tu identifiant ligne ? ce sont les DA001,DB45, etc. ?

Autre chose, je remplace TabDA, TabDB, TabDH, etc. par Mon tableau, ce qui donnera huit tableaux structurés avec le même nom ? Essai, mais c'est refusé pour le deuxième tableau (entrez un nom unique). Une idée : Mon tableau nom du tableau structuré de la feuille BDArticlesBudgétaires ?

À quoi correspond textbox2 ?

Nous sommes d'accord : ta réponse concerne bien le numéro article : prévoir un code à 3 chiffres maximum pour le tri ?

Re,

Qu'appelles-tu identifiant ligne ? ce sont les DA001,DB45, etc. ?

Oui, il est plus facile de récupèrer une ligne si son identifiant est un chiffre unique comme dans Access.

Un peu de logique s'il te plait. C'est le contraire que tu dois faire : remplacer "MonTableau" par le nom du tableau où tu dois formater la colonne où se trouvent les mauvaises données. D'ailleurs tu doit aussi remplacer MaColonne par le nom de la colonne que tu veux traiter.

À quoi correspond textbox2 ?

Ce n'est juste qu'un exemple...

Nous sommes d'accord : ta réponse concerne bien le numéro article : prévoir un code à 3 chiffres maximum pour le tri ?

J'ai mis un format sur quatre chiffres comme cela tu est tranquille. Si tu veux un format sur trois chiffres change cette ligne :

TempValue = "DA" & Format(Val(Mid$(Item.Value, 3)), "0000")

Par celle-là

TempValue = "DA" & Format(Val(Mid$(Item.Value, 3)), "000")

Il te manque vraiment les bases faut y travailler.

Donc, pour ce qui est de mon programme, voilà ce que cela donnerait comme instructions à y ajouter :

Sub FormatColumn()

Dim TempValue As String

Dim Item As Excel.Range

For Each Item In Range("TabDA[Nom article]")

TempValue = "DA" & Format(Val(Mid$(Item.Value, 2)), "000")

Item.Value = TempValue

Next Item

Dim lstRow As Excel.ListRow
Set lstRow = Range("TabDA").ListObject.ListRows.Add
With lstRow
.Range(.Parent.ListColumns("Nom article").Index).Value = _
Application.WorksheetFunction.Max(.Parent.ListColumns("Nom article").DataBodyRange) + 1
.Range(.Parent.ListColumns("Nom").Index).Value = tbCodeArticle.Value
'...
'...
End With
If Not lstRow Is Nothing Then Set lstRow = Nothing

End Sub

Quelles sont les lignes à répéter pour les autres tableaux structurés ?

Je viens de faire des tests. En premier lieu, dans le tableau structuré TabDA, j'ai modifié le code article partout. Puis j'ai créé plusieurs articles dans n'importe quel ordre : résultat positif, c'est bien ce que je souhaitais. Reste les instructions pour les autres tableaux structurés.

Je pense que tu ne lis pas tout les messages.

La procédure FormatColumn ne doit-être exécutée que pour remettre les tableaux au bon format, Tu ne doit pas l'intégrer dans tes formulaires.

Relis bien le post : https://forum.excel-pratique.com/s/goto/1181788

C'est quand tu ajoutes des lignes aux tableaux que tu dois les formater correctement.

Reste les instructions pour les autres tableaux structurés.

Encore une fois de façon exceptionnelle tu n'a qu'a changer le nom du tableau, et de la colonne dans la procédure FormatColumn.

Dernière réflexion ce bout de code :

        Dim lstRow As Excel.ListRow
        Set lstRow = Range("MonTableau").ListObject.ListRows.Add
            With lstRow
                .Range(.Parent.ListColumns("ID").Index).Value = "DA" & Format(TextBox1.Value, "0000")
                .Range(.Parent.ListColumns("Nom").Index).Value = TextBox2.Value
                '...
                '...
            End With
        If Not lstRow Is Nothing Then Set lstRow = Nothing

C'est juste un exemple, il n'a rien à faire dans la procédure FormatColumn

Bonjour Jean-Paul,

Mille excuses, je n'avais pas fait attention au mot module. Je vais faire ceci en fin de matinée ou cette après-midi.

Dernière réflexion ce bout de code :

Dim lstRow As Excel.ListRow

Set lstRow = Range("MonTableau").ListObject.ListRows.Add

With lstRow

.Range(.Parent.ListColumns("ID").Index).Value = "DA" & Format(TextBox1.Value, "0000")

.Range(.Parent.ListColumns("Nom").Index).Value = TextBox2.Value

'...

'...

End With

If Not lstRow Is Nothing Then Set lstRow = Nothing

Que faire de ce bout de code ? Il complète les précédentes instructions ou il remplace une ou plusieurs instructions.

D'avance merci de m'écrire le code complet du module pour TabDA et de me signaler les lignes à écrire et où les écrire pour les autres tableaux structurés.

Re ,

Ce n'est juste qu'un exemple de code pour le formatage de la colonne ID (ou autre nom donné), quand tu ajoutes une ligne sur un tableau.

Je n'ai pas trop regarder le code source de ton classeur, et je ne sais pas si cela peut s'adapter, sans faire trop de chamboulements.

Re,

Je vais donc créer un module avec les différentes instructions que vous m'avez communiquées. Je verrai quel (les) réaction(s) positive (s) ou négative(s) que cela provoquera. Comment le programme devinera-t-il qu'il doit aller sur ledit module ?

Hier soir, j'avais trouvé une solution qui me satisfaisait mais j'ai hélas omis de la sauvegarder et je n'arrive pas à retrouver ce que j'avais écrit. Désolé, mais les dernières propositions de Jean-Paul n'aboutissent pas à ce que je souhaite. Je me vois donc dans l'obligation de laisser tomber et de travailler sur le programme initial même si il me donne pas entière satisfaction.

J'ai trouvé une nouvelle solution qui semble me donner satisfaction et je l'ai sauvegardée. Une question néanmoins : Mon tableau, il s'agit des différents tableaux structurés de la feuille Listes de choix ou du tableau structuré de la feuille BD articles budgétaires.

Bonjour,

Et c'est quoi cette solution ? Vous pouvez partager ?

Par ailleurs vous deviez corriger/compléter vos prédéfinitions or dans votre fichier il n'y a pas d'évolutions !

Bonjour BeHood,

Le fichier avec ma solution.

Je n'ai pas compris la partie prédéfinitions, il doit manquer des mots dans votre texte.

Re,

Vous êtes toujours aussi impayable, vous avez une erreur de compilation et surtout expliquez-nous comment vous voyez que le tri vous donne satisfaction !

PS : je n'ai rien dit pour les prédéfinitions

Re,

1) Où se trouve l'erreur de compilation ? Apparemment, dans le module MFormatColonne, le tbCodeArticle n'est pas reconnu alors qu'à l'exécution, je n'ai aucun message d'erreur !

2) Pour le tri, je créée les articles dans n'importe quel ordre et, dans la feuille BD articles budgétaires, tableau structuré TabBDArticlesBudgétaires, les colonnes Article et code article se remplissent correctement, chaque article étant à sa bonne place.

Hier soir, cela a fonctionné. Ce matin, cela ne fonctionne plus. C'est pour cela que je l'avais sauvegardé. Ce que je veux, c'est que le code article qui apparaît dans le formulaire soit identique à celui qui figure dans le tableau structuré correspondant (ici tabDA) d'une part, et en cas de création dans n'importe quel ordre, que le tri se fasse correctement par le code article (c'est ce qui est prévu dans la procédure cmdValidation_Click) et avec les références définies dans tabDA d'autre part.

1) Votre procédure FormatColonne n'est jamais exécutée, vous ne pouvez pas avoir d'erreur à l'exécution !

2) Essayez de créer rôti de porc et rôti de cheval

Pourquoi la procédure FormatColonne n'est-elle jamais exécutée ? Il faut faire appel à cette procédure mais où (peut-être dans cmdValidaion_Click) ?

Tout ce qui est supérieur à DA100 semble intégrer sa place convenable alors que tout ce qui est inférieur à DA100 ne prend pas sa place normale : donc c'est dans cette seconde partie qu'il semble y avoir un problème.

Non mais sérieusement,

Pourquoi la procédure FormatColonne n'est-elle jamais exécutée ? Il faut faire appel à cette procédure mais où (peut-être dans cmdValidaion_Click) ?

Vous le faites exprès, non ? Il y a une caméra cachée quelque part ?

La procédure FormatColumn ne doit-être exécutée que pour remettre les tableaux au bon format, Tu ne doit pas l'intégrer dans tes formulaires.

C'est quand même en bon français non ?

Et pour le reste du code fourni (Que tu as ajouter à la procédure FormatColumn)

Ce n'est juste qu'un exemple de code pour le formatage de la colonne ID (ou autre nom donné), quand tu ajoutes une ligne sur un tableau.

Là vraiment je déclare forfait.

Bonjour Jean-Paul,

Moi aussi je déclare forfait car personne ne résout le problème. La procédure formatcolumn est dans un module et non dans le formulaire. Vous n'avez toujours pas répondu à ma question : mon tableau : c'est quoi ? Lisez donc le message que j'ai écrit à BeGood : je ne cherche pas à ajouter une ligne à mon tableau mais que le tri se fasse correctement, ce qui n'a rien à voir, désolé.

Heu,

mon tableau : c'est quoi ?

Dim lstRow As Excel.ListRow

Set lstRow = Range("Remplacez Cette phrase par le nom du tableau à traiter").ListObject.ListRows.Add

With lstRow

.Range(.Parent.ListColumns("Remplacez cette phrase par le nom de la colonne à traiter").Index).Value = "Remplacez cette phrase par le préfixe à mettre en tête de référence" & Format(TextBox1.Value, "0000")

.Range(.Parent.ListColumns("Remplacer cette phrase par le nom d'une autre colonne à mettre à jour").Index).Value = TextBox2.Value

'...

'...

End With

If Not lstRow Is Nothing Then Set lstRow = Nothing

Comme cela ça passe mieux ?

Rechercher des sujets similaires à "numero article prevoir code trois chiffres maximum tri"