XL 2010 Macro imprimer, masquer et compacter des lignes

Orson83

XLDnaute Impliqué
Bonsoir à tous,

Je cherche à imprimer des pages séparément et à masquer l'impression des certaines lignes inutiles.

L'idée est de compacter les différents espaces vides entre chaque tableau en laissant 1 ligne vide uniquement (ligne blanche).

En effet, je n'ai pas d'autre choix que de garder un visuel de page un peu boiteux ce qui m'oblige à bricoler pour pouvoir imprimer correctement.

Du coup, j'aimerai imprimer sur 2 pages, masquer une série de lignes inutiles et mettre en blanc des lignes visibles (grises actuellement).

Par la même occasion, j'aimerai aussi régler la mise en page selon des mages définies dans le codage.

J'ai déjà codé mais bien sûr ça ne marche pas. Le code se trouve dans VBAProject > Feuil1

Je joins mon fichier exemple dans ce post.

Merci pour votre aide.

François
 

Pièces jointes

  • V1-Zones-impression.xlsm
    32.8 KB · Affichages: 13

fanch55

XLDnaute Barbatruc
Bonsoir ,

Code:
'*********************************************
'IMPRIMER LES PAGES SELON LES ZONES DEFINIES
'ET IGNORER CERTAINES LIGNES VIDES
'*********************************************
Sub ButtonPrint_Click()
Dim Sh          As Worksheet
Dim Rows_Hidden As Range
Dim Rows_xlNone As Range
Dim Save_Color  As Long

Set Sh = Sheets("Données")
    With Sh.PageSetup
    
        .PrintArea = "$C$3:$D$40,$C$64:$D$89" 'Zones de la page 1 et 2
        
        Set Rows_Hidden = Union(Sh.Rows("20:22"), _
                                Sh.Rows("41:63"), _
                                Sh.Rows("75:80"))
            Rows_Hidden.EntireRow.Hidden = True
        
        Save_Color = Sh.Rows("19").Interior.ColorIndex
        Set Rows_xlNone = Union(Sh.Rows("19"), _
                                Sh.Rows("32"), _
                                Sh.Rows("40"), _
                                Sh.Rows("74"))
            Rows_xlNone.Interior.ColorIndex = xlNone
        
        .LeftMargin = Application.InchesToPoints(0.8) 'Marge gauche
        .RightMargin = Application.InchesToPoints(0.8) 'Marge droite
        .TopMargin = Application.InchesToPoints(0.8) 'Marge haut de page
        .BottomMargin = Application.InchesToPoints(0.8) 'Marge bas de page
        
        Sh.PrintPreview 'Prévisualiser avant impression
        
       ' restauration d'avant impression
            Rows_Hidden.EntireRow.Hidden = False
            Rows_xlNone.Interior.ColorIndex = Save_Color
            
        Set Rows_Hidden = Nothing
        Set Rows_xlNone = Nothing
    
    End With
    
Set Sh = Nothing
End Sub

Ça devrait le faire .. :cool:
 

Orson83

XLDnaute Impliqué
Bonsoir ,

Code:
'*********************************************
'IMPRIMER LES PAGES SELON LES ZONES DEFINIES
'ET IGNORER CERTAINES LIGNES VIDES
'*********************************************
Sub ButtonPrint_Click()
Dim Sh          As Worksheet
Dim Rows_Hidden As Range
Dim Rows_xlNone As Range
Dim Save_Color  As Long

Set Sh = Sheets("Données")
    With Sh.PageSetup
   
        .PrintArea = "$C$3:$D$40,$C$64:$D$89" 'Zones de la page 1 et 2
       
        Set Rows_Hidden = Union(Sh.Rows("20:22"), _
                                Sh.Rows("41:63"), _
                                Sh.Rows("75:80"))
            Rows_Hidden.EntireRow.Hidden = True
       
        Save_Color = Sh.Rows("19").Interior.ColorIndex
        Set Rows_xlNone = Union(Sh.Rows("19"), _
                                Sh.Rows("32"), _
                                Sh.Rows("40"), _
                                Sh.Rows("74"))
            Rows_xlNone.Interior.ColorIndex = xlNone
       
        .LeftMargin = Application.InchesToPoints(0.8) 'Marge gauche
        .RightMargin = Application.InchesToPoints(0.8) 'Marge droite
        .TopMargin = Application.InchesToPoints(0.8) 'Marge haut de page
        .BottomMargin = Application.InchesToPoints(0.8) 'Marge bas de page
       
        Sh.PrintPreview 'Prévisualiser avant impression
       
       ' restauration d'avant impression
            Rows_Hidden.EntireRow.Hidden = False
            Rows_xlNone.Interior.ColorIndex = Save_Color
           
        Set Rows_Hidden = Nothing
        Set Rows_xlNone = Nothing
   
    End With
   
Set Sh = Nothing
End Sub

Ça devrait le faire .. :cool:

Bonsoir fanch55,

Un grand merci pour cette réponse rapide. Tout cela fonctionne correctement.

Je joins le fichier corrigé pour partager avec la communauté.

Au plaisir et prenez bien soin de vous ;)

François
 

Pièces jointes

  • V1-Zones-impression.xlsm
    34.9 KB · Affichages: 7

Orson83

XLDnaute Impliqué
Bonsoir ,

Code:
'*********************************************
'IMPRIMER LES PAGES SELON LES ZONES DEFINIES
'ET IGNORER CERTAINES LIGNES VIDES
'*********************************************
Sub ButtonPrint_Click()
Dim Sh          As Worksheet
Dim Rows_Hidden As Range
Dim Rows_xlNone As Range
Dim Save_Color  As Long

Set Sh = Sheets("Données")
    With Sh.PageSetup
  
        .PrintArea = "$C$3:$D$40,$C$64:$D$89" 'Zones de la page 1 et 2
      
        Set Rows_Hidden = Union(Sh.Rows("20:22"), _
                                Sh.Rows("41:63"), _
                                Sh.Rows("75:80"))
            Rows_Hidden.EntireRow.Hidden = True
      
        Save_Color = Sh.Rows("19").Interior.ColorIndex
        Set Rows_xlNone = Union(Sh.Rows("19"), _
                                Sh.Rows("32"), _
                                Sh.Rows("40"), _
                                Sh.Rows("74"))
            Rows_xlNone.Interior.ColorIndex = xlNone
      
        .LeftMargin = Application.InchesToPoints(0.8) 'Marge gauche
        .RightMargin = Application.InchesToPoints(0.8) 'Marge droite
        .TopMargin = Application.InchesToPoints(0.8) 'Marge haut de page
        .BottomMargin = Application.InchesToPoints(0.8) 'Marge bas de page
      
        Sh.PrintPreview 'Prévisualiser avant impression
      
       ' restauration d'avant impression
            Rows_Hidden.EntireRow.Hidden = False
            Rows_xlNone.Interior.ColorIndex = Save_Color
          
        Set Rows_Hidden = Nothing
        Set Rows_xlNone = Nothing
  
    End With
  
Set Sh = Nothing
End Sub

Ça devrait le faire .. :cool:

Désolé pour le dérangement, mais par moment j'ai une erreur d'exécution "94" et "Utilisation incorrecte de Null".

Le débogueur VBA s'arrête sur la ligne : Save_Color = Sh.Rows("19").Interior.ColorIndex

J'ai aussi une autre erreur en cliquant sur le bouton "Imprimer", les lignes qui doivent être en blanc à l'impression deviennent blanches dans la feuille Excel (à la base, j'ai un fond totalement gris dans la feuille).

J'ai placé le code dans le Module1.

Mon fichier est en pièce jointe.

PS : j'ai une version d'Excel 2010

Merci pour votre aide.

François
 

Pièces jointes

  • V2-Zones-impression.xlsm
    36.3 KB · Affichages: 5
Dernière édition:

jmfmarques

XLDnaute Accro
Bonjour à tous
j'ai une erreur d'exécution "94" et "Utilisation incorrecte de Null".

Le débogueur VBA s'arrête sur la ligne : Save_Color = Sh.Rows("19").Interior.ColorIndex
Je n'ouvre jamais un classeur tiers, n'ai donc pas ouvert le tien et me contente de te répondre sur la seule base de tes indications, d'une part, et du code que tu as repris de Fanch55 (son message #2)
Cette ligne de code :
VB:
Save_Color = Sh.Rows("19").Interior.ColorIndex
n'a de sens que si la totalité des cellules de la ligne 19 ont exactement la même couleur
Dans le cas contraire, est bien évidemment attribuée une valeur NULL (objet de ton plantage, NULL n'étant pas un long) à la variable Save_color

EDIT : analogie avec la vie réelle : quelle couleur indiquerais-tu pour indiquer la couleur commune du pull vert de Marie et du pull rouge de Joséphine ?
 
Dernière édition:

Orson83

XLDnaute Impliqué
Bonjour à tous

Je n'ouvre jamais un classeur tiers, n'ai donc pas ouvert le tien et me contente de te répondre sur la seule base de tes indications, d'une part, et du code que tu as repris de Fanch55 (son message #2)
Cette ligne de code :
VB:
Save_Color = Sh.Rows("19").Interior.ColorIndex
n'a de sens que si la totalité des cellules de la ligne 19 ont exactement la même couleur
Dans le cas contraire, est bien évidemment attribuée une valeur NULL (objet de ton plantage, NULL n'étant pas un long) à la variable Save_color

EDIT : analogie avec la vie réelle : quelle couleur indiquerais-tu pour indiquer la couleur commune du pull vert de Marie et du pull rouge de Joséphine ?
Bonjour,

Quelle est la solution alors ?

François
 

fanch55

XLDnaute Barbatruc
Save_Color = Sh.Rows("19").Interior.ColorIndex
n'a de sens que si la totalité des cellules de la ligne 19 ont exactement la même couleur
Dans le cas contraire, est bien évidemment attribuée une valeur NULL (objet de ton plantage, NULL n'étant pas un long) à la variable Save_color
Tout à fait Exact,.

Dans le fichier originel et d'après le code existant , j'avais d'abord mis
Save_Color = Sh.[A5].Interior.ColorIndex Cette cellule est grise.

En fait c'est mon code qui est erroné (dév trop rapide et non circonstancié)
A la première exécution, il a donc enlevé la couleur les lignes entières sélectionnées puis les a colorié en gris après le Preview .

En formatant le code par la suite, me fiant à la feuille que j'avais modifiée, je me suis dit si toutes les lignes à blanchir ont la même couleur, pourquoi ne pas récupéré le code couleur de la ligne.
Erreur: cela fonctionnait car la feuille était déjà altérée .
Mea Culpa . :rolleyes:

Bon il faudrait analyser chaque cellule des lignes à blanchir, c’était trop simple .
 

jmfmarques

XLDnaute Accro
Quelle est la solution alors ?
J'ignore tes aboutissants (je n'ai pas ouvert ton classeur - je ne le fais jamais) et ne peux donc que te répondre de cette manière :
- si ces couleurs intérieures n'ont aucune importance, ne les traite donc pas
- mais si elles ont pour toi une importance, il te faut alors :
---- soit traiter cellule par cellule (une simple boucle for des plus classiques) de la ligne concernée, si toutes ne sont pas de la même couleur
---- soit enfin copier/coller spécial (format uniquement) d'abord
 

Orson83

XLDnaute Impliqué
Tout à fait Exact,.

Dans le fichier originel et d'après le code existant , j'avais d'abord mis
Save_Color = Sh.[A5].Interior.ColorIndex Cette cellule est grise.

En fait c'est mon code qui est erroné (dév trop rapide et non circonstancié)
A la première exécution, il a donc enlevé la couleur les lignes entières sélectionnées puis les a colorié en gris après le Preview .

En formatant le code par la suite, me fiant à la feuille que j'avais modifiée, je me suis dit si toutes les lignes à blanchir ont la même couleur, pourquoi ne pas récupéré le code couleur de la ligne.
Erreur: cela fonctionnait car la feuille était déjà altérée .
Mea Culpa . :rolleyes:

Bon il faudrait analyser chaque cellule des lignes à blanchir, c’était trop simple .
Bonjour fanch55,

Peux-tu modifier le code STP ?

Je ne vois pas comment résoudre ce problème.

Une question, pourquoi ne pas indiquer dans le code que les lignes x,y,z doivent être blanche ?

Encore merci pour le temps passé.

Bonne journée.

François
 
Dernière édition:

Orson83

XLDnaute Impliqué
Bonjour fanch55,

Peux-tu modifier le code STP ?

Je ne vois pas comment résoudre ce problème.

Encore merci pour le temps passé.

Bonne journée.

François
Bonsoir à tous,

Je cherche à imprimer des pages séparément et à masquer l'impression des certaines lignes inutiles.

L'idée est de compacter les différents espaces vides entre chaque tableau en laissant 1 ligne vide uniquement (ligne blanche).

En effet, je n'ai pas d'autre choix que de garder un visuel de page un peu boiteux ce qui m'oblige à bricoler pour pouvoir imprimer correctement.

Du coup, j'aimerai imprimer sur 2 pages, masquer une série de lignes inutiles et mettre en blanc des lignes visibles (grises actuellement).

Par la même occasion, j'aimerai aussi régler la mise en page selon des mages définies dans le codage.

J'ai déjà codé mais bien sûr ça ne marche pas. Le code se trouve dans VBAProject > Feuil1

Je joins mon fichier exemple dans ce post.

Merci pour votre aide.

François

Bonjour,

J'ai reproduit mon fichier en pièce jointe avec du code VBA (Module1) mais quand je clique sur le bouton "Imprimer les 2 pages", les lignes 4, 19, 32, 40, 74 se colorent en blanc dans ma feuille Excel (onglet "Données") alors que cette coloration de ligne devrait être appliquée uniquement dans le document imprimé sur papier.

Merci pour votre aide.

François
 

Pièces jointes

  • V2-Zones-impression.xlsm
    35.9 KB · Affichages: 4

fanch55

XLDnaute Barbatruc
Voili Voilou :
VB:
Option Explicit

'*********************************************
'IMPRIMER LES PAGES SELON LES ZONES DEFINIES
'ET IGNORER CERTAINES LIGNES VIDES
'*********************************************
Sub ButtonPrint_Click()
Dim Sh          As Worksheet
Dim Rows_Hidden As Range
Dim Plage       As Range
Dim Cell        As Range
Dim Line        As Variant
Dim Item        As Variant
Dim List_Adr    As String
Dim ColorOf     As Collection

Set Sh = ActiveSheet
Set ColorOf = New Collection

    With Sh.PageSetup
        .PrintArea = "$C$3:$D$40,$C$64:$D$89" 'Zones de la page 1 et 2
        .LeftMargin = Application.InchesToPoints(0.8) 'Marge gauche
        .RightMargin = Application.InchesToPoints(0.8) 'Marge droite
        .TopMargin = Application.InchesToPoints(0.8) 'Marge haut de page
        .BottomMargin = Application.InchesToPoints(0.8) 'Marge bas de page
    End With
    
    Set Rows_Hidden = Union(Sh.Rows("20:22"), _
                            Sh.Rows("41:63"), _
                            Sh.Rows("75:80"))
        Rows_Hidden.EntireRow.Hidden = True ' on cache la plage
        
   ' "blanchiment" des portions de lignes à imprimer
   ' en sauvegardant les cellules avec leur couleur initiale
    For Each Line In Array(19, 32, 40, 74)
        ' partie de ligne imprimable
        Set Plage = Intersect(Sh.Rows(Line), Sh.Range(Replace(Sh.PageSetup.PrintArea, ";", ",")))
        
        List_Adr = vbNullString
        For Each Cell In Plage.Cells
            List_Adr = IIf(List_Adr = vbNullString, Cell.Address, List_Adr & " " & Cell.Address) _
                     & ":" & Cell.Interior.Color
            Cell.Interior.ColorIndex = xlNone ' blanchiment de la cellule
        Next
        ColorOf.Add List_Adr, CStr(Line) ' stockage des cellules et de leur couleur
    Next

        
    Sh.PrintPreview 'Prévisualiser avant impression
        
' restauration d'avant impression
    Rows_Hidden.EntireRow.Hidden = False
    Set Rows_Hidden = Nothing
    For Each Line In ColorOf
        For Each Item In Split(Line)
            Sh.Range(Split(Item, ":")(0)).Interior.Color = Split(Item, ":")(1)
        Next
    Next
            
    
Set ColorOf = Nothing
Set Sh = Nothing

End Sub
 

job75

XLDnaute Barbatruc
Bonjour Tchotchodu31, fanch55,

Ceci est plus simple :
VB:
Sub Imprimer()
Feuil1.Copy 'Nouveau document
With ActiveSheet
    .[20:22,41:63,75:80].EntireRow.Hidden = True  'Masque une sélection de lignes
    .[C4,C19,C32,C40,C74].EntireRow.Interior.ColorIndex = xlNone 'Intérieur incolore des lignes 4,19,32,40,74
    .[C33:D33].Interior.Color = [C5].Interior.Color 'Gris
    With .PageSetup
        .PrintArea = "C3:D40,C64:D89" 'Zones de la page 1 et 2
        .LeftMargin = Application.InchesToPoints(0.8) 'Marge gauche
        .RightMargin = Application.InchesToPoints(0.8) 'Marge droite
        .TopMargin = Application.InchesToPoints(0.8) 'Marge haut de page
        .BottomMargin = Application.InchesToPoints(0.8) 'Marge bas de page
    End With
    .PrintPreview 'Aperçu pour tester
    '.PrintOut 'Pour imprimer
    .Parent.Close False 'Ferme le document
End With
End Sub
A+
 

Pièces jointes

  • Zones-impression(1).xlsm
    25.5 KB · Affichages: 10

fanch55

XLDnaute Barbatruc
Ah effectivement, si on peut dupliquer la feuille, c'est beaucoup plus court comme cela.
En espérant qu'il n'y ait aucune formule ou liaison dans les cellules .
Mais pour le fichier de test, c'est idoine , bravo @job75

C'est amusant, je n'arrivai pas à faire le [20:22,41:63,75:80].EntireRow
aussi je me suis rabattu sur un union .
Mais j'ai trouvé pourquoi: je mettais dès ";" à la place des "," (comme dans les cellules)
Comme quoi on peut boucler en rond pour pas grand chose .
 

Discussions similaires

Statistiques des forums

Discussions
312 078
Messages
2 085 108
Membres
102 779
dernier inscrit
wrond