VBA : Imprimer sauf si les lignes sont masquées

fannoche35 Messages postés 12 Statut Membre -  
cs_Le Pivert Messages postés 8437 Statut Contributeur -
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

  1. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Bonjour,

    comme ceci en début de Sub:

    If CheckBox10.Value = False Then Exit Sub

    0
    1. fannoche35 Messages postés 12 Statut Membre
       
      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
  2. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    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
    1. Jauster Messages postés 142 Statut Membre 42
       
      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
    2. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      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
    3. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      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
    4. fannoche35 Messages postés 12 Statut Membre
       
      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
    5. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      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