Zone d'impression capricieuse

Pepitolito

XLDnaute Nouveau
Bonsoir,

Plus habitué à me débrouiller en fouinant dans les forums qu'à poster dedans, veuillez excuser par avance une éventuelle maladresse.

Je suis actuellement en train de finaliser une macro réalisée à partir d'Excel 2007, le but est de la faire tourner sur Excel 2007 et Excel 2010.

99% de la macro marchent mais la partie d'impression des divers onglets du classeur pose problème.

Je m'explique :
Plusieurs onglets, 11 pour être précis, doivent s'imprimer à la demande de l'utilisateur.
Pour ce faire j'ai défini manuellement (directement avec Excel, pas en vba) les diverses zones d'impression de chaque onglet.
Sur ma machine (Excel 2007 sur Windows XP émulé depuis un Mac, vous suivez toujours?!) tout fonctionne.
Une fois passé sous un vrai PC avec Windows XP et Excel 2007, les zones de textes sont anarchiques.
Idem avec un autre vrai PC sous Windows 7 et Excel 2010.

J'introduis donc une définition des zones d'impression dans un modulé qui est appelé avant l'impression.

Résultat :
pour le vrai PC sous Excel 2007 ça marche, mais pour le vrai PC sous Excel 2010 c'est toujours anarchique.


Je suis assez perplexe!

Ci après le code d'impression avec le module appelé :


Private Sub Boutonedition_Click()

Call Module1.zoneimp

vb = Application.Dialogs(9).Show

If vb = True Then
Application.ScreenUpdating = False
Sheets(Array("PAGE 1", "PAGE 2", "PAGE 3", "PAGE 4", "PAGE 5", "PAGE 6", "PAGE 7", "PAGE 8", "PAGE 9", "PAGE 10", "PAGE 11")).PrintOut copies:=1, collate:=True
Application.ScreenUpdating = False
End If

End Sub


Sub zoneimp()
Dim p1 As Worksheet
Dim p2 As Worksheet
Dim p3 As Worksheet
Dim p4 As Worksheet
Dim p5 As Worksheet
Dim p6 As Worksheet
Dim p7 As Worksheet
Dim p8 As Worksheet
Dim p9 As Worksheet
Dim p10 As Worksheet
Dim p11 As Worksheet

Set p1 = Sheets("PAGE 11")
With p1
.PageSetup.PrintArea = "A1:J49"
End With

Set p2 = Sheets("PAGE 2")
With p2
.PageSetup.PrintArea = "A1:L48"
End With

Set p3 = Sheets("PAGE 3")
With p3
.PageSetup.PrintArea = "A8:N70"
End With

Set p4 = Sheets("PAGE 4")
With p4
.PageSetup.PrintArea = "A1:N70"
End With

Set p5 = Sheets("PAGE 5")
With p5
.PageSetup.PrintArea = "A1:N70"
End With

Set p6 = Sheets("PAGE 6")
With p6
.PageSetup.PrintArea = "A1:N70"
End With

Set p7 = Sheets("PAGE 7")
With p7
.PageSetup.PrintArea = "A1:H73"
End With

Set p8 = Sheets("PAGE 8")
With p8
.PageSetup.PrintArea = "A1:G71"
End With

Set p9 = Sheets("PAGE 9")
With p9
.PageSetup.PrintArea = "A1:H73"
End With

Set p10 = Sheets("PAGE 10")
With p10
.PageSetup.PrintArea = "A1:O63"
End With

Set p11 = Sheets("PAGE 11")
With p11
.PageSetup.PrintArea = "A1:O63"
End With

End Sub
 

job75

XLDnaute Barbatruc
Re : Zone d'impression capricieuse

Bonjour Pepitolito,bienvenue sur XLD, salut Modeste geedee,

Pas essayé de comprendre le problème des vrais et faux PC...

Mais perso j'aurais écrit un code plus soft :

Code:
Private Sub CommandButton1_Click()
Dim a, i As Byte, t(10) As String
If Application.Dialogs(9).Show = False Then Exit Sub
Application.ScreenUpdating = False
a = Array("A1:J49", "A1:L48", "A8:N70", "A1:N70", "A1:N70", _
"A1:N70", "A1:H73", "A1:G71", "A1:H73", "A1:O63", "A1:O63")
For i = 0 To 10
  t(i) = "PAGE " & i + 1
  Sheets(t(i)).PageSetup.PrintArea = a(i)
Next
Sheets(t).PrintOut
End Sub
ou même pourquoi pas :

Code:
Private Sub CommandButton1_Click()
Dim a, i As Byte
If Application.Dialogs(9).Show = False Then Exit Sub
Application.ScreenUpdating = False
a = Array("A1:J49", "A1:L48", "A8:N70", "A1:N70", "A1:N70", _
"A1:N70", "A1:H73", "A1:G71", "A1:H73", "A1:O63", "A1:O63")
For i = 0 To 10
  With Sheets("PAGE " & i + 1)
    .PageSetup.PrintArea = a(i)
    .PrintOut
  End With
Next
End Sub
A+
 

job75

XLDnaute Barbatruc
Re : Zone d'impression capricieuse

Re Modeste,

à tout hasard se méfier des noms de variables qui ressemblent à des adresses cellules ...
ex : P11 plutôt écrire P_11

Oui il y a problème si la variable P11 est utilisée avec la cellule [P11] :

Code:
Sub Test1() 'beugue
Dim P11 As Range
Set P11 = [P11]
P11.Select
End Sub

Sub Test2()
Dim P11 As String
P11 = [P11]
MsgBox P11 'renvoie toujours ""
End Sub
Edit : si la déclaration des variables n'est pas obligatoire ceci fonctionne bien chez moi (Excel 2003) :

Code:
Sub Test3() 'marche bien
Set P11 = [P11]
P11.Select
End Sub

Sub Test4()
P11 = [P11]
MsgBox P11 'renvoie la bonne valeur
End Sub
A+
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Re : Zone d'impression capricieuse

Re Modeste,
à tout hasard se méfier des noms de variables qui ressemblent à des adresses cellules ...
ex : P11 plutôt écrire P_11

:cool: il ne s'agit que d'une suggestion...(non restrictive)
mais lors du passage de XL2002 à XL2007, j'ai été confronté à un problème similiaire incompréhensible et l'application de cette suggestion fut la solution...
notament lors de l'utilisation VBA de Evaluate : [variable]
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Zone d'impression capricieuse

Re Modeste,

Il n'y a pas de problème si l'on utilise Range("P11") - et non pas [P11] - pour définir P11 :

Code:
Sub Test() 'marche toujours
Dim P11 As Range
Set P11 = Range("P11")
P11.Select
MsgBox [P11] 'ou MsgBox P11 
End Sub
A+
 

Pepitolito

XLDnaute Nouveau
Re : Zone d'impression capricieuse

Bonjour à tous et merci bcp pr vos contributions,

@Modeste geedee
Je vais tout retester en changeant par P_1 etc...
C'est vraiment le genre de truc auquel je n'aurai jms pensé!
merci ;)

@job75
Y a pas photo ton code est bcp plus joli et simple!
Par contre le bout de code que je vous ai posté a été justement
modifié au niveau du nom des feuilles, je les ai nommées ici "PAGE 1" etc
pour des raisons de compréhension alors qu'en réalité elles ont toutes
un nom du genre "SYNTHESE" etc... Ce qui pose dc un pb avec l'itération que tu proposes
mais je vais quand même fouiller dans ce sens.

Un dernier point,

Je me suis aperçu qu'en testant avec le PC sous Excel 2010, la macro s'exécutais correctement
(sauf la partie pr laquelle j'ai demandé votre aide) mais qu'en quittant la macro, il apparaît un
message invitant l'utilisateur à enregistrer les modifications (le message ne provient pas de ma macro
mais d'Excel) et si l'on clique sur Oui au démarrage suivant de la macro elle ne se lance pas,
le message d'erreur suivant apparaît : " Nom déjà utilisé. Le nom ne dot pas être identique à un nom prédéfini.
Ancien nom : Print_Area " et il y a une textbox avec pour titre "Nouveau nom".

Je précise que ce message n'apparaît qu'avec Excel 2010 et qu'il bloque le lancement de la macro.
Et qu'à la vue de "Print_Area" ça me paraît intimement lié à mon problème initial...

Toujours est-il que je vais tester avec les modifs suggérées!
 

job75

XLDnaute Barbatruc
Re : Zone d'impression capricieuse

Re,

(...) au niveau du nom des feuilles, je les ai nommées ici "PAGE 1" etc
pour des raisons de compréhension alors qu'en réalité elles ont toutes
un nom du genre "SYNTHESE" etc...

Vous pouvez alors utiliser cette macro :

Code:
Private Sub CommandButton1_Click()
Dim F As Object, a, i As Byte
If Application.Dialogs(9).Show = False Then Exit Sub
Application.ScreenUpdating = False
Set F = Sheets(Array("PAGE 1", "PAGE 2", "PAGE 3", "PAGE 4", "PAGE 5", _
"PAGE 6", "PAGE 7", "PAGE 8", "PAGE 9", "PAGE 10", "PAGE 11"))
a = Array("A1:J49", "A1:L48", "A8:N70", "A1:N70", "A1:N70", _
"A1:N70", "A1:H73", "A1:G71", "A1:H73", "A1:O63", "A1:O63")
For i = 1 To 11
  F(i).PageSetup.PrintArea = a(i - 1)
Next
F.PrintOut
End Sub
Les noms des feuilles peuvent être quelconques.

A+
 

job75

XLDnaute Barbatruc
Re : Zone d'impression capricieuse

Re,

Suite de mon post #8.

Le problème que vous mentionnez au dernier point du post #7 est curieux.

Il faut savoir qu'au niveau des noms définis dans une feuille, VBA ne fait pas de différence entre le nom "Zone_d_impression" et le nom "Print_Area" (je parle là de version française).

Normalement il ne doit y avoir aucun problème, que la zone d'impression soit définie par la commande classique d'Excel ou par macro avec .PageSetup.PrintArea.

Je complète quand même la macro en supprimant préalablement ce nom défini :

Code:
Private Sub CommandButton1_Click()
Dim F As Object, a, i As Byte
If Application.Dialogs(9).Show = False Then Exit Sub
Application.ScreenUpdating = False
Set F = Sheets(Array("PAGE 1", "PAGE 2", "PAGE 3", "PAGE 4", "PAGE 5", _
"PAGE 6", "PAGE 7", "PAGE 8", "PAGE 9", "PAGE 10", "PAGE 11"))
a = Array("A1:J49", "A1:L48", "A8:N70", "A1:N70", "A1:N70", _
"A1:N70", "A1:H73", "A1:G71", "A1:H73", "A1:O63", "A1:O63")
On Error Resume Next 'si le nom défini n'existe pas
For i = 1 To 11
  F(i).Names("Print_Area").Delete 'suppression du nom défini
  F(i).PageSetup.PrintArea = a(i - 1)
Next
F.PrintOut
End Sub
Voyez ce que cela donne maintenant chez vous.

A+
 

Discussions similaires

Réponses
2
Affichages
113

Statistiques des forums

Discussions
312 174
Messages
2 085 942
Membres
103 053
dernier inscrit
Beubax