Impression des feuilles avec données seulement

Bonjour à tous,

J'aimerais pouvoir imprimer seulement les feuilles qui contiennent des données dans les zones de texte. Dans le fichier en pièce jointe, les colonnes A:G représentent les "Pages 1" alors que les colonnes H:N représentent les "Pages 2".

Si j'inscrit du texte dans les zones de texte de la page 1 des colonne A:G, en laissant la zone de texte de la page 2 vide, seulement la page 1 doit imprimer.

Exemple:

Dans A8:G61 (Page 1) les zones de texte contiennent du texte ,alors que dans H8:N61 (Page 2) il n'y a pas de texte dans les zones de texte. Seule la page 1 doit imprimer.

Dans A62:G122 (Page 1) les zones de texte contiennent du texte ainsi que H62:N122 (Page 2) contiennent aussi du texte. Les deux pages doivent être imprimées.

Ainsi de suite, tant que les zones de texte des pages contiennent du texte.

J'espère avoir été assez clair dans mes explications.

PS: SVP placer le bouton "Imprimer" en O4:O5

Merci beaucoup pour votre aide.

Bonjour,

J'ai une idée à exploiter pour vous mais je ne peux pas la tester car je ne suis pas sur windows. En tout cas, l'idée est de tester si une cellule (au sein de chaque page SSI vos pages sont de mêmes dimensions) est non vide. Si cette cellule est non vide, on imprimer, sinon on examine la page suivante.

Voici le code :

Option Base 1

Sub ImpressionPagesNonVides()

Dim CollPages As Pages
'Dim ObjPage As Page
Dim NbPages%, i%, K%, L%, n%

Set CollPages = ActiveSheet.ActiveWindow.Panes(1).Pages 'collection de pages de la feuille active
NbPages = CollPages.Count 'nombre de pages

'-----PRINCIPE : IMPRESSION SOUS CONDITION DE VALEUR D'UNE CELLULE
'-----------------------------------------------------------
'ON SUPPOSE QU'IL EXISTE SUR CHAQUE PAGE UNE CELLULE OBLIGATOIREMENT NON VIDE QUAND PAGE REMPLIE
'POUR L'EXEMPLE, ON POSE CETTE CELLULE EN LIGNE 10 DE LA COLONNE 1 DE CHAQUE PAGE
'CAD EN (10,1) POUR PAGE 1, EN (10,8) POUR PAGE 2, EN (70,1) POUR P3, EN (70,8) POUR P4, ....
'-----------------------------------------------------------

For i = 1 To NbPages 'pour les pages 1 à TotalPages

    If i Mod 2 = 0 Then 'si page paire
        K = 7 + 1 'colonne de référence vaut 8
    Else: K = 1 'si page impaire, colonne ref vaut 1
          n = n + 1 'incrémentation horizontale
    End If
    L = (n - 1) * 60 + 10 'L renvoie la ligne de référence de la cellule cherchée
                              'L = niveau horizontal (n-1) * 60 (hauteur d'une page) + 10 (ligne dans notre exemple)
    If Not Cells(L, K).Value = "" Then ActiveSheet.PrintOut From:=i, To:=i 'SI LA CELLULE (L,K) EST NON VIDE (CAD SI CELLULE (10,1) DE CHAQUE PAGE EST NON VIDE) ALORS ON IMPRIME LA PAGE EN COURS
Next i

End Sub

C'est la seule solution que j'ai trouvée pour un impression partielle, potentiellement discontinue. Il y a peut-être plus simple.

Si jamais il y a une erreur au niveau de :

Set CollPages = ActiveSheet.ActiveWindow.Panes(1).Pages

passez cette ligne en commentaire et essayez de réaliser la boucle en saisissant votre nombre de pages dans le for.

Il faudra cependant que vous choisissiez vous-même la cellule qui doit être non vide.

Cordialement,

Bonjour 3GB,

Merci beaucoup pour votre réponse.

Comme je ne suis pas un expert en VBA, je n'arrive pas à déchiffrer vos instructions ci-dessous.

Vous avez écrit,

Si jamais il y a une erreur au niveau de :

Set CollPages = ActiveSheet.ActiveWindow.Panes(1).Pages

passez cette ligne en commentaire et essayez de réaliser la boucle en saisissant votre nombre de pages dans le for.

Il faudra cependant que vous choisissiez vous-même la cellule qui doit être non vide.

Effectivement il y a une erreur au niveau "Set CollPages = ActiveSheet.ActiveWindow.Panes(1).Pages" lorsque j'active la macro.

Pouvez vous SVP me préciser votre pensée concernant la marche à suivre en cas d'erreur.

Merci encore pour votre implication.

Par passer en commentaire, j'entends désactiver le code en mettant une apostrophe en début de ligne.

Cette méthode (avec la collection de pages) aurait permis de rendre la procédure dynamique, quelque soit votre nombre de pages.

Donc, il faut désactiver cette ligne (et la suivante avec NbPages qui y fait référence) et saisir votre nombre de pages de votre onglet dans le code à la place du NbPages.

On aura For i = 1 to 16 si vous avez 16 pages par exemple.

Et ensuite, il faut que vous définissiez une cellule (exemple A10) sur laquelle vous mettrez une formule basique, de type =si(condition;"X";""), où la condition teste sur si votre page est vide ou non. Et vous pouvez par exemple mettre cette cellule avec une couleur de police blanche pour ne pas l'avoir à l'impression.

Et vous reproduisez cela pour toutes les cellules à la même place que A10 mais sur les autres pages (H10, A70, H70, A130, H130, ...).

J'espère que c'est un peu plus clair...

Sub ImpressionPagesNonVides()

Dim i%, K%, L%, n%

'-----PRINCIPE : IMPRESSION SOUS CONDITION DE VALEUR D'UNE CELLULE
'-----------------------------------------------------------
'ON SUPPOSE QU'IL EXISTE SUR CHAQUE PAGE UNE CELLULE OBLIGATOIREMENT NON VIDE QUAND PAGE REMPLIE
'POUR L'EXEMPLE, ON POSE CETTE CELLULE EN LIGNE 10 DE LA COLONNE 1 DE CHAQUE PAGE
'CAD EN (10,1) POUR PAGE 1, EN (10,8) POUR PAGE 2, EN (70,1) POUR P3, EN (70,8) POUR P4, ....
'-----------------------------------------------------------

For i = 1 To XXX 'pour les pages 1 à TotalPages

    If i Mod 2 = 0 Then 'si page paire
        K = 7 + 1 'colonne de référence vaut 8
    Else: K = 1 'si page impaire, colonne ref vaut 1
          n = n + 1 'incrémentation horizontale
    End If
    L = (n - 1) * 60 + 10 'L renvoie la ligne de référence de la cellule cherchée
                              'L = niveau horizontal (n-1) * 60 (hauteur d'une page) + 10 (ligne dans notre exemple)
    If Not Cells(L, K).Value = "" Then ActiveSheet.PrintOut From:=i, To:=i 'SI LA CELLULE (L,K) EST NON VIDE (CAD SI CELLULE (10,1) DE CHAQUE PAGE EST NON VIDE) ALORS ON IMPRIME LA PAGE EN COURS
Next i

End Sub

Voilà le code adapté. Il faut tout de même faire ce dont je vous ai parlé avec les cellules. Je précise que mon code est une exemple qui considère que la cellule de test est sur la dixième ligne et la première colonne de chaque. Si vous en choisissez une autre, il faudra adapter aux lignes :

    

    If i Mod 2 = 0 Then 'si page paire
        K = 7 + 1 'colonne de référence vaut 8 (le 1 à changer par votre colonne)
    Else: K = 1 'si page impaire, colonne ref vaut 1 (le 1 à changer par votre colonne)
          n = n + 1 'incrémentation horizontale
    End If
    L = (n - 1) * 60 + 10 'L renvoie la ligne de référence de la cellule cherchée (le 10 à changer par votre ligne)

Bonjour 3GB,

Encore merci pour votre réponse rapide et vos explications.

Voici ce que j'ai changé dans la macro:

1) le nombre de lignes par page est de 61 et non 60

2) J'ai changé la ligne 10 pour la ligne 18 ( L = (n - 1) * 61 + 18

For i, = 1 to 40, j'ai changé les XXX pour 40 ( il y a 40 pages au total dans le fichier)

J'ai inscrit la formule (=SI($A$18>0;"";"") aux lignes A7 et H7, ainsi de suite pour les autres pages tout en ajoutant 61 au 18......

Lorsque je clique sur le bouton pour imprimer, rien ne se produit. J'inclus le fichier avec les modifications.

Merci encore.

Bonsoir golfeur,

1) Ok, ça ne change rien.

2) Très bien.

2 bis) For i = 1 to 40, OK.

En fait, pour faire plus simple, peux-tu me dire ce qu'on voit quand la page est remplie et ce qu'on ne voit pas sinon, hormis ce qu'il se trouve sur les zones de texte ?

Parce qu'en fait, je ne sais pas comment les manipuler via VBA. Il me faut juste un champ d'excel qui est rempli lorsque les zones de texte le sont et le problème serait règlé.

Cordialement,

Bonsoir 3GB,

Encore merci pour l'intérêt que tu porte à mon problème.

J'ai quelque peut modifier mes pages afin de te donner une cellule qui se remplira en même temps que les zones de texte. J'ai supprimé les numéros de page (voir les cellules en jaune) en A1 et H1......et autres.

Je vais entrer les numéros de page seulement si j'écris du texte dans les zones de texte. Ce qui te fourni une cellule vide à utiliser pour la macro. J'ai aussi changé la formule en A7 et H7...... (=SI(A1>0;"";"").....et autres......

Merci encore.

Salut golfeur,

Il n'y a pas de quoi.

Vu que les cellules (1,1) de chaque page se rempliront si il y a du texte dans les zones de texte, alors j'ai à nouveau modifié la ligne de code pour aboutir à :

Sub ImpressionPagesNonVides()

Dim i%, K%, L%, n%

For i = 1 To 40 'pour les pages 1 à TotalPages

    If i Mod 2 = 0 Then 'si page paire
        K = 7 + 1 'colonne de référence vaut 8
    Else: K = 1 'si page impaire, colonne ref vaut 1
          n = n + 1 'incrémentation horizontale
    End If
    L = (n - 1) * 61 + 1 'L renvoie la ligne de référence de la cellule cherchée
                         'L = niveau horizontal (n-1) * 61 (hauteur d'une page) + 1 (ligne dans notre exemple)
    If Not Cells(L, K).Value = "" Then ActiveSheet.PrintOut From:=i, To:=i 'SI LA CELLULE (L,K) EST NON VIDE (CAD SI CELLULE (1,1) DE CHAQUE PAGE EST NON VIDE) ALORS ON IMPRIME LA PAGE EN COURS
Next i

End Sub

Donc maintenant, la formule en A7 et autres (si(A1>0;...) n'est plus nécessaire puisqu'on teste déjà sur les cellules A1 et autres.

J'espère pour toi que ça va marcher. Essaie déjà en remplissant les cellules A1, H1 et H62 pour voir.

A bientôt,

Tiens, avec le fichier, c'est peut-être mieux

Bonjour 3GB,

Je suis désolé mais les feuilles qui impriment ne sont pas les bonnes. J'ai ajouté le numéro de pages dans les cellules jaunes pour les feuilles 1, 3 et 4 .

Lors de l'impression ça indique que les feuilles 1,3 et 4 vont s'imprimer. Mais 2 des feuilles sont vides. Seule la première feuille contient des données.

Merci encore pour l'intérêt que tu porte à mon dossier.

En pièce jointe, ton fichier avec les numéro de pages.

Bonjour golfeur,

En fait, c'est parce que l'option d'impression était définie sur "vers le bas puis à droite" au lieu de "vers la droite puis en bas".

Je l'ai rectifié (c'est bien ce que tu voulais ?) sur mon mac mais je ne suis pas certain que le réglage soit maintenu. Au cas où tu aurais besoin de le refaire :

Dans le volet Options/Impression/Mise en page/Onglet Feuille > Coche "vers la droite puis en bas".

Aussi, de mon côté, ta zone d'impression était mal définie et comptait une page de trop à droite. J'ai ajusté la zone mais j'ai maintenant un décalage sur les sauts de page.

Je t'envoie le fichier quand il sera prêt.

En attendant ton retour, je vais essayer de voir si je peux pas le passer par VBA.

J'ai tout corrigé, ça devrait normalement marcher sans problème. Je t'ai laissé une petite macro de mise en page au cas où tes réglages seraient perdus où à réadapter.

Ça foire un peu sur mon ordi donc autant ne pas l'utiliser à moins d'en avoir vraiment besoin.

Voici le fichier :

Tu as même le droite à un petit bonus en pdf

Tiens moi au courant, A+

Bonjour 3GB,

J'ai transféré tes macros dans mon système primaire et j'ai fait plusieurs tests. Ça fonctionne parfaitement. J'ai utilisé la macro "Mise en page" qu'une seule fois, à la première ouverture de mon fichier, et la mise en page demeure en place même après avoir fermé le fichier plusieurs fois. C'est formidable.

Je n'ai qu'à indiquer la page dans les cellules appropriées et seule les pages avec données dans la zone de texte s'impriment. C'est exactement ce dont j'avais besoin.

Merci encore pour ton aide. Je ferme le dossier.

Salut golfeur,

Super, je suis content pour toi . Enfin, on y est arrivé !

Bonne continuation à toi !

Rechercher des sujets similaires à "impression feuilles donnees seulement"