Imprimer Sélection sur plusieurs feuilles.

Résolu
Nai Messages postés 709 Date d'inscription   Statut Membre Dernière intervention   -  
Nai Messages postés 709 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour :)
Je souhaite pouvoir imprimer la sélectionner de chacune des feuilles sélectionnées.
Je m'explique :
Sub Test_Imprime_P1()
Sheets(10).Select
Range("A34:K91").Select
Range(Selection, Selection.End(xlDown)).Select
ActiveWindow.Selection.PrintPreview
End Sub

Ce code me sélectionne la feuille numéro 10 (je ne peux pas nommer la feuille puisqu'elle est amené à changer de nom). Il me sélectionne la zone A34:K91 de la feuille sélectionnée, puis me propose l'aperçu avant impression.

Je souhaite effectuer la même chose, mais sur 30 feuilles. J'ai pensé à :
Sub Test_Imprime_P1()
Worksheets(Array((10), (11), (12), (13))).Select 'le mieux serait de pouvoir indiquer de 2 à 16 ET de 27 à 41
Range("A34:K91").Select
Range(Selection, Selection.End(xlDown)).Select
ActiveWindow.Selection.PrintPreview
End Sub

Mais ça ne marche pas :/

Aussi, plutôt que le PrintPreview, j'aurais préféré que la macro me renvoi vers l'onglet Imprimer du menu d'Excel. Ca permettra à l'utilisateur non seulement de prévisualiser son impression, mais aussi de modifier ses préférences d'impression.

Merci d'avance de votre aide ! :)



--
Bien à vous,
Naï
ps: je surveille tous mes sujets non résolus, si solution vous avez, je la lirais à coup sûr :)

7 réponses

  1. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Voir ceci pour imprimer directement sans prévisualisation:

    https://silkyroad.developpez.com/VBA/FeuilleDeCalcul/#LII-A-19
    1
    1. Nai Messages postés 709 Date d'inscription   Statut Membre Dernière intervention   56
       
      Très intéressante cette liste :)
      Mais ce n'est pas ce que je cherche ^^
      Je suis parvenu à ceci :
      Sub macro()
      Dim Feuille
      For Each Feuille In ActiveWorkbook.Sheets
       If Feuille.Index > 1 And Feuille.Index < 16 Then
       Feuille.Select
        Range("A34:K91").Select
        End If
      Next
      Sheets(Array((2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16))).PrintOut Copies:=1, _
      Collate:=True
      End Sub
      

      L'argument Collate me faisait défaut. Là, tout fonctionne, à une exception : Pas d'aperçu :/ Le document est assemblé et imprimé sans aperçu et sans pouvoir sélectionner l'imprimante à utiliser.
      A ce propos, j'aurais pu utiliser l'argument ActivePrinter, mais cela ne fait que choisir l'imprimante, toujours sans afficher l'aperçu :/
      J'ai besoin que l'utilisateur puisse avoir un aperçu avant impression. Problème, quand je tente :
      Sub macro()
      Dim Feuille
      For Each Feuille In ActiveWorkbook.Sheets
       If Feuille.Index > 1 And Feuille.Index < 16 Then
       Feuille.Select
        Range("A34:K91").Select
        End If
      Next
      Sheets(Array((2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16))).PrintPreview Collate:=True
      End Sub
      
      ou
      Sub macro()
      Dim Feuille
      For Each Feuille In ActiveWorkbook.Sheets
       If Feuille.Index > 1 And Feuille.Index < 16 Then
       Feuille.Select
        Range("A34:K91").Select
        End If
      Next
      Sheets(Array((2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16))).PrintPreview Copies:=1, _
      Collate:=True
      End Sub
      

      Ca ne marche pas :/

      On est pas loin du bout ! :)
      Encore merci !
      0
  2. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Si la 1ère macro fonctionne, pourquoi ne pas mettre cela au début de la macro avant la boucle. Elle ne s'affichera qu'une fois seulement et l'utilisateur pourra faire son choix:

     Sheets("nom de la 1ère feuille").Range("A34:K91").Select
    Application.Dialogs(xlDialogPrint).Show
    ActiveWindow.Selection.PrintPreview 

    1
    1. Nai Messages postés 709 Date d'inscription   Statut Membre Dernière intervention   56
       
      Merci et désolé pour le temps de réaction ^^

      La macro donne donc ceci :
      Sub print_p1()
      
      Sheets("Accueil").Range("A34:K91").Select
      Application.Dialogs(xlDialogPrint).Show
      ActiveWindow.Selection.PrintPreview
      
      Dim Feuille
      For Each Feuille In ActiveWorkbook.Sheets
       If Feuille.Index > 1 And Feuille.Index < 16 Then
       Feuille.Select
        Range("A34:K91").Select
        End If
      Next
      Sheets(Array((2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16))).PrintOut Copies:=1, _
      ActivePrinter:="", _
      Collate:=True
      End Sub
      

      Ça fonctionne relativement bien ! :D
      Les seuls hics, mais je chipote un soupçon :
      - La macro a pour effet de lancer deux impressions distinctes (mais qu'importe).
      - Par contre, je n'ai l'aperçu que de la première feuille (finalement, ça importe moins que je ne le pensais)
      - Plus important, est-ce qu'il est possible de ne pas nommer la feuille par son nom mais par son chiffre (en l'occurrence, "Feuil2" et non "Machin") ?
      0
  3. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Oui l'on peut nommer son nom par son chiffre, c'est le CodeName. Voir ceci:

    'http://silkyroad.developpez.com/VBA/FeuilleDeCalcul/
    Dim Ws As Worksheet
    'Boucle sur toutes les feuille de calcul du classeur. Les onglets graphiques ne sont pas pris
    'en compte.
    'ThisWorkbook correspond à l'objet classeur contenant la macro
    For Each Ws In ThisWorkbook.Worksheets
        'Renvoie le CodeName de chaque feuille
        MsgBox Ws.CodeName
    Next Ws


    Je pense que vu tes connaissances tu pourras l'adapter à tes besoins
    1
    1. Nai Messages postés 709 Date d'inscription   Statut Membre Dernière intervention   56
       
      Merci pour cette réponse :)
      J'ai résolu le problème avec :
      Sub print_p1()
      Application.ScreenUpdating = False
      Dim Feuille
      For Each Feuille In ActiveWorkbook.Sheets
       If Feuille.Index > 1 And Feuille.Index < 31 Then
       Feuille.Select
       Range("A34:K91").Select
        End If
      Next
      Application.Dialogs(xlDialogPrint).Show
      Sheets(Array((2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), (20), (21), (22), (23), (24), (25), (26), (27), (28), (29), (30), (31))).PrintOut Copies:=1, _
      ActivePrinter:="", _
      Collate:=True
      Call Impression.selectionner
      Application.ScreenUpdating = True
      End Sub

      Mais je ne comprend pas, j'ai plusieurs impression (dont certaines non demandées). Si j'ai bien compris, le Sheets array demande le numéro de la feuille dans l'ordre d'affichage. Ce sont donc les 30 premières feuilles à partir de la deuxième. Mais je n'indique donc pas le numéro spécifique de la feuille (Feuil1, Feuil2, etc...)
      Qu'est-ce que ça imprime de votre côté ? https://www.cjoint.com/c/EEeuZs4bfbT
      0
    2. Nai Messages postés 709 Date d'inscription   Statut Membre Dernière intervention   56
       
      J'ai également deux fois la feuille de l'atelier 14 (Feuil40)...
      0
  4. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    si tu m'avais dit cela dès le départ, on aurait perdu moins de temps!!

    Ça t'imprime les ateliers Machin à Plantes et 1 à 15 ?


    Le problème vient de la sélection des feuilles. Je ne peux pas deviner les feuilles à copier quand tu mets:

    Sheets(Array((2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), (20), (21), (22), (23), (24), (25), (26), (27), (28), (29), (30), (31))).PrintOut Copies:=1, _
    ActivePrinter:="", _
    Collate:=True
    


    pour moi ceux sont les feuilles de 2 à 31!

    voici donc le code qui fonctionne pour imprimer les feuilles Machin à Plantes et les feuilles de 1 à 15:

    Sub print_p1()
    Application.ScreenUpdating = False
    Dim Feuille
    For Each Feuille In ActiveWorkbook.Sheets
     If Feuille.Index > 1 And Feuille.Index < 17 Then 'Feuilles Machin à Plantes
     Feuille.Select
     Range("A34:K91").Select
     Worksheets(Feuille.Name).PrintOut Copies:=1, _
    ActivePrinter:="", _
    Collate:=True
    Call Impression.selectionner
    End If
    Next
    For Each Feuille In ActiveWorkbook.Sheets
     If Feuille.Name >= 1 And Feuille.Name <= 15 Then 'Feuille' de 1 à 15
    Feuille.Select
     Range("A34:K91").Select
     Worksheets(Feuille.Name).PrintOut Copies:=1, _
    ActivePrinter:="", _
    Collate:=True
    Call Impression.selectionner
    End If
    Next
    Application.ScreenUpdating = True
    End Sub


    a adapter pour les autres impressions.

    1
    1. Nai Messages postés 709 Date d'inscription   Statut Membre Dernière intervention   56
       
      Désolé. Je tâcherais d'être plus précis à l'avenir ;)

      Effectivement, ça fonctionne beaucoup mieux ^^
      Aussi, peut-on faire apparaître la boite de dialogue de l'imprimante (une seule fois) ? Mon impression (recto verso) place la reliure sur le haut, je voudrais pouvoir la placer à gauche.

      Merci infiniment ! :)
      0
    2. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      C'est simple, comme ceci:

      Sub print_p1()
      Application.ScreenUpdating = False
      Dim Feuille
      Application.Dialogs(xlDialogPrint).Show 'affiche la boite de dialogue
      For Each Feuille In ActiveWorkbook.Sheets
       If Feuille.Index > 1 And Feuille.Index < 17 Then 'Feuilles Machin à Plantes
       Feuille.Select
       Range("A34:K91").Select
       Worksheets(Feuille.Name).PrintOut Copies:=1, _
      ActivePrinter:="", _
      Collate:=True
      Call Impression.selectionner
      End If
      Next
      For Each Feuille In ActiveWorkbook.Sheets
       If Feuille.Name >= 1 And Feuille.Name <= 15 Then 'Feuilles de 1 à 15
      Feuille.Select
       Range("A34:K91").Select
       Worksheets(Feuille.Name).PrintOut Copies:=1, _
      ActivePrinter:="", _
      Collate:=True
      Call Impression.selectionner
      End If
      Next
      Application.ScreenUpdating = True
      End Sub
      0
    3. Nai Messages postés 709 Date d'inscription   Statut Membre Dernière intervention   56
       
      Parfait !
      Si seulement j'avais été clair plus tôt ;)

      Merci !
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Bonjour,

    Peut-être cela:

    Application.Dialogs(xlDialogPrint).Show


    0
    1. Nai Messages postés 709 Date d'inscription   Statut Membre Dernière intervention   56
       
      Bonjour Le Pivert et merci :)
      Je suppose à la place de :
      ActiveWindow.Selection.PrintPreview

      Si oui, ça fonctionne presque. La boite de dialogue de l'imprimante s'ouvre en effet mais c'est la feuille active qui est cochée pour l'impression et non la sélection.
      0
  7. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Essaie ceci:

    Sub parcourir()
    Dim feuille
    For Each feuille In ActiveWorkbook.Sheets
     If feuille.Index > 1 And feuille.Index < 16 Then
     feuille.Select
      Range("A1:K91").Select
    Range(Selection, Selection.End(xlDown)).Select
    'ActiveWindow.Selection.PrintPreview ' au choix
    Application.Dialogs(xlDialogPrint).Show ' au choix
    End If
     Next
    End Sub
    


    0
    1. Nai Messages postés 709 Date d'inscription   Statut Membre Dernière intervention   56
       
      Merci pour cette réponse ! C'est super, ça fonctionne ^^
      Cependant, je dois accepter l'impression de chacune des feuilles. N'est-il pas possible d'afficher toutes les sélections pour une seule impression ?
      J'ai choisi :
      ActiveWindow.Selection.PrintPreview ' au choix

      Lorsque je lance la macro, j'ai l'aperçu de la sélection de la première feuille. J'imprime, et je passe à l'aperçu de la deuxième feuille, j'imprime, etc... pour les 16 feuilles.

      En tout cas, encore merci !
      0
  8. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
     
    Essaie ceci:

    Sub print_p1()
    Application.ScreenUpdating = False
    Dim Feuille
    For Each Feuille In ActiveWorkbook.Sheets
     If Feuille.Name > 1 And Feuille.Name < 31 Then
     Feuille.Select
     Range("A34:K91").Select
     Worksheets(Feuille.Name).PrintOut Copies:=1, _
    ActivePrinter:="", _
    Collate:=True
    Call Impression.selectionner
    End If
    Next
    Application.ScreenUpdating = True
    End Sub


    a adapter pour les autres impressions
    0
    1. Nai Messages postés 709 Date d'inscription   Statut Membre Dernière intervention   56
       
      Ça fonctionne correctement chez toi ?
      Ça t'imprime les ateliers Machin à Plantes et 1 à 15 ?

      Cette fois, je n'ai que les ateliers 2 à 15 :O
      J'ai tenté sans le :
      Call Impression.selectionner

      Des fois que ce soit ça qui gêne, mais non...

      En tout cas, merci pour ta patience :)
      0