Feuille propositions menus midi retrait : créer une macro pour les sauts de
- Messages
- 1'214
- Excel
- 2024 FR
- Inscrit
- 18/07/2014
- Emploi
- Retraité fonction publique territoriale
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;
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 SubCdlt
Ps: Pensez à passer en "RESOLU" le fil "Fenêtres Espions, Variables locales, Exécution", si les réponses correspondent bien à vos attentes.
- Messages
- 1'214
- Excel
- 2024 FR
- Inscrit
- 18/07/2014
- Emploi
- Retraité fonction publique territoriale
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.
- Messages
- 1'214
- Excel
- 2024 FR
- Inscrit
- 18/07/2014
- Emploi
- Retraité fonction publique territoriale
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).
Bonjour à tous,
@buddget :
Il vaut mieux travailler avec le nom de code de la feuille.
- J'ai donc modifier
sh04verssh_PropositionMidi - J'ai supprimer les accents sur les noms de variables.
- J'ai modifier quelques erreurs de frappe (Du moins je pense).
NombreGroupes = -LastRow \ NombreLignesversNombreGroupes = LastRow \ NombreLignesLigneSaut = (I * NombreLignes) = 1versLigneSaut = (I * NombreLignes) + 1
- J'ai ajouter un module
GlobalConstset une constantePUBLIC_HOLIDAY_VALUEqui correspond à "jour férié".
Voilà cela devrait faire le job, maintenant
Bonjour à tous,
Mêmes remarques que Jean-Paul
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.
- Messages
- 1'214
- Excel
- 2024 FR
- Inscrit
- 18/07/2014
- Emploi
- Retraité fonction publique territoriale
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)
- Messages
- 1'214
- Excel
- 2024 FR
- Inscrit
- 18/07/2014
- Emploi
- Retraité fonction publique territoriale
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.
- Messages
- 1'214
- Excel
- 2024 FR
- Inscrit
- 18/07/2014
- Emploi
- Retraité fonction publique territoriale
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.
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 WithC'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 IVos 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.
- Messages
- 1'214
- Excel
- 2024 FR
- Inscrit
- 18/07/2014
- Emploi
- Retraité fonction publique territoriale
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 Subun 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- Messages
- 1'214
- Excel
- 2024 FR
- Inscrit
- 18/07/2014
- Emploi
- Retraité fonction publique territoriale
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)
- Messages
- 1'214
- Excel
- 2024 FR
- Inscrit
- 18/07/2014
- Emploi
- Retraité fonction publique territoriale
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
- Messages
- 1'214
- Excel
- 2024 FR
- Inscrit
- 18/07/2014
- Emploi
- Retraité fonction publique territoriale
oui mais je ne suis toujours pas sur 10 pages