Feuille propositions menus midi retrait : créer une macro pour les sauts de

Bonjour à toutes et à tous,

C'est fatiguant de créer manuellement les sauts de page pour la feuille propositions menus midi retrait. Merci de me proposer une macro qui permettra de créer les sauts de page une seule fois, puisque chaque année, ce sera la même présentation. Cela me permettra de créer la macro des sauts de page pour les deux autres feuilles propositions. Peut-être, aura-t-il lieu de faire un appel à cette macro dans le code de la procédure Sub GénérerPropositionsMMR().

Bonnes fin de soirée, nuit et continuation à toutes et à tous. Prenez bien soin de vous;

15menus-2026.xlsm (292.75 Ko)

Bonjour,

Voici une macro qui placera les sauts de page tous les 3 tableaux. elle ne s'applique uniquement qu'aux feuilles "Propositions.....".

Pour la lancer, soit vous mettez un bouton auquel vous affectez cette macro dans chaque feuille "Propositions..." soit vous l'appelez à partir des macros qui préparent ces feuilles, par exemple dans la macro Sub GénérerPropositionsMMR().

Sub Preparation_pour_Impression()
    Dim Sh As Worksheet
    Dim DerLig_Sh As Long, Nb_Lig As Long, i As Long
    Dim Nb_Groupes As Long, Ligne_Saut As Long
    Dim X As Range

    Set Sh = ActiveSheet

    'Vérifie que c’est bien une feuille de type "Propositions"
    If Left(Sh.Name, 12) <> "Propositions" Then Exit Sub

    'Dernière ligne de la feuille
    DerLig_Sh = Sh.Cells(Sh.Rows.Count, "A").End(xlUp).Row

    'Déterminer le nombre de lignes qui constitue chaque tableau (jusqu’à "Jour férié")
    With Sh.Range("A1:A" & DerLig_Sh)
        Set X = .Find("Jour férié", lookat:=xlWhole)
        If Not X Is Nothing Then
            Nb_Lig = X.Row 'Nombre de lignes par tableau
        Else
            MsgBox "Impossible de déterminer la taille d’un tableau.", vbExclamation
            Exit Sub
        End If
    End With

    'Effacer les anciens sauts de page
    Sh.ResetAllPageBreaks

    'Déterminer combien de tableaux il y a
    Nb_Groupes = DerLig_Sh \ Nb_Lig  'Division entière

    'Boucle pour insérer un saut de page tous les 3 tableaux
    For i = 1 To Nb_Groupes
        If i Mod 3 = 0 Then
            Ligne_Saut = (i * Nb_Lig) + 1
            If Ligne_Saut <= DerLig_Sh Then
                Sh.HPageBreaks.Add Before:=Sh.Cells(Ligne_Saut, "A")
            End If
        End If
    Next i

    'Définir la zone d’impression
    Sh.PageSetup.PrintArea = "A1:H" & DerLig_Sh

    Set Sh = Nothing
    Set X = Nothing
End Sub

Cdlt

Ps: Pensez à passer en "RESOLU" le fil "Fenêtres Espions, Variables locales, Exécution", si les réponses correspondent bien à vos attentes.

Bonjour Arturo83,

Toujours aussi rapide, compétent, courtois et explicite pour m'aider. Merci pour cette macro. Je vais la tester en fin de matinée.

Bonjour Arturo83,

J'ai changé le nom des dim et j'en ai tenu compte dans l'écriture du code. Il semblerait que les sauts de page ne s'effectuent pas tous les trois tableaux pour propositions meus midi retrait. Merci de m'apporter votre aide. Pourquoi choisir 6 alors que sur une feuille il y a quatre tableaux (c'est bon) ? Les sauts de page s'effectuent bien mais toutes les colonnes n'apparaissent pas sur une seule page (via aperçu).

17menus.xlsm (297.93 Ko)

Bonjour à tous,

@buddget :

Il vaut mieux travailler avec le nom de code de la feuille.

  1. J'ai donc modifier sh04 vers sh_PropositionMidi
  2. J'ai supprimer les accents sur les noms de variables.
  3. J'ai modifier quelques erreurs de frappe (Du moins je pense).
    1. NombreGroupes = -LastRow \ NombreLignes vers NombreGroupes = LastRow \ NombreLignes
    2. LigneSaut = (I * NombreLignes) = 1 vers LigneSaut = (I * NombreLignes) + 1
  4. J'ai ajouter un module GlobalConsts et une constante PUBLIC_HOLIDAY_VALUE qui correspond à "jour férié".

Voilà cela devrait faire le job, maintenant

15menus.xlsm (244.49 Ko)

Bonjour à tous,

Mêmes remarques que Jean-Paulconcernant 2 lignes:

Supprimez le signe "-" devant "Derniere_Ligne_Sh" sur la ligne: Nombre_Groupes =- Derniere_Ligne_Sh \ Nombre_Lignes

et remplacez le signe "=" devant le "1" par le signe "+" sur la ligne: Ligne_Saut = (I * Nombre_Lignes) = 1

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

Quant aux sauts de pages et l'intégration de toutes les colonnes sur la même feuille, il semble que ce ne soit pas compatible. ou c'est l'un ou c'est l'autre mais pas les 2 en mêmes temps. Perso, j'abandonnerai le saut de pages au profit de l'intégration de toutes les colonnes.

image

BonjourArturo83,

Dans le fichier de mon message d'origine de ce fil, j'ai créé les sauts de pages manuellement et j'ai sélectionné les colonnes A à H incluses, lignes 1 à 532 incluses pour l'impression, police : Arial, Style : Gras et taille : 7 et quatre tableaux sont imprimés sur un côté de feuille avec les huit colonnes; ce qui donne au total 10 pages.

Pour ce qui des rectifications à faire sur les lignes que vous avez mentionnées, je ferai cela cette après-midi et je testerai.

Dans votre message, le 1 représente Imprimer, 2 pour la mise en page, 3 échelle dans l'onglet Mise en page : il faut modifier les chiffres d'origine ?

Oui, les chiffres en rouge donnent l'ordre des actions à faire pour paramétrer l'impression, avec toutes les colonnes sur la même feuille et sur 10 feuilles (valeur sont le nombre doit être égal ou supérieur au nombre de feuille réel, excel se chargera d'imprimer juste le nombre de feuilles nécessaires)

OK. En ce qui concerne le fichier de Jean-Paul d'hier, impossible de travailler dessus : risque de sécurité : Microsoft a bloqué l'exécution des macros car la source de ce fichier n'est pas approuvée. Clic sur en savoir plus : une macro potentiellement dangereuse a été b loquée.

une question : la macro d'Arturo83 pour les sauts de page : si j'ai bien compris, cette macro sert pour les trois feuilles propositions, la macro détermine elle-même où placer les sauts de page : après le quatrième tableau, après le troisième tableau, etc. Comment fait-elle ?

la macro vérifie que le nom de la feuille commence par "Propositions" si c'est la cas la macro continue jusqu'au bout sinon, elle ne va pas plus loin et quitte le programme.

et si le nom de la feuille commence bien par propositions, comment décide-t-il que les sauts de page doivent être placés à tel endroit d'une part, et qui peuvent être différents d'une feuille à l'autre d'autre part ?

Pour le fichier de Jean-Paul, j'ai fait en sorte de ne plus avoir le message de blocage : j'ai fait un aperçu et hélas il est toujours sur 20 pages au lieu de 10 pages, problème donc toujours pas résolu. Comment procéder pour l'approuver, je ne me souviens pas ?

Bonjour à tous,

En ce qui concerne le fichier de Jean-Paul d'hier, impossible de travailler dessus : risque de sécurité : Microsoft a bloqué l'exécution des macros car la source de ce fichier n'est pas approuvée.

Nous en avons parler et reparler sur ce site, Si vous fournissez un fichier Zip pas de déblocage nécessaire, par contre pour un classeur ".xlm" vous devez impérativement le débloquer. Pour cela faites un clic droit sur le fichier, puis clic sur propriétés, enfin cocher débloquer.

image

la macro détermine elle-même où placer les sauts de page : après le quatrième tableau, après le troisième tableau, etc. Comment fait-elle ?

' // Calcul du nombre de ligne de chaque tableau    
With Sh.Range("A1:A" & Dernière_Ligne_Sh)
        Set X = .Find("Jour férié", lookat:=xlWhole)
        If Not X Is Nothing Then
            Nombre_Lignes = X.Row 'Nombre de lignes par tableau.
        Else
            MsgBox "Impossible de détermner la taille d'un tableau.", vbExclamation
                Exit Sub
        End If
End With

C'est ce bout de code qui se charge de calculer la taille des tableaux. En colonne "A" chaque tableau se termine par la ligne "jour férié" il est donc facile de connaître la taille de chaque blocs, puis d'y insérer un saut de page.

Pour l'insertion du saut de page c'est la boucle de dessous qui s'en charge. (On part sur le principe que trois tableaux peuvent entrer sur une feuille.)

    'Boucle pour insérer un saut de page tous les trois tableaux.
    For I = 1 To Nombre_Groupes
        If I Mod 3 = 0 Then
            Ligne_Saut = (I * Nombre_Lignes) + 1
            If Ligne_Saut <= Dernière_Ligne_Sh Then
                Sh.HPageBreaks.Add before:=Sh.Cells(Ligne_Saut, "A")
            End If
        End If
    Next I

Vos tableaux étant tous similaires chacun deux commence par une ligne vide donc nous aurions pu démarrer la recherche d'une ligne vide à partir de la ligne 2 puis d'y insérer un saut de page.

P.S. Dans mon précédent post je parlais de remplacer le nom de la feuille par son nom de code. Pour pouvoir travailler sur une des trois feuilles de "Proposition", nous devons soit vérifier son nom de code avec la fonction LIKE soit utiliser une variable de type Excel.Worksheet comme c'est fait dans votre code.

Bonjour Jean-Paul,

Le fichier d'origine était un fichier xlsm, est-il soumis au déblocage ? Lorsque vous téléchargez mon fichier, êtes-vous confronté à ce problème ?

Que faut-il faire pour que la feuille soit imprimée sur 10 pages et non 20 pages ? De plus, dans votre fichier d'hier, feuille Propositions menus midi retrait, entre les colonnes D et E, il y a un espace blanc inutile, à mon avis.

Dans votre fichier ! LigneSaut = (I * NombreLignes) cela ne correspond pas à qui est écrit plus haut.

re,

Sub M_print1()
     M_Preparation Sheets("Propositions menus midi retrait"), 90     'adapter le zoom !!!
End Sub

Sub M_print2()
     M_Preparation Sheets("Propositions menus journaliers"), 50
End Sub

Sub M_Preparation(sh As Worksheet, Optional iZoom As Integer = 0)
     Dim Arr, iMax, i

     If iZoom = 0 Then iZoom = 100
     With sh
          Application.Goto .Cells(1)
          .ResetAllPageBreaks
          .VPageBreaks.Add Before:=.Cells(1, "E")
          iMax = Evaluate("max(if(len(A1:A1000),row(A1:A1000),0))")
          Arr = Evaluate("if(A1:A1000=""Numéro du menu"",row(A1:A1000),1E7)")
          For i = 4 To 1000 Step 3
               Ligne = Application.Small(Arr, i)
               If Ligne < Rows.Count Then .HPageBreaks.Add Before:=.Cells(Ligne - 1, "A") Else Exit For
          Next

          With .PageSetup
               .PrintArea = Range("A1:H" & iMax).Address
               .Zoom = iZoom
               .CenterHorizontally = True
               .CenterVertically = True
               .Orientation = xlLandscape
               .FitToPagesWide = 2
               .FitToPagesTall = (i - 1) \ 3
               .LeftHeader = ""
               .CenterHeader = ""
               .RightHeader = ""
               .LeftFooter = ""
               .CenterFooter = ""
               .RightFooter = ""
               .LeftMargin = 0
               .RightMargin = 0
               .TopMargin = 0
               .BottomMargin = 0
               .HeaderMargin = 0
               .FooterMargin = 0
               .Order = xlOverThenDown
          End With
          .PrintPreview
     End With
End Sub

un essai,

Re,

Tous les fichiers sont soumis à ce contrôle d'Excel, pour qu'ils puissent s'ouvrir normalement il faut :

  • Soit le débloquer (Méthode cité précédemment)
  • Soit le copier dans un répertoire qui doit-être approuvé (Ce répertoire peut être ajouté dans les options de confidentialité d'Excel).
  • Soit être signé numériquement (Valable pour des tests sur une machine pour les certificats non payant).

Que faut-il faire pour que la feuille soit imprimée sur 10 pages et non 20 pages ?

Vous avez-eu la réponse à cette question (lisez bien les posts) Vous pouvez néanmoins faire un test en ajoutant une commande à la fin de la macro qui va ajuster les colonnes au minimum de leurs tailles, et mettre toutes les colonnes sur une page en effectuant un zoom.

Le code deviendra :

Sub Sauts_De_Page_Propositions_Menus_Midi_Retrait()
    Dim Sh As Worksheet
    Set Sh = ActiveSheet

    With Sh
        ' // Vérifie que c'est bien une feuille de type "Propositions".
        If Left(.Name, 12) <> "Propositions" Then Exit Sub ' // Utiliser plutôt une constante dans un module de constantes pour "Propositions"

        ' // Dernière ligne de la feuille.
        Dim Dernière_Ligne_Sh As Long
        Dernière_Ligne_Sh = .Cells(Sh.Rows.Count, "A").End(xlUp).Row

        ' // Déterminer le nombre de lignes qui constituent chaque tableau (jusqu'à "Jour férié)
        With .Range("A1:A" & Dernière_Ligne_Sh)
            Dim X As Range
            Set X = .Find("Jour férié", lookat:=xlWhole)
            If Not X Is Nothing Then
                Dim Nombre_Lignes As Long
                Nombre_Lignes = X.Row                       'Nombre de lignes par tableau.
            Else
                MsgBox "Impossible de détermner la taille d'un tableau.", vbExclamation
                Exit Sub
            End If
        End With
        ' // Effacer les anciens sauts de page.
        .ResetAllPageBreaks

        ' // Déterminer combien de tableaux il y a.
        Dim Nombre_Groupes As Long
        Nombre_Groupes = Dernière_Ligne_Sh \ Nombre_Lignes  'Division entière.

        ' // Boucle pour insérer un saut de page tous les trois tableaux.
        Dim I As Long
        For I = 1 To Nombre_Groupes
            If I Mod 3 = 0 Then
                Dim Ligne_Saut As Long
                Ligne_Saut = (I * Nombre_Lignes) + 1
                If Ligne_Saut <= Dernière_Ligne_Sh Then
                    .HPageBreaks.Add before:=.Cells(Ligne_Saut, "A")
                End If
            End If
        Next I
        ' // Ajuster les colonnes
        .Columns("A:H").EntireColumn.AutoFit

        ' // Définir les options d'impression
        Application.PrintCommunication = False
        With .PageSetup
            .CenterHorizontally = True
            .CenterVertically = True
            .ScaleWithDocHeaderFooter = True
            .AlignMarginsHeaderFooter = True
            .CenterFooter = "&P/&N"
            .LeftMargin = Application.InchesToPoints(0)
            .RightMargin = Application.InchesToPoints(0)
            .TopMargin = Application.InchesToPoints(0)
            .BottomMargin = Application.InchesToPoints(0)
            .HeaderMargin = Application.InchesToPoints(0)
            .FooterMargin = Application.InchesToPoints(0.590551181102362)
            .PrintHeadings = False
            .PrintGridlines = True
            .FitToPagesWide = 1
            .FitToPagesTall = 0
            .PrintArea = "A1:H" & Dernière_Ligne_Sh
        End With
    End With
    Application.PrintCommunication = True

    ' // Définir la zone d'impression.
    If Not Sh Is Nothing Then Set Sh = Nothing
    If Not X Is Nothing Then Set X = Nothing
End Sub

Vous avez-eu la réponse à cette question (lisez bien les posts) : désolé, je n'ai rien vu qui répondait au problème. Merci de m'indiquer le ou les post (s) concernés.

re,

les macros "M_Print1" à "M_Print3", il faut peut-être ajuster le zoom (dernier chiffre)

10menus-1.xlsm (255.58 Ko)

Bonsoir BsAlv,

Problème toujours pas résolu. Maintenant, il est à 26 pages au lieu de 10. 90, 50, 70 : À quoi correspondent ces chiffres ?

Re,

Avez-vous testé ma proposition ?

Pour le post c'est ici : https://forum.excel-pratique.com/s/goto/1259604

oui mais je ne suis toujours pas sur 10 pages

Rechercher des sujets similaires à "feuille propositions menus midi retrait creer macro sauts"