[Vba] Impression

7 réponses
Avatar
Péhemme
Bonsoir à Tous,

Je donne ma langue au chat.
Dans le cadre d'une petite application, je souhaite imprimer des pages
(onglets) dont les présentations sont légèrement différentes.
Afin de n'avoir qu'une seule macro d'impression, je mets mes lignes et
colonnes en variables.
Pour ce faire j'ai écrit :
Sub Imprimer()
Dim DerLig As Long, DerCol As Long
Dim Rg As Range

If ActiveSheet.index <= 5 Then Exit Sub

'Dernière ligne dans la feuille
DerLig = Cells.Find("*", LookIn:=xlValues, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
'Dernière colonne de la feuille
DerCol = Cells.Find("*", LookIn:=xlValues, _
SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
'Détermination de la plage à Imprimer
Set Rg = Range(Cells(1, 1), Cells(DerLig, DerCol))

If DerLig < 11 Then Exit Sub 'Ne rien faire si aucune
ligne remplie

With Application
.StatusBar = "IMPRESSION de la Page Active en cours..."
.ScreenUpdating = False
End With

ActiveSheet.PageSetup.PrintArea = Rg
...
...
Lors de mes tests, sur une page, la macro fonctionne parfaitement bien...
Lors d'un changement de page, ma macro bloque sur :
ActiveSheet.PageSetup.PrintArea = Rg
avec le message :
Erreur d'exécution '1004':
Le texte que vous avez tapé n'est ni une référence ni un nom défini valides.

"Les espions" m'indiquent bien les bons n° de ligne et de colonne à
imprimer.

Pourquoi cette syntaxe fonctionne dans un cas et pas dans l'autre ?
J'ai testé avec un Set Rg = Nothing en début de procédure pour le cas où la
mémoire traineraient des indications précédentes (malgré l'existence de
cette ligne en fin de procédure).
Lorsque je reviens sur ma première page, la macro fonctionne à nouveau.
Avant de manger mon chapeau : Pourquoi mon Rg est accepté dans un cas et
refusé dans l'autre ?
Ou comment l'écrire pour que cela fonctionne à tous les coups ?

Merci d'avance de vos avis.
Bien amicalement
Michel

7 réponses

Avatar
MichD
Bonjour,

Essaie cette macro dans un module standard :
Cette macro imprime la feuille si son index est plus grand que 5 et que
le nombre de lignes occupées dans la feuille active est plus grand ou
égal à 11.

'-------------------------------------------------
Sub Imprimer()

Dim Sh As Worksheet
Dim Rg As Range
Dim DerLig As Long, DerCol As Long

Set Sh = ActiveSheet

If Sh.Index <= 5 Then Exit Sub

With Sh
'Dernière ligne dans la feuille
DerLig = .Cells.Find("*", LookIn:=xlValues, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

'Ne rien faire si aucune ligne n'est remplie
If DerLig < 11 Then Exit Sub

'Dernière colonne de la feuille
DerCol = .Cells.Find("*", LookIn:=xlValues, _
SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column

'Détermination de la plage à imprimer
Set Rg = .Range(.Cells(1, 1), .Cells(DerLig, DerCol))
End With

With Application
.StatusBar = "IMPRESSION de la page active en cours..."
End With

With Rg
.PrintPreview 'à remplacer par .PrintOut après tes tests
End With

With Application
.StatusBar = ""
End With

Set Rg = Nothing: Set Sh = Nothing

End Sub
'-------------------------------------------------

MichD
Avatar
Péhemme
Mon cher Denis,

Serais-tu surpris d'apprendre que ce que tu as proposé fonctionne ?
:-)
Mille mercis.
Il est vexant de constater qu'une simple macro d'impression qui fonctionne
depuis 20 ans, après adaptation fonctionne sur une page et pas sur l'autre.
Je n'aurais pas du la réveiller ;-)
Je regarde attentivement et prends note des subtilités de ta syntaxe (toutes
mes macros d'impression sont à 'moderniser' sans doute ?)
Merci encore.

Bien amicalement
Michel


"MichD" a écrit dans le message de groupe de discussion :



Bonjour,

Essaie cette macro dans un module standard :
Cette macro imprime la feuille si son index est plus grand que 5 et que
le nombre de lignes occupées dans la feuille active est plus grand ou
égal à 11.

'-------------------------------------------------
Sub Imprimer()

Dim Sh As Worksheet
Dim Rg As Range
Dim DerLig As Long, DerCol As Long

Set Sh = ActiveSheet

If Sh.Index <= 5 Then Exit Sub

With Sh
'Dernière ligne dans la feuille
DerLig = .Cells.Find("*", LookIn:=xlValues, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

'Ne rien faire si aucune ligne n'est remplie
If DerLig < 11 Then Exit Sub

'Dernière colonne de la feuille
DerCol = .Cells.Find("*", LookIn:=xlValues, _
SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column

'Détermination de la plage à imprimer
Set Rg = .Range(.Cells(1, 1), .Cells(DerLig, DerCol))
End With

With Application
.StatusBar = "IMPRESSION de la page active en cours..."
End With

With Rg
.PrintPreview 'à remplacer par .PrintOut après tes tests
End With

With Application
.StatusBar = ""
End With

Set Rg = Nothing: Set Sh = Nothing

End Sub
'-------------------------------------------------

MichD
Avatar
MichD
Un petit détail, ce type de macro doit être placée impérativement dans
un module standard et non dans le module d’une feuille. C’est
probablement l’explication du non-fonctionnement de ta macro.

MichD
Avatar
Péhemme
C’est probablement l’explication du non-fonctionnement de ta macro.



Non. Elle est bien dans un module standard.

Michel


"MichD" a écrit dans le message de groupe de discussion :



Un petit détail, ce type de macro doit être placée impérativement dans
un module standard et non dans le module d’une feuille. C’est
probablement l’explication du non-fonctionnement de ta macro.

MichD
Avatar
MichD
Dans ta procédure, cette ligne de code est impossible

ActiveSheet.PageSetup.PrintArea = Rg

Tu remplaces par

ActiveSheet.PageSetup.PrintArea = Rg.Address


MichD
Avatar
Péhemme
Ahrrr !
Voila une explication.
... et aurait gardé "en mémoire" les informations concernant la première
impression ? Cela me semble plausible.
Je descends à Bandol et serai de retour ce soir.
Je ne ferai mes tests que dans la soirée.
Je reviens vers toi.
Encore merci de ton aide.
Michel


"MichD" a écrit dans le message de groupe de discussion :



Dans ta procédure, cette ligne de code est impossible

ActiveSheet.PageSetup.PrintArea = Rg

Tu remplaces par

ActiveSheet.PageSetup.PrintArea = Rg.Address


MichD
Avatar
Péhemme
Merci Denis, c'était exactement çà.
ActiveSheet.PageSetup.PrintArea = Rg.Address
fonctionne parfaitement bien dans tous mes cas de figure.

Bien amicalement
Michel


"MichD" a écrit dans le message de groupe de discussion :



Dans ta procédure, cette ligne de code est impossible

ActiveSheet.PageSetup.PrintArea = Rg

Tu remplaces par

ActiveSheet.PageSetup.PrintArea = Rg.Address


MichD