Le tri de la feuille BD menus, tableau structuré TabBDMenus est inexact

Bonjour à toutes et à tous,

Feuille BD menus, tableau structuré TabBDMenus : colonne Nature menu : le tri répond bien à mes souhaits. Colonne Date menu : le tri concernant MJ et VMMWE répond à mes souhaits, tout au moins pour l'instant. Le tri concernant MMR, par contre, n'est pas celui attendu. premier tri : sur code nature menu (ou code nature menu allégée) ascendant (du plus petit au plus fort : d'abord MJ; ensuite MMR et enfin VMMWE; deuxième tri : ascendant (du 1er août au 31 août) pour MJ du 01 août au 31 août pour MMR, du 02 août jusqu'au dernier samedi ou dimanche pour VMMWE. Le code du tri est dans la procédure Private Sub cmdValidationCréationMenu, presque à la fin. D'avance merci pour votre aide afin de résoudre ce problème.

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

15comptabilite.xlsm (253.88 Ko)

Bonjour

Il faut un tri à 2 niveaux, ce que tu as mais je n'en vois pas l'exécution

image

Exemple

With Range("TabBDMenus").ListObject
        .Sort.SortFields.Clear
        .Sort.SortFields.Add2 Key:=Range("TabBDMenus[Code nature menu]"), SortOn:=xlSortOnValues, _
            Order:=xlAscending, DataOption:=xlSortNormal
        .Sort.SortFields.Add2 Key:=Range("TabBDMenus[Date menu]"), SortOn:=xlSortOnValues, Order _
            :=xlAscending, DataOption:=xlSortNormal
        With .Sort
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .Apply
        End With
    End With

Bonjour 78Chris,

Comment fais-tu pour avoir le tableau Tri ci-dessus ? Accueil, Trier et filtrer, Tri personnalisé : sur Excel 2010, il n'y a pas Valeurs de cellule, uniquement Valeurs. À moins qu'il faille aller ailleurs pour compléter une éventuelle option qui permettrait d'avoir Valeurs de cellule.

Je remplace mon actuel tri par le code que tu m'as gentiment écrit, dans la même procédure ?

RE

les traductions évoluent en permanence mais la logique n'a pas changé.

Ton code

'Trier la feuille  BD menus, tableau structuré TabBDMenus, par code nature menu allégée et par date. Range.Sort key1 : désigne le pre _
mier champ du tri, soit sous forme de chaîne de nom de plage, soit sous forme d'objet. .Range : détermine les valeurs à trier. Hea _
der:=xlYes : La plage entière ne doit pas être triée.
        .Range.Sort key1:=.ListColumns("Code nature menu"), key2:=.ListColumns("Date menu"), order2:=xlAscending, Header:=xlYes

ne trie pas (il manque le partie .Sort et le apply)

et les clés ne sont pas correctement définies

donc remplace ta ligne unique par

        .Sort.SortFields.Clear
        .Sort.SortFields.Add Key:=Range("TabBDMenus[Code nature menu]"), SortOn:=xlSortOnValues, _
            Order:=xlAscending, DataOption:=xlSortNormal
        .Sort.SortFields.Add Key:=Range("TabBDMenus[Date menu]"), SortOn:=xlSortOnValues, Order _
            :=xlAscending, DataOption:=xlSortNormal
        With .Sort
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .Apply
        End With

Le With range étant déjà défini das ta procédure et le End with correspondant aussi

N.B. : Add2 n'existe pas sur 2010, c'est juste Add

Le tri sur date ne se fait toujours pas. Le tri doit se faire sur la date menu sans tenir compte du jour de la semaine. Actuellement, il fait le tri sur le jour de la semaine.

12comptabilite.xlsm (268.43 Ko)

RE

Tes dates sont des textes et non des dates formatées en date longue d'où le problème...

Les zones de userform sont du texte : il faut convertir

Il faut remplacer

.ListColumns("Date menu").DataBodyRange(I) = tbDateMenu.Value

par

.ListColumns("Date menu").DataBodyRange(I) = CDate(tbDateMenu.Value)

Idems pour toutes tes dates

Afin de ne pas faire de bétises, partout où il y a .ListColumns("Date menu").DataBodyRange(I) = tbDateMenu.Value, je le remplace par

.ListColumns("Date menu").DataBodyRange(I) = CDate(tbDateMenu.Value)

RE

Oui et aussi les autres dates (tu as plusieurs colonnes de dates)

Désolé : moi et l'esprit de déduction, nous ne sommes pas amis. Dans la procédure suivante, où il y a tbDateMenu ou TabDate ou date menu, que dois-je remplacer et par quoi ?

Private Sub tbDateMenu_Change()
Dim TabDate() As String, J As Long, JourSemaine As Long

'Si vérification date menu NOK, on ne fait rien et on quitte la procédure.
If VérifDateMenu = False Then Exit Sub

'Vérification jour férié. On Error Resume Next : Lorsqu'une erreur d'exécution survient, le contrôle est transmis à l'instruction qui suit immé _
diatement celle où l'erreur s'est produite, et l'exécution continue. Il est recommandé d'utiliser cette formulation plutôt que l'instruction On _
Error GoTo pour accéder à des objets.
On Error Resume Next

'Extraction de la date au format "Date". On relève tous les termes de la date qui sont séparés par un espace en les numérotant de zéro à 3.
TabDate = Split(tbDateMenu, " ")
'Zéro pour jour en lettres, un = jour en nombre, deux = mois en lettres, trois = année en nombre. On prend les premier, deuxième et troisiè _
mes termes que l'on colle dans tbMoisMenu.
DateMenu = Format(TabDate(1) & "/" & TabDate(2) & "/" & TabDate(3), "m/d/yyyy")
'Mois menu. On prend les deuxième et troisième termes que l'on colle dans tbMoisMenu.
tbMoisMenu = TabDate(2) & " " & TabDate(3)

'RéférenceSemestreViandesMidiWeekend.
If tbCodeNatureMenuAllégée.Value = "VMMWE" Then
'<= : inférieur ou égal à (ici à 6).
If Month(DateMenu) <= 6 Then
tbRéférenceSemestreViandesMidiWeekend.Value = "Premier semestre " & Year(DateMenu)
Else
tbRéférenceSemestreViandesMidiWeekend.Value = "Deuxième semestre " & Year(DateMenu)
End If
End If
'WorksheetFunction.match : Renvoie la position relative d'un élément dans une matrice (matrice : permet de créer des formules uniques _
permettant d’obtenir plusieurs résultats et qui agissent sur un groupe d’arguments répartis dans des lignes et des colonnes. Une plage ma _
tricielle partage une même formule tandis qu’une constante matricielle est un groupe de constantes qui sert d’argument.), qui correspond _
à une valeur spécifiée dans un ordre spécifié. Utilisez la fonction MATCH au lieu de l'une des fonctions LOOKUP lorsque vous avez besoin _
de la position d'un élément dans une plage au lieu de l'élément proprement dit. 'CLng : La fonction CLng convertit une expression en un _
type de données spécifique (les fractions sont arrondies).
J = WorksheetFunction.Match(CLng(DateMenu), Range("TabJoursFériés[Date jour férié]"), 0)
'On Error GoTo 0 : Invalide dans la procédure en cours tout gestionnaire d'erreurs validé.
On Error GoTo 0
If J <> 0 Then
tbJoursFériés.Value = Range("TabJoursFériés[Nom jour férié]").Item(J)
Else
tbJoursFériés.Value = ""
End If

'Effacement préalable.
Call EffacementContrôles

'Initialisations des listes codes articles selon code Légumes, Viandes, Deserts et date menu.
'Appel de la procédure PrédéfinitionsSpécifiques
'Call PrédéfinitionsSpécifiques
'Appel de la procédure RécupérationMenu (d'après BeGood).
Call RécupérationMenu

End Sub

Là où il y aura tbDateMenu, je devrais remplacer par ce que tu vas m'écrire ? Actuellement, cette procédure aboutit bien au remplissage de Mois concerné et Jour férié.

RE

J'ai déjà indiqué que tes dates sont des textes dans ton tableau et non des dates d'où la nécessité de convertir le texte en date et d'afficher les dates au format date longue, si tu veux voir le jour en toutes lettres, ceci afin que le tri se fasse bien sur des dates et pas des textes.

Format habille une valeur mais ne convertit pas le type de celle-ci

Fais des essais sinon tu n'avanceras jamais ne VBA...

Bonjour à tous,

Alors vous en êtes où dans tous vos problèmes ? Vous travaillez en privé ?

Bonjour BeGood,

Je travaille en privé et en forum. Arturo83 a proposé une solution qui semble fonctionner. Par contre, j'ai un problème avec la procédure Private Sub PrédéfinitionsSpécifiques, case MMR, Maïs et radis : si je télécharge un fichier joint, il s'ouvre soit sous Excel 2007, soit sous Excel 2010. Quand il s'ouvre sous Excel 2007, Maïs est Mads et impossible de remplacer le i par un i tréma, le i reste d, d'où l'impossibilité d'exécuter la procédure.

Bonjour à tous de nouveau,

Je travaille en privé et en forum.

Pas certain que ce soit bien apprécié.

Bonne chance

@Arturo83,

Bonjour Arturo83,

Le tri ne se fait que sur le jour de la semaine et non sur la date menu (01, 02, etc.). J'ai un autre problème pour lequel j'ai créé le nouveau sujet :

Menu journalier d'un samedi : remplissage de légume deux non désiré

RE

Nous revoilà à la case départ : j'ai bien précisé qu'il fait convertir en date et non garder des textes...

Bonjour,

Je vous ai donné déjà la solution, alors je recommence:

Dans la macro CmdValidationCreationMenu:

        '************************************************************************
        TabDate = Split(tbDateMenu, " ")
        'Zéro pour jour en lettres, un = jour en nombre, deux = mois en lettres, trois = année en nombre. On prend les premier, deuxième et troisiè _
        mes termes que l'on colle dans tbMoisMenu.
        DateMenu = Format(TabDate(1) & "/" & TabDate(2) & "/" & TabDate(3), "d/m/yyyy")
        .ListColumns("Date menu").DataBodyRange(I) = DateMenu
        '************************************************************************

et bien sûr, il faut déclarer Ia variable "I" tout en haut du module, en dehors de toute procédure pour quelle soit prise en compte pour tout le module concerné.

Revoici la macro intégrale:

Private Sub cmdValidationCréationMenu_Click()
'Si le menu à la date proposée n'existe pas, on ne fait rien et on sort de la procédure.
    If cbNatureMenuAllégée.ListIndex = -1 Then Exit Sub

'Recherche IndiceMenus.
    I = IndiceMenus(tbCodeNatureMenuAllégée.Value, DateMenu)

    With Range("TabBDMenus").ListObject
        If I = 0 Then
'Menu à la date proposée non trouvé : ajout d'une ligne à la fin du tableau structuré TabBDMenus. ListRowsAdd : Ajoute une nouvelle li _
gne à la table représentée par l'objet ListObject spécifié.
            .ListRows.Add
'ListRows.Count : cette proproété renvoie une valeur de type Integer qui représente le nombre d'objets dans la collection.
            I = .ListRows.Count
        End If
'Insertion des données saisies dans le formulaire UF02CréationMenus (objet) vers la feuille BD menus, tableau structuré TabBDMenus. _
.ListColumns : cette propriété renvoie une collection ListColums qui représente toutes les colonnes d'un objet ListObject. Type de don _
nées en lecture seule. DataBodyRange : Cette propriété renvoie un objet Range qui représente la plage de valeurs, à l'exception de la li _
gne d'en-tête dans une table. Type de données en lecture seule. Nature menu : nom de la colonne dans la feuille BD menus, tableau _
structuré TabBDMenus. cbNatureMenu.Value : nom de l'objet dans le formulaire UF02CréationMenus (Objet).
        .ListColumns("Nature menu").DataBodyRange(I) = cbNatureMenuAllégée.Value
        .ListColumns("Code nature menu").DataBodyRange(I) = tbCodeNatureMenuAllégée.Value

        '************************************************************************
        TabDate = Split(tbDateMenu, " ")
        'Zéro pour jour en lettres, un = jour en nombre, deux = mois en lettres, trois = année en nombre. On prend les premier, deuxième et troisiè _
        mes termes que l'on colle dans tbMoisMenu.
        DateMenu = Format(TabDate(1) & "/" & TabDate(2) & "/" & TabDate(3), "d/m/yyyy")
        .ListColumns("Date menu").DataBodyRange(I) = DateMenu
        '************************************************************************

        .ListColumns("Date création menu").DataBodyRange(I) = tbDateCréationMenu.Value
        .ListColumns("Légume").DataBodyRange(I) = cbLégumes.Value
        .ListColumns("Code légume").DataBodyRange(I) = tbCodeLégumes.Value
        .ListColumns("Période légume").DataBodyRange(I) = cbPériodeLégumes.Value
        .ListColumns("Code période légume").DataBodyRange(I) = tbCodePériodeLégumes.Value
        .ListColumns("Conditionnement légume").DataBodyRange(I) = cbConditionnementLégumes.Value
        .ListColumns("Code conditionnement légume").DataBodyRange(I) = tbCodeConditionnementLégumes.Value
        .ListColumns("Légume deux").DataBodyRange(I) = cbLégumeDeux.Value
        .ListColumns("Code légume deux").DataBodyRange(I) = tbCodeLégumeDeux.Value
        .ListColumns("Période légume deux").DataBodyRange(I) = cbPériodeLégumeDeux.Value
        .ListColumns("Code période légume deux").DataBodyRange(I) = tbCodePériodeLégumeDeux.Value
        .ListColumns("Conditionnement légume deux").DataBodyRange(I) = cbConditionnementLégumeDeux.Value
        .ListColumns("Code conditionnement légume deux").DataBodyRange(I) = tbCodeConditionnementLégumeDeux.Value
'CDbl : La fonction CLng convertit une expression en un type de données spécifique (Type de données stockant sur 64 bits les nombres à _
virgule flottante en double précision compris entre -1,79769313486231E308 et -4,94065645841247E-324 pour les valeurs négatives, et _
entre 4,94065645841247E-324 et 1,79769313486232E308 pour les valeurs positives. Dans Visual Basic, le signe dièse (#) est le carac _
tère de déclaration du type Double.
    If tbQuantitéLégume.Value <> "" Then
        .ListColumns("Quantité légume").DataBodyRange(I) = CDbl(tbQuantitéLégume.Value)
    Else
        .ListColumns("Quantité légume").DataBodyRange(I) = ""
    End If
    If tbQuantitéLégumeDeux.Value <> "" Then
        .ListColumns("Quantité légume deux").DataBodyRange(I) = CDbl(tbQuantitéLégumeDeux.Value)
    Else
        .ListColumns("Quantité légume deux").DataBodyRange(I) = ""
    End If
        .ListColumns("Viande").DataBodyRange(I) = cbViandes.Value
        .ListColumns("Code viande").DataBodyRange(I) = tbCodeViandes.Value
        .ListColumns("Période viande").DataBodyRange(I) = cbPériodeViandes.Value
        .ListColumns("Code période viande").DataBodyRange(I) = tbCodePériodeViandes.Value
        .ListColumns("Conditionnement viande").DataBodyRange(I) = cbConditionnementViandes.Value
        .ListColumns("Code conditionnement viande").DataBodyRange(I) = tbCodeConditionnementViandes.Value
    If tbQuantitéViandes.Value <> "" Then
        .ListColumns("Quantité viande").DataBodyRange(I) = CDbl(tbQuantitéViandes.Value)
    Else
        .ListColumns("Quantité légume").DataBodyRange(I) = ""
    End If
        .ListColumns("Référence semestre viandes midi weekend").DataBodyRange(I) = tbRéférenceSemestreViandesMidiWeekend.Value
        .ListColumns("Dessert").DataBodyRange(I) = cbDesserts.Value
        .ListColumns("Code dessert").DataBodyRange(I) = tbCodeDesserts.Value
        .ListColumns("Période dessert").DataBodyRange(I) = cbPériodeDesserts.Value
        .ListColumns("Code période dessert").DataBodyRange(I) = tbCodePériodeDesserts.Value
        .ListColumns("Conditionnement dessert").DataBodyRange(I) = cbConditionnementDesserts.Value
        .ListColumns("Code conditionnement dessert").DataBodyRange(I) = tbCodeConditionnementDesserts.Value
    If tbQuantitéDesserts.Value <> "" Then
        .ListColumns("Quantité dessert").DataBodyRange(I) = CDbl(tbQuantitéDesserts.Value)
    Else
        .ListColumns("Quantité dessert").DataBodyRange(I) = ""
    End If
        .ListColumns("Numéro création menu").DataBodyRange(I) = tbNuméroCréationMenu.Value
        .ListColumns("Nom jour férié").DataBodyRange(I) = tbJoursFériés.Value
        .ListColumns("Mois menu").DataBodyRange(I) = tbMoisMenu.Value
        .ListColumns("Nature menu allégée").DataBodyRange(I) = cbNatureMenuAllégée.Value
        .ListColumns("Code nature menu allégée").DataBodyRange(I) = tbCodeNatureMenuAllégée.Value
'Trier la feuille  BD menus, tableau structuré TabBDMenus, par code nature menu allégée et par date. Range.Sort key1 : désigne le pre _
mier champ du tri, soit sous forme de chaîne de nom de plage, soit sous forme d'objet. .Range : détermine les valeurs à trier. Hea _
der:=xlYes : La plage entière ne doit pas être triée.
        .Range.Sort key1:=.ListColumns("Code nature menu"), key2:=.ListColumns("Date menu"), order2:=xlAscending, Header:=xlYes
'Appel de la procédure ModifierNuméroCréationMenu.
    Call ModifierNuméroCréationMenu
    I = IndiceMenus(tbCodeNatureMenuAllégée.Value, DateMenu)
    tbNuméroCréationMenu.Value = .ListColumns("Numéro création menu").DataBodyRange(I)
    End With
End Sub

S'il vous plaît, quand vous faites une demande sur le forum, ne faites pas appel à un intervenant en particulier, ça n'encourage personne à venir vous aider.

Quand j'inclus la partie Split dans la procédure cmdValidation, je remplis les contrôles, je clique sur Validation et j'ai un message d'erreur tableau attendu.

DateMenu = Format(TabDate(1) & "/" & TabDate(2) & "/" & TabDate(3), "m/d/yyyy")

À certains endroits, j'ai dû supprimer le tb de DateMenu à cause d'incompatibilité de type.

Déposez le fichier ici et annoncez les opérations que vous faites qui génèrent une erreur

Feuille Accueil : clic sur création menus. Formulaire UF02CréationMenus ! Nature menu allégée : Menu journalier; Date menu : 10 août 2025; Nature menu : Légume weekend dimanche; Légumes : Frites (tout ce qui concerne Légume deux apparaît bien avec les bonnes informations); Nature menu : Viande soir; Viandes : Roulé au fromage; Quantité viandes : 1,00; Nature menu : Desserts weekend; Desserts : il devrait se remplir automatiquement (le même que le samedi) : ici, Avocats desserts; Quantité dessert : 2 ,00; clic sur ValidationCréationMenu: erreur de compilation : tableau attendu (voir mon précédent message pour la ligne mise en cause. Je n'ai pas fait de débogage.

14comptabilite.xlsm (257.92 Ko)

Là je m'absente, j'ai rendez-vous avec mon médecin traitant. J'espère être de retour pour 15 heures 30 au plus tard dans l'hypothèse où je devrais me rendre à ma pharmacie, sinon ce sera plus tôt.

Je suis revenu.

pour le problème du tri de la date, il y avait une ligne de code qui annulait le format de date.

9comptabilite.xlsm (218.64 Ko)

Mais je ne comprends pas, BeGood vous avait donné un fichier qui marchait bien

Rechercher des sujets similaires à "tri feuille menus tableau structure tabbdmenus inexact"