Problème de mise en page : orientation et format
Bonjour tous le monde,
Je me pose devant un nouveau problème : j'ai réalisé une macro pour mettre un forme tout un tas de tableaux :
1. je supprime les tableaux que je ne veux pas en les masquant
2. je fais la mise en page des tableaux (qui ne bougeront jamais)
3. je fais les sauts de pages que je souhaites (qui ne bougeront jamais)
4. j'appelle deux autres macros qui sont des imputbox : choix pour l'orientation et le format.
5. Aperçu de l'impression
Mais voilà, malgré que l'appel fonctionne et que Excel ne me met aucun message d'erreur, le format et l'orientation ne marche pas. Par exemple j'aurais beau mettre portrait, il est en paysage automatiquement et n'en bouge.
Quand j'essaye les deux macros à part dans un autre classeur, ils fonctionnent mais dès que j'utilise la macro "miseenpagefinaltest" ça ne fonctionne plus. Je suppose que c'est à cause de cela, mais je n'arrive pas à trouver de solution.
Voici mes macros :
Sub miseenpagefinaltest()
' Suppression des tableaux que je ne veux pas
Rows("1273:1315").Select
Selection.EntireRow.Hidden = True
Rows("1318:1677").Select
Selection.EntireRow.Hidden = True
' mise en page format impression
Application.PrintCommunication = True
ActiveSheet.PageSetup.PrintArea = "$A$6:$M$1900"
Application.PrintCommunication = False
With ActiveSheet.PageSetup
.LeftHeader = ""
.CenterHeader = ""
.RightHeader = ""
.LeftFooter = "&Z&F - Sheet : &A"
.CenterFooter = ""
.RightFooter = "&D - &T"
.LeftMargin = Application.InchesToPoints(0.25)
.RightMargin = Application.InchesToPoints(0.25)
.TopMargin = Application.InchesToPoints(0.75)
.BottomMargin = Application.InchesToPoints(0.75)
.HeaderMargin = Application.InchesToPoints(0.3)
.FooterMargin = Application.InchesToPoints(0.3)
.PrintHeadings = False
.PrintGridlines = False
.PrintComments = xlPrintNoComments
.PrintQuality = 600
.CenterHorizontally = True
.CenterVertically = True
.Draft = False
.FirstPageNumber = xlAutomatic
.Order = xlDownThenOver
.Orientation = xlLandscape
.Orientation = xlPortrait
.BlackAndWhite = False
.Papersize = xlPaperA4
.Papersize = xlPaperA3
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = False
.PrintErrors = xlPrintErrorsDisplayed
.OddAndEvenPagesHeaderFooter = False
.DifferentFirstPageHeaderFooter = False
.ScaleWithDocHeaderFooter = True
.AlignMarginsHeaderFooter = True
.EvenPage.LeftHeader.Text = ""
.EvenPage.CenterHeader.Text = ""
.EvenPage.RightHeader.Text = ""
.EvenPage.LeftFooter.Text = ""
.EvenPage.CenterFooter.Text = ""
.EvenPage.RightFooter.Text = ""
.FirstPage.LeftHeader.Text = ""
.FirstPage.CenterHeader.Text = ""
.FirstPage.RightHeader.Text = ""
.FirstPage.LeftFooter.Text = ""
.FirstPage.CenterFooter.Text = ""
.FirstPage.RightFooter.Text = ""
End With
' suppression des sauts de pages précédents
ActiveSheet.ResetAllPageBreaks
' insertion des nouveaux sauts de pages
ActiveSheet.Rows(101).PageBreak = xlPageBreakManual
ActiveSheet.Rows(191).PageBreak = xlPageBreakManual
ActiveSheet.Rows(281).PageBreak = xlPageBreakManual
ActiveSheet.Rows(371).PageBreak = xlPageBreakManual
ActiveSheet.Rows(461).PageBreak = xlPageBreakManual
ActiveSheet.Rows(551).PageBreak = xlPageBreakManual
ActiveSheet.Rows(641).PageBreak = xlPageBreakManual
ActiveSheet.Rows(731).PageBreak = xlPageBreakManual
ActiveSheet.Rows(821).PageBreak = xlPageBreakManual
ActiveSheet.Rows(911).PageBreak = xlPageBreakManual
ActiveSheet.Rows(1001).PageBreak = xlPageBreakManual
ActiveSheet.Rows(1091).PageBreak = xlPageBreakManual
ActiveSheet.Rows(1181).PageBreak = xlPageBreakManual
ActiveSheet.Rows(1271).PageBreak = xlPageBreakManual
ActiveSheet.Rows(1768).PageBreak = xlPageBreakManual
ActiveSheet.Rows(1858).PageBreak = xlPageBreakManual
' appelle des macros pour l'orientation et le format
Call Orientation
Call Papersize
End SubSub Orientation()
' orientation de la page : choix entre paysage ou portrait
Dim resultat As String
resultat = InputBox("paysage ou portrait")
If resutat = paysage Then
ActiveSheet.PageSetup.Orientation = xlLandscape
ElseIf resultat = portrait Then
ActiveSheet.PageSetup.Orientation = xlPortrait
Else: MsgBox "erreur dans votre saisie"
End If
End SubSub Papersize()
' format de la page : choix entre A3 ou A4
resultat = InputBox("A3 ou A4")
If resutat = A3 Then
ActiveSheet.PageSetup.Papersize = xlPaperA3
ElseIf resultat = A4 Then
ActiveSheet.PageSetup.Papersize = xlPaperA4
Else: MsgBox "erreur dans votre saisie"
End If
' aperçu de l'impression
ActiveSheet.PrintPreview
End SubJe vous remercie par avance de votre aide !
Bonjour,
Vraiment très pénible à lire !
Une suggestion :
- supprimer les Select (toujours inutiles...)
- éliminer les paramètres que tu ne définis pas et qui n'ont nul besoin d'être définis à la valeur qu'ils ont déjà !
- éliminer la double définition contradictoire de Orientation et PaperSize... !
- la remplacer par l'appel à tes procédures de définition de ces paramètres, en les érigeant en proc. Function (au lieu de Sub) de façon à leur faire renvoyer la valeur choisie dans la procédure de mise en page...
- utiliser une boucle pour définir les sauts de page...
Et relis ta proc. Orientation ! paysage et portrait y sont (de fait) des variables non déclarées et non initialisées, donc vides, sans oublier resutat qui (contrairement à resultat) est aussi une variable non déclarée et non initialisée. Donc :
la condition resutat = paysage équivaut à ""="" ou 0=0, soit elle est toujours VRAIE !!! L'orientation sera ainsi toujours définie en paysage !
Cordialement.
Je sais, c'était un peu pénible à faire aussi
J'avais déjà essayé d'éliminer la double définition contradictoire de Orientation et PaperSize mais même avec ça ne marchait pas. J'aurais voulu faire un code comme ça
.Orientation = call Orientation
Mais ça ne marchait pas parce que call ne peut pas être après un "="
Je vais tenter avec les fonctions.
Pour les boucles je sais pas faire... Ça marche comme ça alors bon, je vais laisser comme ça. Quand j'aurais un peu plus de galon avec vba je modifierais !
Par contre, je n'ai pas compris ton dernier paragraphe malgré que je l'ai relu plusieurs fois : ""="" ou 0=0 ??
J'ai compris ta conclusion par contre, donc je dois changer le signe ?
Merci
Par contre, je n'ai pas compris ton dernier paragraphe malgré que je l'ai relu plusieurs fois : ""="" ou 0=0 ??
Si le reste n'est pas brillant et sera un peu plus lent que nécessaire, et qu'on aura du mal à y trouver ce qu'on sera amené à chercher à tel ou tel moment, cela ne produit pas d'erreur et n'empêche pas le fonctionnement, mais sur ce dernier point sur lequel réside ta double erreur, il serait judicieux de faire l'effort de comprendre exactement ce qui se passe :
1) Première erreur : tu initialises une variable resultat avec InpuBox, tu as donc cette variable resultat, dûment déclarée de type String, contenant une valeur de type String...
mais tu testes une variable resutat (erreur de frappe, certes, mais pour VBA une autre variable non déclarée, qui elle est vide puisque non initialisée et non typée, donc de type Variant). [Je le précise parce que la valeur Empty ne peut concerner que des variables de type Variant...]
Cette erreur devrait te conduire à test sur des valeurs String, dans lequel resutat (ta fausse variable) prendra la valeur "" (texte vide) qui comparé à n'importe quelle autre valeur String, devrait donner toujours FAUX...
2) Cependant vient s'ajouter là-dessus une seconde erreur : dans ton idée, resultat (la vraie variable) doit contenir soit la chaîne "paysage", soit la chaîne "portrait", mais tu écris :
If resutat = paysage Then
Soit paysage, sans guillemets, qui n'est donc plus alors une valeur texte, mais un nom de variable, également non déclarée et non initialisée. De même que précédemment ta nouvelle fausse variable aura la valeur Empty. Ta condition est donc de fait :
If Empty = Empty Then
Ce qui est équivalent à : "" = "" ou 0 = 0...
Il s'ensuit que cette double erreur aboutit à ce que la condition soit toujours VRAIE. Donc à te faire systématiquement définir l'orientation en paysage...
Il te faut donc corriger resu(l)tat et mettre des guillemets où il faut...
Reste la transformation de la Sub en Function... Ce qui différencie une Sub d'une Function est principalement qu'une Function renvoie un résultat (se termine par NomdelaFonction = Résultat) et s'utilise de ce fait généralement à droite d'un signe =...
Function Orientation()
Dim resultat As String, orient As Integer
Do
resultat = InputBox("paysage ou portrait")
Select Case resultat
Case "paysage": orient = xlLandscape
Case "portrait": orient = xlPortrait
Case Else: orient = 0
End Select
If orient = 0 Then MsgBox "erreur dans votre saisie"
Loop While orient = 0
Orientation = orient
End FunctionJ'ai ajouté une variable supplémentaire pour que ce soit plus clair et mis une boucle Do... Loop dont l'utilisateur ne peut sortir qu'en tapant "paysage" ou "portrait", afin de garantir une valeur valide de l'orientation...
Et dans ton code de mise en page, tu auras donc :
Orientation = Orientation()NB- L'instruction Call ne sert strictement à rien en VBA où l'on peut appeler les procédures directement par leur nom : elle n'a pour effet que de faire taper un mot de plus et obliger à mettre les arguments éventuels de la proc. entre parenthèses. On peut donc toujours s'en dispenser...
Cordialement.
Merci pour ton post.
Effectivement je comprends mieux maintenant.
J'ai corrigé mes macros : j'ai mis ta fonction et j'ai fait celle pour papersize puis j'ai supprimé les anciennes.
Enfin dans mon code de mise en page j'ai fait ce que tu m'as dit.
Et pourtant ça ne marche toujours pas... (voir code ci-après).
Je crois que j'ai une colle !
Sub miseenpagefinaltest()
Application.PrintCommunication = True
ActiveSheet.PageSetup.PrintArea = "$A$6:$M$1900"
Application.PrintCommunication = False
With ActiveSheet.PageSetup
.LeftHeader = ""
.CenterHeader = ""
.RightHeader = ""
.LeftFooter = "&Z&F - Sheet : &A"
.CenterFooter = ""
.RightFooter = "&D - &T"
.LeftMargin = Application.InchesToPoints(0.25)
.RightMargin = Application.InchesToPoints(0.25)
.TopMargin = Application.InchesToPoints(0.75)
.BottomMargin = Application.InchesToPoints(0.75)
.HeaderMargin = Application.InchesToPoints(0.3)
.FooterMargin = Application.InchesToPoints(0.3)
.PrintHeadings = False
.PrintGridlines = False
.PrintComments = xlPrintNoComments
.PrintQuality = 600
.CenterHorizontally = True
.CenterVertically = True
.Draft = False
.FirstPageNumber = xlAutomatic
.Order = xlDownThenOver
.Orientation = Orientation()
.Papersize = Papersize()
.BlackAndWhite = False
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = False
.PrintErrors = xlPrintErrorsDisplayed
.OddAndEvenPagesHeaderFooter = False
.DifferentFirstPageHeaderFooter = False
.ScaleWithDocHeaderFooter = True
.AlignMarginsHeaderFooter = True
.EvenPage.LeftHeader.Text = ""
.EvenPage.CenterHeader.Text = ""
.EvenPage.RightHeader.Text = ""
.EvenPage.LeftFooter.Text = ""
.EvenPage.CenterFooter.Text = ""
.EvenPage.RightFooter.Text = ""
.FirstPage.LeftHeader.Text = ""
.FirstPage.CenterHeader.Text = ""
.FirstPage.RightHeader.Text = ""
.FirstPage.LeftFooter.Text = ""
.FirstPage.CenterFooter.Text = ""
.FirstPage.RightFooter.Text = ""
End With
End SubFunction Orientation()
Dim resultat As String, orient As Integer
Do
resultat = InputBox("paysage ou portrait")
Select Case resultat
Case "paysage": orient = xlLandscape
Case "portrait": orient = xlPortrait
Case Else: orient = 0
End Select
If orient = 0 Then MsgBox "erreur dans votre saisie"
Loop While orient = 0
Orientation = orient
End FunctionFunction Papersize()
Dim resultat As String, paper As Integer
Do
resultat = InputBox("A3 ou A4 ")
Select Case resultat
Case "A3": paper = xlPaperA3
Case "A4": paper = xlPaperA4
Case Else: paper = 0
End Select
If paper = 0 Then MsgBox "erreur dans votre saisie"
Loop While paper = 0
Papersize = paper
End FunctionEn épurant un peu... mais ce ne peut être ce qui pose problème...
Sub miseenpagefinaltest()
With ActiveSheet.PageSetup
.LeftFooter = "&Z&F - Sheet : &A"
.RightFooter = "&D - &T"
.LeftMargin = Application.InchesToPoints(0.25)
.RightMargin = Application.InchesToPoints(0.25)
.TopMargin = Application.InchesToPoints(0.75)
.BottomMargin = Application.InchesToPoints(0.75)
.HeaderMargin = Application.InchesToPoints(0.3)
.FooterMargin = Application.InchesToPoints(0.3)
.CenterHorizontally = True
.CenterVertically = True
.Orientation = Orientation()
.PaperSize = PaperSize()
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = False
.ScaleWithDocHeaderFooter = True
.AlignMarginsHeaderFooter = True
.PrintArea = "$A$6:$M$1900"
End With
ActiveSheet.PrintPreview
End SubPar contre, si tu ne conclues pas par un PrintOut ou PrintPreview, il ne se passera rien !
Cordialement.
Hello MFerrand,
Merci pour ton message mais même avec cela, ça ne marche pas... J'ai maintenant le droit au message d'erreur 400...
Je t'envoie mon fichier excel de base de test si tu veux y jeter un coup d’œil (plus simple peut être que de voir juste les codes...)
La macro est dans "ThisWorkBook" et j'ai reboot la mise en page.
Merci beaucoup d'avance,
Erreur dans ta fonction Papersize :
[barrer]Paper = Papersize[/barrer]
Papersize = PaperCordialement.
OUI ! ça marche !
Une erreur toute bête !
Merci beaucoup MFerrand !!