VBA : Imprimer sauf si les lignes sont masquées

Fermé
fannoche35 Messages postés 11 Date d'inscription jeudi 2 novembre 2017 Statut Membre Dernière intervention 12 mars 2018 - Modifié le 13 mars 2018 à 16:17
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 - 13 mars 2018 à 16:15
Bonjour,

J'ai créé une macro qui permet d'imprimer la page 1 en portrait la page 2 en paysage puis les autres pages en portrait (voir ci-dessous Sub Imprime())

J'ai d'autres macro qui permettent de masquer des plages de ligne entières en fonction de si une checkbox est cochée ou non (voir ci-dessous Sub Checkbox10_Click()).
Je souhaiterais faire en sorte que si ma plage de ligne 96 à 167 est masquée (car checkbox10 décochée), il n'y ait pas du tout d'impression.
Je rencontre en effet un problème d'impression de pages blanches

Merci d'avance pour votre aide



Sub Imprime()

'Impression de la 1ère page en portrait
'--------------------------------------
Range("A1:AX69").Select 'définition de la plage de cellules constituant la 1ère page
ActiveSheet.PageSetup.PrintArea = "$A$1:$AX$68" 'définition de la zone d'impression
ActiveSheet.PageSetup.Orientation = xlPortrait 'mise au format portrait
ActiveSheet.PageSetup.CenterHorizontally = True 'centrage horizontal de la feuille
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True 'impression

'Impression de la 2ème page en paysage
'-------------------------------------
Range("A70:CM95").Select 'définition de la plage de cellules constituant la 2ème page
ActiveSheet.PageSetup.PrintArea = "$A$70:$CM$95" 'définition de la zone d'impression
ActiveSheet.PageSetup.Orientation = xlLandscape 'mise au format paysage
ActiveSheet.PageSetup.CenterHorizontally = True 'centrage horizontal de la feuille
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True 'impression

'Impression de la 3ème page en portrait
'--------------------------------------
Range("A96:AX166").Select 'définition de la plage de cellules constituant la 3ème page
ActiveSheet.PageSetup.PrintArea = "$A$96:$AX$166" 'définition de la zone d'impression
ActiveSheet.PageSetup.Orientation = xlPortrait 'mise au format portrait
ActiveSheet.PageSetup.CenterHorizontally = True 'centrage horizontal de la feuille
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True 'impression

'Impression de la 4ème page en portrait
'--------------------------------------
Range("A167:AX237").Select 'définition de la plage de cellules constituant la 4ème page
ActiveSheet.PageSetup.PrintArea = "$A$167:$AX$237" 'définition de la zone d'impression
ActiveSheet.PageSetup.Orientation = xlPortrait 'mise au format portrait
ActiveSheet.PageSetup.CenterHorizontally = True 'centrage horizontal de la feuille
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True 'impression



Sub CheckBox10_Click()
If CheckBox10.Value = True Then
    Rows("96:167").EntireRow.Hidden = False
       Else
    Rows("96:167").EntireRow.Hidden = True
    End If
End Sub

2 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
22 nov. 2017 à 17:09
Bonjour,

comme ceci en début de Sub:

If CheckBox10.Value = False Then Exit Sub

0
fannoche35 Messages postés 11 Date d'inscription jeudi 2 novembre 2017 Statut Membre Dernière intervention 12 mars 2018
1 mars 2018 à 10:17
Bonjour,

Désolée pour le temps de réponse...
Merci pour ton aide cs_Le Pivert
Je n'ai pas qu'une check box mais plusieurs :
Je voudrais que la page 1 et 2 s'impriment toujours
que la page 3 s'imprime si checkbox1 cochée
que la page 4 s'imprime si checkbox 1 ou 3 ou 21 cochées
que la page 5 et 6 s'imprime si la checkbox 6 est cochée
que la page 7 s'imprime si la checkbox 2 est cochée
que la page 8 s'imprime si la checkbox 24 est cochée
que la page 9 s'imprime si la checkbox 23 est cochée
que la page 10 s'imprime si la checkbox 3 est cochée
que la page 11 s'imprime si la checkbox 21 est cochée
que la page 12 et 13 s'imprime si la checkbox 5 est cochée
etc...
De plus avec mon Sub Imprime, je n'arrive pas à imprimer les page dans un seul document pdf, cela me fiat plusieurs documents séparés. y a t-il une solution pour ça ?
Merci d'avance
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
1 mars 2018 à 11:59
De plus avec mon Sub Imprime, je n'arrive pas à imprimer les page dans un seul document pdf, cela me fiat plusieurs documents séparés. y a t-il une solution pour ça ?

Voir ceci, tu auras la réponse à ta question:

http://www.mdf-xlpages.com/modules/newbb/viewtopic.php?post_id=7055

Ensuite il suffit d'adapter cette ligne en fonction des CheckBox cochées


 Sheets(Array("Feuil1", "Feuil2", "Feuil3")).Select


Voilà
0
Jauster Messages postés 126 Date d'inscription jeudi 7 décembre 2017 Statut Membre Dernière intervention 31 août 2018 40
Modifié le 1 mars 2018 à 12:14
Hello,

Je débute depuis peu en VBA, et pour m'amuser et m'améliorer j'ai souhaité raccourcir le code de fannoche35, sans succès. Aurais-tu une piste ou une idée de pourquoi ca ne marche pas ? Surement à cause de ces page(i) que j'ai mal déclaré...

PS : sans prendre en compte les checkboxes

Sub Imprime()
Dim page1 As String, page2 As String, page3 As String, page4 As String

page1 = "A1:AX69"
page2 = "A70:CM95"
page3 = "A96:AX166"
page4 = "A167:AX237"

    For i = 1 To 4
    
        With ActiveSheet.PageSetup
        
            If i = 2 Then
                Set c = xlLandscape
                Else: c = xlPortrait
            End If
        
        .PrintArea = "page" & i 'définition de la zone d'impression
        .Orientation = c 'mise au format portrait
        .CenterHorizontally = True 'centrage horizontal de la feuille
        End With
    Next i

'ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True 'impression
End Sub

0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
1 mars 2018 à 13:54
Voir ceci pour les tableaux:

https://silkyroad.developpez.com/vba/tableaux/#LVI

Sub Imprime()
  Dim NomTableau As Variant
    Dim i As Integer
   NomTableau = Array("A1:AX69", "A70:CM95", "A96:AX166", "A167:AX237")
For i = LBound(NomTableau) To UBound(NomTableau)
        MsgBox NomTableau(i)
          With ActiveSheet.PageSetup
        .PrintArea = NomTableau(i) 'définition de la zone d'impression
        End With
    Next i
End Sub


@+
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
Modifié le 2 mars 2018 à 12:47
fannoche35,

voici le principe pour ne pas faire une usine à gaz:

Tu mets dans chaque Feuille la sélection correspondante qui se déclenchera avec l’événement Activate de la Feuille comme ceci:

Option Explicit
Private Sub Worksheet_Activate()
Range("A1:AX69").Select 'définition de la plage de cellules constituant la 1ère page 
ActiveSheet.PageSetup.PrintArea = "$A$1:$AX$68" 'définition de la zone d'impression 
ActiveSheet.PageSetup.Orientation = xlPortrait 'mise au format portrait 
ActiveSheet.PageSetup.CenterHorizontally = True 'centrage horizontal de la feuille 
End Sub


voir l'evenement Feuille ici:

https://silkyroad.developpez.com/VBA/FeuilleDeCalcul/#LII-A-1

Ensuite la caption de chaque CheckBox sera mis au nom de la Feuille correspondante

On fera une boucle sur la collection des checkBox que l'on affichera dans une listbox

https://silkyroad.developpez.com/VBA/ControlesUserForm/#LI-B

Il faudra aussi une ListBox pour afficher les Feuilles sélectionnées.

Voilà le code pour 3 feuilles à toi de l'adapter pour toutes tes feuilles:

Option Explicit
'http://www.mdf-xlpages.com/modules/newbb/viewtopic.php?post_id=7055
'http://silkyroad.developpez.com/VBA/ControlesUserForm/#LI-B
'http://silkyroad.developpez.com/VBA/FeuilleDeCalcul/#LII-A-1
Private Sub CommandButton1_Click()
Dim Ctrl As Control
Dim sRep As String
Dim sFilename As String
Dim nom As String
Dim nombre As Integer 'nombre de feuille
ListBox1.Clear
'Boucle sur la collection de contrôles mettre la Caption des checkBox au nom des feuilles
For Each Ctrl In Me.Controls
    If TypeOf Ctrl Is MSForms.CheckBox Then
  If Ctrl.Object.Value = True Then
ListBox1.AddItem (Ctrl.Caption)
  End If
  End If
Next Ctrl
nombre = ListBox1.ListCount 'nombre de feuille
Select Case nombre
Case Is = 1
Sheets(Array(ListBox1.List(0))).Select
nom = "_1"
Case Is = 2
Sheets(Array(ListBox1.List(0), ListBox1.List(1))).Select
nom = "_2"
Case Is = 3
Sheets(Array(ListBox1.List(0), ListBox1.List(1), ListBox1.List(2))).Select
nom = "_3"
End Select
sRep = ThisWorkbook.Path & "\" 'chemin du dossier
    sFilename = Replace(ThisWorkbook.Name, ".xlsm", "") 'nom seul sans extension
    sFilename = sFilename & nom & ".pdf"
ActiveSheet.ExportAsFixedFormat _
            Type:=xlTypePDF, _
            Filename:=sRep & sFilename, _
            Quality:=xlQualityStandard, _
            IncludeDocProperties:=True, _
            IgnorePrintAreas:=False, _
            OpenAfterPublish:=True
            MsgBox "Enregistrer dans le même dossier que ce classeur au nom du classeur et du nombre de feuilles"
End Sub



Voici un exemple à télécharger

https://www.cjoint.com/c/HCckXMKk4QQ


Bon courage

@+ Le Pivert
0
fannoche35 Messages postés 11 Date d'inscription jeudi 2 novembre 2017 Statut Membre Dernière intervention 12 mars 2018
8 mars 2018 à 14:26
Bonjour cs_Le Pivert,
Je nage...
Moi qui débute en autoformation c'est très compliqué ! Je vais travailler dessus.
Merci pour ton aide.
(ps: le lien de l'exemple à télécharger, n'est pas ou plus actif)
Bonne journée
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
8 mars 2018 à 14:36
Moi qui débute en autoformation c'est très compliqué ! Je vais travailler dessus.

Ce que tu demandes n'est pas compliqué, mais c'est une usine à gaz à paramétrer pour chaque cas de figure!

(ps: le lien de l'exemple à télécharger, n'est pas ou plus actif

il est valable 4 jours

https://www.cjoint.com/c/HCinG0bQBSQ

Voilà
0