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 Sub
Sub 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 Sub
Sub 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 Sub

Je 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...
[j'ai peut-être pas tout vu, mais ça allègerait déjà pas mal.]

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 Function

J'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 Sub
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 Function
Function 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 Function

En é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 Sub

Par 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,

19base-test-luvi.xlsm (155.50 Ko)

Erreur dans ta fonction Papersize :

    [barrer]Paper = Papersize[/barrer]

    Papersize = Paper

Cordialement.

OUI ! ça marche !

Une erreur toute bête !

Merci beaucoup MFerrand !!

Rechercher des sujets similaires à "probleme mise page orientation format"