Fichier MENUS.xlsm : Propositions menus journaliers

Bonjour à toutes et à tous,

Module MGénérer_GenPropoMJ, procédure Sub GénPropMJ, je souhaiterais que tous les jours de la semaine apparaissent, saus aucune restriction, du 01 janvier au 31 décembre inclus. Merci de m'aider à trouver la solution adéquate pour qu'i en soit ainsi. Merci également de m'expliquer la modification que vous allez proposercar cela pourrait m'aider pour les propositions menus viandes weekend.

28menus.xlsm (203.58 Ko)

Bonjour,

Dans la macro et dans les boucles, remplacement de la colonne 8 par 10, c'est tout.

Cdlt

Bonjour Arturo,

Merci pour votre réponse. J'ai testé mais je n'ai pas dû comprendre votre réponse car cela ne donne pas le résultat escompté. Voir fichier joint.

14menus-arturo.xlsm (207.77 Ko)

si c'est pour le quadrillage, je l'ai fait manuellement donc, voici le code qui intègre le quadrillage, sinon pour ce que vous aviez demandé, c'était bien cela , non!

Sub GénPropMJ()

'Déclaration des variables. nm = numéro menu. J représente le nombre de lignes, excepté la ligne titre;le décompte commence donc à la ligne 2. DatJ = Date du jour.

Dim Lig As Long, Col As Long, nm As Long, J As Long
Dim Datj As Date

    ' ScreenUpdating True si la mise à jour de l’écran est activée. Type de données Boolean en lecture-écriture.
    Application.ScreenUpdating = False

    'Initialisations. WorksheetFunction.WorkDay : Renvoie un nombre représentant une date qui est le nombre de jours ouvrés indiqué avant ou après une date (date de début).
    'Les jours ouvrés excluent les week-ends et les jours de congés. Utilisez la fonction WORKDAY pour exclure les week-ends et les jours de congés lorsque vous calculez les
    'dates d'échéance des factures, les heures de livraison attendues ou le nombre de jours ouvrés effectués. 12 représente le nombre de mois, 31 équivaut au nombre de jours
    'maximum d'un mois. nm =1 : le numéro menu commence à 1.
    Datj = WorksheetFunction.WorkDay(DateSerial(Range("Année_en_Cours") - 1, 12, 31), 1)
    nm = 1

    'Remplissage. Worksheet("Propositions MMR") : il s'agit de la feuille dont le nom est indiqué à l'intérieur de la parenthèse.
    With Worksheets("Propositions menus journaliers")
        'B:H : représente les colonnes de la feuille Propositions menus midi journaliers qui seront à remplir. ClearContents : Masquer toutMéthode ClearContents telle qu'elle s'ap-
        'plique à l'objet.
        'Range. Efface les formules de la plage.
        .Range("B2:J901").ClearContents
        .Range("A1").Resize(901, 10).Borders.Weight = xlThick 'Bordure épaisse plage complète
        'For  Lig = 1 to 901 Step 17 : 1 to 901 : reprense le nombre de lignes à remplir (y compris la ligne titre). Step : Le mot clé Step est employé dans les contextes suivants :
        'For...Next, instruction.
        For Lig = 1 To 901 Step 17
                .Cells(Lig + 0, 1) = "Propositions menus journaliers"
                'C'est le centrage sur plusieurs colonnes qui inhibe l'affichage des bordures intérieures. Centrer sur toutes les colonnes.
                .Cells(Lig + 0, 1).Resize(1, 8).HorizontalAlignment = xlCenterAcrossSelection
                .Cells(Lig + 1, 1) = "Numéro du menu"
                .Cells(Lig + 2, 1) = "Date du menu"
                .Cells(Lig + 3, 1) = "Référence légume"
                .Cells(Lig + 4, 1) = "Légume"
                .Cells(Lig + 5, 1) = "Quantité légume"
                .Cells(Lig + 6, 1) = "Référence légume 2)"
                .Cells(Lig + 7, 1) = "Légume 2"
                .Cells(Lig + 8, 1) = "Quantité légume 2"
                .Cells(Lig + 9, 1) = "Référence viande"
                .Cells(Lig + 10, 1) = "Viande"
                .Cells(Lig + 11, 1) = "Quantité viande"
                .Cells(Lig + 12, 1) = "Référence dessert"
                .Cells(Lig + 13, 1) = "Dessert"
                .Cells(Lig + 14, 1) = "Quantité dessert"
                .Cells(Lig + 15, 1) = "Référence jour férié"
                .Cells(Lig + 16, 1) = "Jour férié"
         'For Col = 2 to 10 : Pour les colonnes 2 à 8 (la colonne A n'est pas prise en compte, le décompte commence donc à la colonne B jusqu'à la colonne J incluses.
            For Col = 2 To 10
                'En tête. À la ligne 1 (nom compris la ligne titre), va écrire MJ et formater le numéro menu (nm);À la ligne 2, (immédiatement après la précédente), va écrire la date
                'du jour.
                .Cells(Lig + 1, Col) = "MJ" & Format(nm, "00")
                .Cells(Lig + 2, Col) = Format(Datj, "dddd dd mm yyyy")

                'Légume. Dans les colonnes B à  J incluses, sur chaque ligne Référence légume, il va taper LMJ. Mêmes colonnes, les deux lignes suivantes (Légume et Quantité lé-
                'gume) vont rester vides.
                .Cells(Lig + 3, Col) = "LMJ"
                .Cells(Lig + 4, Col) = ""
                .Cells(Lig + 5, Col) = ""

                'Viande. Dans les colonnes B à  J incluses, sur chaque ligne Référence viande, il va taper VMJ. Mêmes colonnes, les deux lignes suivantes (Viande et Quantité
                'viande) vont rester vides.
                .Cells(Lig + 6, Col) = "VMJ"
                .Cells(Lig + 7, Col) = ""
                .Cells(Lig + 8, Col) = "100,00"

                'Dessert. Dans les colonnes B à  J incluses, sur chaque ligne, il va les remplir selon les instructions données..
                .Cells(Lig + 9, Col) = "DMR01"
                .Cells(Lig + 10, Col) = "Pomme"
                .Cells(Lig + 11, Col) = "1,00"

                'Fériés. Dans les colonnes B à  J incluses, sur chaque ligne Jour férié, il va taper le nom du jour férié selon la Datj, si ce jour correspond à un jour férié.
                For J = 1 To 13
                'DataBodyRange : Cette 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.
                    If Datj = Range("TabJoursFériés").ListObject.ListColumns("Date jour férié").DataBodyRange(J) Then
                        .Cells(Lig + 12, Col) = "JF" & Format(J, "00")
                        .Cells(Lig + 13, Col) = Range("TabJoursFériés").ListObject.ListColumns("Nom jour férié").DataBodyRange(J)
                    End If
                 Next J

                 'Incrémentations pour menu suivant.
                 nm = nm + 1
                 Datj = WorksheetFunction.WorkDay(Datj, 1)
                 If Year(Datj) > Range("Année_en_Cours").Value Then Exit For
            Next Col
        Next Lig
    End With

End Sub

C'est mieux mais les samedis et dimanches n'apparaissent toujours pas et la date semble erronée (ligne3, colonnes B à H incluses)

15menus-arturo.xlsm (211.15 Ko)

Ok, remplacement de la ligne (en fond de macro)

                 Datj = WorksheetFunction.WorkDay(Datj, 1)

par

                 Datj = Datj + 1

Merci.

1) Serait-il possible de faire cela sur huit colonnes (A à H incluses) au lieu de 10 ? Oui, j'ai modifié en conséquence et cela fonctionne.

2) La date de chaque colonne est bizarre. Elle devra apparaître sous la forme mardi 1 janvier 2026 et ainsi de suite.

3) Pour propositions menus VMWE, seuls les samedis et les dimanches devront apparaître et toujours sur huit colonnes maximum avec la date sous la même forme que le 2). Quelle formule doit être écrite pour qu'il en soit ainsi ?

D'avance merci pour votre réponse.

21menus-arturo.xlsm (212.81 Ko)

1) Serait-il possible de faire cela sur huit colonnes (A à H incluses) au lieu de 10 ? ok

Dim Datj As Date
    ' ScreenUpdating True si la mise à jour de l’écran est activée. Type de données Boolean en lecture-écriture.
    Application.ScreenUpdating = False

    'Initialisations. WorksheetFunction.WorkDay : Renvoie un nombre représentant une date qui est le nombre de jours ouvrés indiqué avant ou après une date (date de début).
    'Les jours ouvrés excluent les week-ends et les jours de congés. Utilisez la fonction WORKDAY pour exclure les week-ends et les jours de congés lorsque vous calculez les
    'dates d'échéance des factures, les heures de livraison attendues ou le nombre de jours ouvrés effectués. 12 représente le nombre de mois, 31 équivaut au nombre de jours
    'maximum d'un mois. nm =1 : le numéro menu commence à 1.
    Datj = WorksheetFunction.WorkDay(DateSerial(Range("Année_en_Cours") - 1, 12, 31), 1)
    nm = 1

    'Remplissage. Worksheet("Propositions MMR") : il s'agit de la feuille dont le nom est indiqué à l'intérieur de la parenthèse.
    With Worksheets("Propositions menus journaliers")
        'B:H : représente les colonnes de la feuille Propositions menus midi journaliers qui seront à remplir. ClearContents : Masquer toutMéthode ClearContents telle qu'elle s'ap-
        'plique à l'objet.
        'Range. Efface les formules de la plage.
        .Range("B2:J901").ClearContents
        .Range("A1").Resize(901, 8).Borders.Weight = xlThick 'Bordure épaisse plage complète
        'For  Lig = 1 to 901 Step 17 : 1 to 901 : reprense le nombre de lignes à remplir (y compris la ligne titre). Step : Le mot clé Step est employé dans les contextes suivants :
        'For...Next, instruction.
        For Lig = 1 To 901 Step 17
                .Cells(Lig + 0, 1) = "Propositions menus journaliers"
                'C'est le centrage sur plusieurs colonnes qui inhibe l'affichage des bordures intérieures. Centrer sur toutes les colonnes.
                .Cells(Lig + 0, 1).Resize(1, 8).HorizontalAlignment = xlCenterAcrossSelection
                .Cells(Lig + 1, 1) = "Numéro du menu"
                .Cells(Lig + 2, 1) = "Date du menu"
                .Cells(Lig + 3, 1) = "Référence légume"
                .Cells(Lig + 4, 1) = "Légume"
                .Cells(Lig + 5, 1) = "Quantité légume"
                .Cells(Lig + 6, 1) = "Référence légume 2)"
                .Cells(Lig + 7, 1) = "Légume 2"
                .Cells(Lig + 8, 1) = "Quantité légume 2"
                .Cells(Lig + 9, 1) = "Référence viande"
                .Cells(Lig + 10, 1) = "Viande"
                .Cells(Lig + 11, 1) = "Quantité viande"
                .Cells(Lig + 12, 1) = "Référence dessert"
                .Cells(Lig + 13, 1) = "Dessert"
                .Cells(Lig + 14, 1) = "Quantité dessert"
                .Cells(Lig + 15, 1) = "Référence jour férié"
                .Cells(Lig + 16, 1) = "Jour férié"
         'For Col = 2 to 8 : Pour les colonnes 2 à 8 (la colonne A n'est pas prise en compte, le décompte commence donc à la colonne B jusqu'à la colonne H incluses.
            For Col = 2 To 8
                'En tête. À la ligne 1 (nom compris la ligne titre), va écrire MJ et formater le numéro menu (nm);À la ligne 2, (immédiatement après la précédente), va écrire la date
                'du jour.
                .Cells(Lig + 1, Col) = "MJ" & Format(nm, "00")
                .Cells(Lig + 2, Col) = Format(Datj, "dddd dd mm yyyy")

                'Légume. Dans les colonnes B à  H incluses, sur chaque ligne Référence légume, il va taper LMJ. Mêmes colonnes, les deux lignes suivantes (Légume et Quantité lé-
                'gume) vont rester vides.
                .Cells(Lig + 3, Col) = "LMJ"
                .Cells(Lig + 4, Col) = ""
                .Cells(Lig + 5, Col) = ""

                'Viande. Dans les colonnes B à  H incluses, sur chaque ligne Référence viande, il va taper VMJ. Mêmes colonnes, les deux lignes suivantes (Viande et Quantité
                'viande) vont rester vides.
                .Cells(Lig + 6, Col) = "VMJ"
                .Cells(Lig + 7, Col) = ""
                .Cells(Lig + 8, Col) = "100,00"

                'Dessert. Dans les colonnes B à  H incluses, sur chaque ligne, il va les remplir selon les instructions données..
                .Cells(Lig + 9, Col) = "DMR01"
                .Cells(Lig + 10, Col) = "Pomme"
                .Cells(Lig + 11, Col) = "1,00"

                'Fériés. Dans les colonnes B à  H incluses, sur chaque ligne Jour férié, il va taper le nom du jour férié selon la Datj, si ce jour correspond à un jour férié.
                For J = 1 To 13
                'DataBodyRange : Cette 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.
                    If Datj = Range("TabJoursFériés").ListObject.ListColumns("Date jour férié").DataBodyRange(J) Then
                        .Cells(Lig + 12, Col) = "JF" & Format(J, "00")
                        .Cells(Lig + 13, Col) = Range("TabJoursFériés").ListObject.ListColumns("Nom jour férié").DataBodyRange(J)
                    End If
                 Next J

                 'Incrémentations pour menu suivant.
                 nm = nm + 1
                 Datj = Datj + 1
                 If Year(Datj) > Range("Année_en_Cours").Value Then Exit For
            Next Col
        Next Lig
    End With
End Sub

2) La date de chaque colonne est bizarre. Qu'est-ce qui est bizarre?

3) Pour propositions menus VMWE, seuls les samedis et les dimanches doivent apparaître et toujours sur huit colonnes maximum. Quelle formule doit être écrite pour qu'il en soit ainsi ? Je regarderai plus tard

2) Elle se présente ainsi :

jeudi 01 01 2026
C'est le mois qui apparaît sous une forme chiffrée au lieu d'un texte (01 au lieu de janvier) : j'ai trouvé pourquoi : mm au lieu de mmmm

Ça n'a rien de bizarre, c'est le format que j'ai choisi, si vous voulez le mois en entier remplacez la ligne

                .Cells(Lig + 2, Col) = Format(Datj, "dddd dd mm yyyy")

par

                .Cells(Lig + 2, Col) = Format(Datj, "dddd dd mmmm yyyy")

ou si vous ne voulez que les 3 premières lettres du mois

                .Cells(Lig + 2, Col) = Format(Datj, "dddd dd mmm yyyy")

C'est bien ce que j'avais dit dans mon précédent message. C'est parfait et c'est bien ce que je voulais. Merci Arturo83. Quand j'aurai la réponse pour propositions menus VMWE, je reviendrai sur la feuille Menus journaliers pour étudier le prochain problème qui concerne Référence légume. Bonnes soirée et continuation. Prenez bien soin de vous. Encore un cordial et chaleureux merci

Bonjour,

Code pour le module "MGénérer_GenPropMVMWE"

Option Explicit

Sub GénPropMVMWE()
'Déclaration des variables. nm = numéro menu. J représente le nombre de lignes, excepté la ligne titre;le décompte commence donc à la ligne 2. DatJ = Date du jour.

Dim Lig As Long, Col As Long, nm As Long, J As Long
Dim Datj As Date
    ' ScreenUpdating True si la mise à jour de l’écran est activée. Type de données Boolean en lecture-écriture.
    Application.ScreenUpdating = False

    'Initialisations. WorksheetFunction.WorkDay : Renvoie un nombre représentant une date qui est le nombre de jours ouvrés indiqué avant ou après une date (date de début).
    'Les jours ouvrés excluent les week-ends et les jours de congés. Utilisez la fonction WORKDAY pour exclure les week-ends et les jours de congés lorsque vous calculez les
    'dates d'échéance des factures, les heures de livraison attendues ou le nombre de jours ouvrés effectués. 12 représente le nombre de mois, 31 équivaut au nombre de jours
    'maximum d'un mois. nm =1 : le numéro menu commence à 1.
    Datj = WorksheetFunction.WorkDay(DateSerial(Range("Année_en_Cours") - 1, 12, 31), 1)
    nm = 1

    'Remplissage. Worksheet("Propositions menus VMWE") : il s'agit de la feuille dont le nom est indiqué à l'intérieur de la parenthèse.
    With Worksheets("Propositions menus VMWE")
        'B:H : représente les colonnes de la feuille Propositions menus midi journaliers qui seront à remplir. ClearContents : Masquer toutMéthode ClearContents telle qu'elle s'ap-
        'plique à l'objet.
        'Range. Efface les formules de la plage.
        .Range("B2:J901").ClearContents
        .Range("A1").Resize(901, 8).Borders.Weight = xlThick 'Bordure épaisse plage complète
        'For  Lig = 1 to 901 Step 17 : 1 to 901 : reprense le nombre de lignes à remplir (y compris la ligne titre). Step : Le mot clé Step est employé dans les contextes suivants :
        'For...Next, instruction.
        For Lig = 1 To 901 Step 17
            .Cells(Lig + 0, 1) = "Propositions menus journaliers"
            'C'est le centrage sur plusieurs colonnes qui inhibe l'affichage des bordures intérieures. Centrer sur toutes les colonnes.
            .Cells(Lig + 0, 1).Resize(1, 8).HorizontalAlignment = xlCenterAcrossSelection
            .Cells(Lig + 1, 1) = "Numéro du menu"
            .Cells(Lig + 2, 1) = "Date du menu"
            .Cells(Lig + 3, 1) = "Référence légume"
            .Cells(Lig + 4, 1) = "Légume"
            .Cells(Lig + 5, 1) = "Quantité légume"
            .Cells(Lig + 6, 1) = "Référence légume 2)"
            .Cells(Lig + 7, 1) = "Légume 2"
            .Cells(Lig + 8, 1) = "Quantité légume 2"
            .Cells(Lig + 9, 1) = "Référence viande"
            .Cells(Lig + 10, 1) = "Viande"
            .Cells(Lig + 11, 1) = "Quantité viande"
            .Cells(Lig + 12, 1) = "Référence dessert"
            .Cells(Lig + 13, 1) = "Dessert"
            .Cells(Lig + 14, 1) = "Quantité dessert"
            .Cells(Lig + 15, 1) = "Référence jour férié"
            .Cells(Lig + 16, 1) = "Jour férié"
            'For Col = 2 to 8 : Pour les colonnes 2 à 8 (la colonne A n'est pas prise en compte, le décompte commence donc à la colonne B jusqu'à la colonne H incluses.
            For Col = 2 To 8
                If WorksheetFunction.Weekday(Datj, 2) > 5 Then
                    'En tête. À la ligne 1 (nom compris la ligne titre), va écrire MJ et formater le numéro menu (nm);À la ligne 2, (immédiatement après la précédente), va écrire la date
                    'du jour.
                    .Cells(Lig + 1, Col) = "MJ" & Format(nm, "00")
                    .Cells(Lig + 2, Col) = Format(Datj, "dddd dd mmmm yyyy")

                    'Légume. Dans les colonnes B à  H incluses, sur chaque ligne Référence légume, il va taper LMJ. Mêmes colonnes, les deux lignes suivantes (Légume et Quantité lé-
                    'gume) vont rester vides.
                    .Cells(Lig + 3, Col) = "LMJ"
                    .Cells(Lig + 4, Col) = ""
                    .Cells(Lig + 5, Col) = ""

                    'Viande. Dans les colonnes B à  H incluses, sur chaque ligne Référence viande, il va taper VMJ. Mêmes colonnes, les deux lignes suivantes (Viande et Quantité
                    'viande) vont rester vides.
                    .Cells(Lig + 6, Col) = "VMJ"
                    .Cells(Lig + 7, Col) = ""
                    .Cells(Lig + 8, Col) = "100,00"

                    'Dessert. Dans les colonnes B à  H incluses, sur chaque ligne, il va les remplir selon les instructions données..
                    .Cells(Lig + 9, Col) = "DMR01"
                    .Cells(Lig + 10, Col) = "Pomme"
                    .Cells(Lig + 11, Col) = "1,00"

                    'Fériés. Dans les colonnes B à  H incluses, sur chaque ligne Jour férié, il va taper le nom du jour férié selon la Datj, si ce jour correspond à un jour férié.
                    For J = 1 To 13
                    'DataBodyRange : Cette 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.
                        If Datj = Range("TabJoursFériés").ListObject.ListColumns("Date jour férié").DataBodyRange(J) Then
                            .Cells(Lig + 12, Col) = "JF" & Format(J, "00")
                            .Cells(Lig + 13, Col) = Range("TabJoursFériés").ListObject.ListColumns("Nom jour férié").DataBodyRange(J)
                        End If
                     Next J
                End If
                'Incrémentations pour menu suivant.
                nm = nm + 1
                Datj = Datj + 1
                If Year(Datj) > Range("Année_en_Cours").Value Then Exit For
            Next Col
        Next Lig
    End With
End Sub

Cdlt

Bonjour Arturo83,

Merci Sur le fonds, c'est bien ce que je voulais. Par contre, pourquoi commencer à la colonne D au lieu de la colonne B ? Pourquoi ne pas remplir les colonnes F à H incluses ? Je n'ai pas lu le code, j'ai juste fait un copier-coller.

12menus-arturo.xlsm (250.11 Ko)

Par contre, pourquoi commencer à la colonne D au lieu de la colonne B ? Pourquoi ne pas remplir les colonnes F à H incluses

Je ne fais que répondre à votre demande:

3) Pour propositions menus VMWE, seuls les samedis et les dimanches devront apparaître et toujours sur huit colonnes maximum avec la date sous la même forme que le 2). Quelle formule doit être écrite pour qu'il en soit ainsi ?

Désolé, mais j'ai bien précisé sur huit colonnes avec la date formatée en dddd d mmmm yyyy. Comme je pensais que cela allait de soi, je n'ai pas cru nécessaire de préciser que cela devait commencer à la colonne B et finir à la colonne H.

Eh oui, parfois les explications ne sont pas perçues de la même façon.

Il suffit de déplacer la ligne suivante:

                If WorksheetFunction.Weekday(Datj, 2) > 5 Then

le code en entier

Sub GénPropMVMWE()
'Déclaration des variables. nm = numéro menu. J représente le nombre de lignes, excepté la ligne titre;le décompte commence donc à la ligne 2. DatJ = Date du jour.

Dim Lig As Long, Col As Long, nm As Long, J As Long
Dim Datj As Date
    ' ScreenUpdating True si la mise à jour de l’écran est activée. Type de données Boolean en lecture-écriture.
    Application.ScreenUpdating = False

    'Initialisations. WorksheetFunction.WorkDay : Renvoie un nombre représentant une date qui est le nombre de jours ouvrés indiqué avant ou après une date (date de début).
    'Les jours ouvrés excluent les week-ends et les jours de congés. Utilisez la fonction WORKDAY pour exclure les week-ends et les jours de congés lorsque vous calculez les
    'dates d'échéance des factures, les heures de livraison attendues ou le nombre de jours ouvrés effectués. 12 représente le nombre de mois, 31 équivaut au nombre de jours
    'maximum d'un mois. nm =1 : le numéro menu commence à 1.
    Datj = WorksheetFunction.WorkDay(DateSerial(Range("Année_en_Cours") - 1, 12, 31), 1)
    nm = 1

    'Remplissage. Worksheet("Propositions menus VMWE") : il s'agit de la feuille dont le nom est indiqué à l'intérieur de la parenthèse.
    With Worksheets("Propositions menus VMWE")
        'B:H : représente les colonnes de la feuille Propositions menus midi journaliers qui seront à remplir. ClearContents : Masquer toutMéthode ClearContents telle qu'elle s'ap-
        'plique à l'objet.
        'Range. Efface les formules de la plage.
        .Range("B2:J901").ClearContents
        .Range("A1").Resize(901, 8).Borders.Weight = xlThick 'Bordure épaisse plage complète
        'For  Lig = 1 to 901 Step 17 : 1 to 901 : reprense le nombre de lignes à remplir (y compris la ligne titre). Step : Le mot clé Step est employé dans les contextes suivants :
        'For...Next, instruction.
        For Lig = 1 To 901 Step 17
            .Cells(Lig + 0, 1) = "Propositions menus journaliers"
            'C'est le centrage sur plusieurs colonnes qui inhibe l'affichage des bordures intérieures. Centrer sur toutes les colonnes.
            .Cells(Lig + 0, 1).Resize(1, 8).HorizontalAlignment = xlCenterAcrossSelection
            .Cells(Lig + 1, 1) = "Numéro du menu"
            .Cells(Lig + 2, 1) = "Date du menu"
            .Cells(Lig + 3, 1) = "Référence légume"
            .Cells(Lig + 4, 1) = "Légume"
            .Cells(Lig + 5, 1) = "Quantité légume"
            .Cells(Lig + 6, 1) = "Référence légume 2)"
            .Cells(Lig + 7, 1) = "Légume 2"
            .Cells(Lig + 8, 1) = "Quantité légume 2"
            .Cells(Lig + 9, 1) = "Référence viande"
            .Cells(Lig + 10, 1) = "Viande"
            .Cells(Lig + 11, 1) = "Quantité viande"
            .Cells(Lig + 12, 1) = "Référence dessert"
            .Cells(Lig + 13, 1) = "Dessert"
            .Cells(Lig + 14, 1) = "Quantité dessert"
            .Cells(Lig + 15, 1) = "Référence jour férié"
            .Cells(Lig + 16, 1) = "Jour férié"
            'For Col = 2 to 8 : Pour les colonnes 2 à 8 (la colonne A n'est pas prise en compte, le décompte commence donc à la colonne B jusqu'à la colonne H incluses.
            For Col = 2 To 8
                'En tête. À la ligne 1 (nom compris la ligne titre), va écrire MJ et formater le numéro menu (nm);À la ligne 2, (immédiatement après la précédente), va écrire la date
                'du jour.
                .Cells(Lig + 1, Col) = "MJ" & Format(nm, "00")
                .Cells(Lig + 2, Col) = Format(Datj, "dddd dd mmmm yyyy")
                If WorksheetFunction.Weekday(Datj, 2) > 5 Then

                    'Légume. Dans les colonnes B à  H incluses, sur chaque ligne Référence légume, il va taper LMJ. Mêmes colonnes, les deux lignes suivantes (Légume et Quantité lé-
                    'gume) vont rester vides.
                    .Cells(Lig + 3, Col) = "LMJ"
                    .Cells(Lig + 4, Col) = ""
                    .Cells(Lig + 5, Col) = ""

                    'Viande. Dans les colonnes B à  H incluses, sur chaque ligne Référence viande, il va taper VMJ. Mêmes colonnes, les deux lignes suivantes (Viande et Quantité
                    'viande) vont rester vides.
                    .Cells(Lig + 6, Col) = "VMJ"
                    .Cells(Lig + 7, Col) = ""
                    .Cells(Lig + 8, Col) = "100,00"

                    'Dessert. Dans les colonnes B à  H incluses, sur chaque ligne, il va les remplir selon les instructions données..
                    .Cells(Lig + 9, Col) = "DMR01"
                    .Cells(Lig + 10, Col) = "Pomme"
                    .Cells(Lig + 11, Col) = "1,00"

                    'Fériés. Dans les colonnes B à  H incluses, sur chaque ligne Jour férié, il va taper le nom du jour férié selon la Datj, si ce jour correspond à un jour férié.
                    For J = 1 To 13
                    'DataBodyRange : Cette 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.
                        If Datj = Range("TabJoursFériés").ListObject.ListColumns("Date jour férié").DataBodyRange(J) Then
                            .Cells(Lig + 12, Col) = "JF" & Format(J, "00")
                            .Cells(Lig + 13, Col) = Range("TabJoursFériés").ListObject.ListColumns("Nom jour férié").DataBodyRange(J)
                        End If
                     Next J
                End If
                'Incrémentations pour menu suivant.
                nm = nm + 1
                Datj = Datj + 1
                If Year(Datj) > Range("Année_en_Cours").Value Then Exit For
            Next Col
        Next Lig
    End With
End Sub

Cela ne donne pas le résultat souhaité : pour MVWE, il ne me faut que les samedis et les dimanches sur huit colonnes avec une date sous la forme dddd d mmmm yyyy.

17menus-arturo.xlsm (253.11 Ko)

Cela ne donne pas le résultat souhaité : pour MVWE, il ne me faut que les samedis et les dimanches sur huit colonnes avec une date sous la forme dddd d mmmm yyyy.

Cela ne donne pas le résultat souhaité car les explications ne sont pas toujours très évidentes pour moi.

Alors voici la modification, tous les samedis et dimanches sur 8 colonnes.

Sub GénPropMVMWE()
'Déclaration des variables. nm = numéro menu. J représente le nombre de lignes, excepté la ligne titre;le décompte commence donc à la ligne 2. DatJ = Date du jour.

Dim Lig As Long, Col As Long, nm As Long, J As Long
Dim Datj As Date
    ' ScreenUpdating True si la mise à jour de l’écran est activée. Type de données Boolean en lecture-écriture.
    Application.ScreenUpdating = False

    'Initialisations. WorksheetFunction.WorkDay : Renvoie un nombre représentant une date qui est le nombre de jours ouvrés indiqué avant ou après une date (date de début).
    'Les jours ouvrés excluent les week-ends et les jours de congés. Utilisez la fonction WORKDAY pour exclure les week-ends et les jours de congés lorsque vous calculez les
    'dates d'échéance des factures, les heures de livraison attendues ou le nombre de jours ouvrés effectués. 12 représente le nombre de mois, 31 équivaut au nombre de jours
    'maximum d'un mois. nm =1 : le numéro menu commence à 1.
    Datj = WorksheetFunction.WorkDay(DateSerial(Range("Année_en_Cours") - 1, 12, 31), 1)
    nm = 1

    'Remplissage. Worksheet("Propositions menus VMWE") : il s'agit de la feuille dont le nom est indiqué à l'intérieur de la parenthèse.
    With Worksheets("Propositions menus VMWE")
        'B:H : représente les colonnes de la feuille Propositions menus midi journaliers qui seront à remplir. ClearContents : Masquer toutMéthode ClearContents telle qu'elle s'ap-
        'plique à l'objet.
        'Range. Efface les formules de la plage.
        .Range("B2:J901").ClearContents
        .Range("A1").Resize(901, 8).Borders.Weight = xlThick 'Bordure épaisse plage complète
        'For  Lig = 1 to 901 Step 17 : 1 to 901 : reprense le nombre de lignes à remplir (y compris la ligne titre). Step : Le mot clé Step est employé dans les contextes suivants :
        'For...Next, instruction.
        For Lig = 1 To 901 Step 17
            .Cells(Lig + 0, 1) = "Propositions menus journaliers"
            'C'est le centrage sur plusieurs colonnes qui inhibe l'affichage des bordures intérieures. Centrer sur toutes les colonnes.
            .Cells(Lig + 0, 1).Resize(1, 8).HorizontalAlignment = xlCenterAcrossSelection
            .Cells(Lig + 1, 1) = "Numéro du menu"
            .Cells(Lig + 2, 1) = "Date du menu"
            .Cells(Lig + 3, 1) = "Référence légume"
            .Cells(Lig + 4, 1) = "Légume"
            .Cells(Lig + 5, 1) = "Quantité légume"
            .Cells(Lig + 6, 1) = "Référence légume 2)"
            .Cells(Lig + 7, 1) = "Légume 2"
            .Cells(Lig + 8, 1) = "Quantité légume 2"
            .Cells(Lig + 9, 1) = "Référence viande"
            .Cells(Lig + 10, 1) = "Viande"
            .Cells(Lig + 11, 1) = "Quantité viande"
            .Cells(Lig + 12, 1) = "Référence dessert"
            .Cells(Lig + 13, 1) = "Dessert"
            .Cells(Lig + 14, 1) = "Quantité dessert"
            .Cells(Lig + 15, 1) = "Référence jour férié"
            .Cells(Lig + 16, 1) = "Jour férié"
            'For Col = 2 to 8 : Pour les colonnes 2 à 8 (la colonne A n'est pas prise en compte, le décompte commence donc à la colonne B jusqu'à la colonne H incluses.
            For Col = 2 To 8
                'En tête. À la ligne 1 (nom compris la ligne titre), va écrire MJ et formater le numéro menu (nm);À la ligne 2, (immédiatement après la précédente), va écrire la date
                'du jour.
                If WorksheetFunction.Weekday(Datj, 2) > 5 Then
                    .Cells(Lig + 1, Col) = "MJ" & Format(nm, "00")
                    .Cells(Lig + 2, Col) = Format(Datj, "dddd dd mmmm yyyy")

                    'Légume. Dans les colonnes B à  H incluses, sur chaque ligne Référence légume, il va taper LMJ. Mêmes colonnes, les deux lignes suivantes (Légume et Quantité lé-
                    'gume) vont rester vides.
                    .Cells(Lig + 3, Col) = "LMJ"
                    .Cells(Lig + 4, Col) = ""
                    .Cells(Lig + 5, Col) = ""

                    'Viande. Dans les colonnes B à  H incluses, sur chaque ligne Référence viande, il va taper VMJ. Mêmes colonnes, les deux lignes suivantes (Viande et Quantité
                    'viande) vont rester vides.
                    .Cells(Lig + 6, Col) = "VMJ"
                    .Cells(Lig + 7, Col) = ""
                    .Cells(Lig + 8, Col) = "100,00"

                    'Dessert. Dans les colonnes B à  H incluses, sur chaque ligne, il va les remplir selon les instructions données..
                    .Cells(Lig + 9, Col) = "DMR01"
                    .Cells(Lig + 10, Col) = "Pomme"
                    .Cells(Lig + 11, Col) = "1,00"

                    'Fériés. Dans les colonnes B à  H incluses, sur chaque ligne Jour férié, il va taper le nom du jour férié selon la Datj, si ce jour correspond à un jour férié.
                    For J = 1 To 13
                    'DataBodyRange : Cette 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.
                        If Datj = Range("TabJoursFériés").ListObject.ListColumns("Date jour férié").DataBodyRange(J) Then
                            .Cells(Lig + 12, Col) = "JF" & Format(J, "00")
                            .Cells(Lig + 13, Col) = Range("TabJoursFériés").ListObject.ListColumns("Nom jour férié").DataBodyRange(J)
                        End If
                     Next J
                Else
                    Col = Col - 1
                End If
                'Incrémentations pour menu suivant.
                nm = nm + 1
                Datj = Datj + 1
                If Year(Datj) > Range("Année_en_Cours").Value Then Exit For
            Next Col
        Next Lig
    End With
End Sub

Merci Arturo, c'est presque bon. Le numéro du menu du premier jour ne débute pas à 01.

25menus-arturo.xlsm (248.46 Ko)

Ok, je pensais que cela devait correspondre au numéro de la feuille "Propositions menus journaliers", alors dans ce cas, il suffit de déplacer le la ligne suivante:

                    nm = nm + 1

et la mettre avant le "Else"

le code en entier:

Sub GénPropMVMWE() 'Selon Arturo83.
'Déclaration des variables. nm = numéro menu. J représente le nombre de lignes, excepté la ligne titre;le décompte commence donc à la ligne 2. DatJ = Date du jour.

Dim Lig As Long, Col As Long, nm As Long, J As Long
Dim Datj As Date
    ' ScreenUpdating True si la mise à jour de l’écran est activée. Type de données Boolean en lecture-écriture.
    Application.ScreenUpdating = False

    'Initialisations. WorksheetFunction.WorkDay : Renvoie un nombre représentant une date qui est le nombre de jours ouvrés indiqué avant ou après une date (date de début).
    'Les jours ouvrés excluent les week-ends et les jours de congés. Utilisez la fonction WORKDAY pour exclure les week-ends et les jours de congés lorsque vous calculez les
    'dates d'échéance des factures, les heures de livraison attendues ou le nombre de jours ouvrés effectués. 12 représente le nombre de mois, 31 équivaut au nombre de jours
    'maximum d'un mois. nm =1 : le numéro menu commence à 1.
    Datj = WorksheetFunction.WorkDay(DateSerial(Range("Année_en_Cours") - 1, 12, 31), 1)
    nm = 1

    'Remplissage. Worksheet("Propositions menus VMWE") : il s'agit de la feuille dont le nom est indiqué à l'intérieur de la parenthèse.
    With Worksheets("Propositions menus VMWE")
        'B:H : représente les colonnes de la feuille Propositions menus midi journaliers qui seront à remplir. ClearContents : Masquer toutMéthode ClearContents telle qu'elle s'ap-
        'plique à l'objet.
        'Range. Efface les formules de la plage.
        .Range("B2:J901").ClearContents
        .Range("A1").Resize(901, 8).Borders.Weight = xlThick 'Bordure épaisse plage complète
        'For  Lig = 1 to 901 Step 17 : 1 to 901 : reprense le nombre de lignes à remplir (y compris la ligne titre). Step : Le mot clé Step est employé dans les contextes suivants :
        'For...Next, instruction.
        For Lig = 1 To 901 Step 17
            .Cells(Lig + 0, 1) = "Propositions menus journaliers"
            'C'est le centrage sur plusieurs colonnes qui inhibe l'affichage des bordures intérieures. Centrer sur toutes les colonnes.
            .Cells(Lig + 0, 1).Resize(1, 8).HorizontalAlignment = xlCenterAcrossSelection
            .Cells(Lig + 1, 1) = "Numéro du menu"
            .Cells(Lig + 2, 1) = "Date du menu"
            .Cells(Lig + 3, 1) = "Référence légume"
            .Cells(Lig + 4, 1) = "Légume"
            .Cells(Lig + 5, 1) = "Quantité légume"
            .Cells(Lig + 6, 1) = "Référence légume 2)"
            .Cells(Lig + 7, 1) = "Légume 2"
            .Cells(Lig + 8, 1) = "Quantité légume 2"
            .Cells(Lig + 9, 1) = "Référence viande"
            .Cells(Lig + 10, 1) = "Viande"
            .Cells(Lig + 11, 1) = "Quantité viande"
            .Cells(Lig + 12, 1) = "Référence dessert"
            .Cells(Lig + 13, 1) = "Dessert"
            .Cells(Lig + 14, 1) = "Quantité dessert"
            .Cells(Lig + 15, 1) = "Référence jour férié"
            .Cells(Lig + 16, 1) = "Jour férié"
            'For Col = 2 to 8 : Pour les colonnes 2 à 8 (la colonne A n'est pas prise en compte, le décompte commence donc à la colonne B jusqu'à la colonne H incluses.
            For Col = 2 To 8
                'En tête. À la ligne 1 (nom compris la ligne titre), va écrire MJ et formater le numéro menu (nm);À la ligne 2, (immédiatement après la précédente), va écrire la date
                'du jour.
                If WorksheetFunction.Weekday(Datj, 2) > 5 Then
                    .Cells(Lig + 1, Col) = "MJ" & Format(nm, "00")
                    .Cells(Lig + 2, Col) = Format(Datj, "dddd dd mmmm yyyy")

                    'Légume. Dans les colonnes B à  H incluses, sur chaque ligne Référence légume, il va taper LMJ. Mêmes colonnes, les deux lignes suivantes (Légume et Quantité lé-
                    'gume) vont rester vides.
                    .Cells(Lig + 3, Col) = "LMJ"
                    .Cells(Lig + 4, Col) = ""
                    .Cells(Lig + 5, Col) = ""

                    'Viande. Dans les colonnes B à  H incluses, sur chaque ligne Référence viande, il va taper VMJ. Mêmes colonnes, les deux lignes suivantes (Viande et Quantité
                    'viande) vont rester vides.
                    .Cells(Lig + 6, Col) = "VMJ"
                    .Cells(Lig + 7, Col) = ""
                    .Cells(Lig + 8, Col) = "100,00"

                    'Dessert. Dans les colonnes B à  H incluses, sur chaque ligne, il va les remplir selon les instructions données..
                    .Cells(Lig + 9, Col) = "DMR01"
                    .Cells(Lig + 10, Col) = "Pomme"
                    .Cells(Lig + 11, Col) = "1,00"

                    'Fériés. Dans les colonnes B à  H incluses, sur chaque ligne Jour férié, il va taper le nom du jour férié selon la Datj, si ce jour correspond à un jour férié.
                    For J = 1 To 13
                    'DataBodyRange : Cette 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.
                        If Datj = Range("TabJoursFériés").ListObject.ListColumns("Date jour férié").DataBodyRange(J) Then
                            .Cells(Lig + 12, Col) = "JF" & Format(J, "00")
                            .Cells(Lig + 13, Col) = Range("TabJoursFériés").ListObject.ListColumns("Nom jour férié").DataBodyRange(J)
                        End If
                     Next J
                    nm = nm + 1
                Else
                    Col = Col - 1
                End If
                'Incrémentations pour menu suivant.
                Datj = Datj + 1
                If Year(Datj) > Range("Année_en_Cours").Value Then Exit For
            Next Col
        Next Lig
    End With
End Sub
Rechercher des sujets similaires à "fichier menus xlsm propositions journaliers"