IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Sélectionner un onglet pour impression en PDF selon conditions d'une cellule [XL-365]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Deviseur
    Inscrit en
    Août 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Deviseur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2021
    Messages : 5
    Par défaut Sélectionner un onglet pour impression en PDF selon conditions d'une cellule
    Bonjour.

    Je dispose d'un fichier qui me sert à faire mes devis et que je développe au fur et à mesure sauf que là, je sèche.

    J'ai plusieurs onglets, dont 2 qui seront tout le temps imprimés (Accomp et PageGarde)
    Les autres (RENOVATION, ELECTRICITE, et PLOMBERIE) doivent être sélectionnés selon la valeur d'une cellule en particulier sur chacun (le montant devisé sur chaque onglet). Si égal à Zéro, il ne doit pas être sélectionné ni imprimé.

    Le bouton qui me sert à imprimer le devis en pdf est sur l'onglet PageGarde.
    Avant d'imprimer, je dois nettoyer pour la mise en page.
    Ci-dessous la logique souhaitée:
    1) Sur cette page, je masque les lignes dont les totaux sont égal à zéro entre F54 et F58. Cela fonctionne bien. Rien à corriger.
    2) Sur cette même page, les cellules C31 et C32 sont déjà remplies et je souhaite faire glisser les cellules C41 et C42 sur la première ligne disponible après C32.
    La formule que j'ai inscrite me permet simplement un couper/coller en C33 sans tenir compte de la valeur des cellules entre C32 et C40. Si j'ai une valeur en C33 et C34, c'est écrasé.
    Je ne trouve pas de formules adaptées même en essayant avec une formule du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Sheets("PageGarde").Cells(Rows.Count, 1).End(xlUp)(2).PasteSpecial xlPasteValues
    Application.CutCopyMode = False
    3) Enfin, l'impression.
    "Accomp" et "PageGarde" à imprimer en permanence.
    L'onglet "RENOVATION" dépend de la valeur de la cellule nommée "Total_remisé_RENOVATION_HT"
    L'onglet "ELECTRICITE" dépend de la valeur de la cellule nommée "Total_remisé_ELECTRICITE_HT"
    L'onglet "PLOMBERIE" dépend de la valeur de la cellule nommée "Total_remisé_PLOMBERIE_HT"
    Si égal à "" ou à "0", il ne doit pas être imprimé
    Si valeur >0, doit être sélectionné puis imprimé.

    Actuellement la formule que j'ai (mais qui m'imprime tous les onglets) est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Sub IMPRIMER_TEST()
    '
    ' IMPRIMER_TEST Macro
    '
    For Each cellule In [F54:F58]
        If cellule.Value = "" Then cellule.EntireRow.Hidden = True
    Next cellule
     
    Range("C41:C42").Select
    Selection.Cut
    Range("C33").Select
    ActiveSheet.Paste
     
    Dim Chemin As String, fichier As String
    Chemin = ThisWorkbook.Path
     
    Sheets(Array("Accomp", "PageGarde", "RENOVATION", "ELECTRICITE", "PLOMBERIE")).Select
    Sheets("Accomp").Activate
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
    Chemin & "\" & Range("NUM_AFFAIRE") & " " & Range("REVISION") & " - " & Range("CLIENT_NOM") & " " & Range("CLIENT_PRENOM") & " - " & Range("OBJET_DEVIS") & " - DEVIS" & ".pdf" _
        , Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas _
        :=False, OpenAfterPublish:=False
    End Sub

    Merci par avance pour votre aide.

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Voici comment je pratique.
    Dans une boucle, vérifier si la feuille doit être présente dans le devis suivant vos critères, si le test logique est VRAI, copier la feuille dans un nouveau classeur et ainsi de suite (La première feuille est copiée avec la méthode Copy de l'objet WorkSheet et sans argument, les suivantes avec l'argument After et en précisant l'objet Workbook qui est celui qui vient d'être créé par la copie précédente.
    Ensuite, imprimer le classeur nouvellement créé et finalement fermer le classeur, en le sauvant ou pas

    Attention : Effectuer la boucle dans l'ordre des pages à imprimer
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Technicien bureau d'étude
    Inscrit en
    Avril 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien bureau d'étude

    Informations forums :
    Inscription : Avril 2018
    Messages : 2
    Par défaut
    Bonjour,

    Pour le point numéro 2 je te propose cette solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim R As Range
    Dim numeroLigne As Integer
     
    Set R = Sheets("Feuil1").Range("C32:C40")
    numeroLigne = R.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlNext, LookIn:=xlFormulas).Row
    Cordialement,

    Pierre

  4. #4
    Membre émérite Avatar de Alex020181
    Homme Profil pro
    Prestataire informatique développeur d'application Excel, Access, VBA
    Inscrit en
    Juin 2012
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Prestataire informatique développeur d'application Excel, Access, VBA

    Informations forums :
    Inscription : Juin 2012
    Messages : 601
    Par défaut
    Bonjour,

    En PJ une proposition de code qui réalise l'ensemble de ta demande.

    Pour info je ne suis pas d'accord avec la partie de ton code qui gère le masquage éventuel des lignes 54 à 58.

    Tu dis

    je masque les lignes dont les totaux sont égal à zéro entre F54 et F58. Cela fonctionne bien. Rien à corriger.
    et tu utilises

    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    For Each cellule In [F54:F58]
        If cellule.Value = "" Then cellule.EntireRow.Hidden = True
    Next cellule

    Ce code ne masque pas les cellules dont la valeur est à 0 mais celles dont la valeur est "".

    Dans le fichier proposé j'ai repris cette façon de faire mais en modifiant pour que les 0 soient masqués et non pas les "".

    Pour sélectionner les feuilles à inclure dans le pdf pas besoin de créer un fichier supplémentaire. Il te suffit de compléter un tableau et ensuite de lancer la création avec ce tableau.

    Teste et dis nous.
    Fichiers attachés Fichiers attachés

  5. #5
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 579
    Par défaut
    Bonjour,
    C'est inutile de tester un booléen si c'est pour affecter la même valeur à un autre booléen!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each cellule In [F54:F58]
        cellule.EntireRow.Hidden = cellule.Value = ""
    Next cellule

  6. #6
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour Alex,
    Pour sélectionner les feuilles à inclure dans le pdf pas besoin de créer un fichier supplémentaire.
    Ce n'est pas pour le plaisir que je préconise la création d'un classeur pour exporter en pdf ou même pour imprimer plusieurs feuilles mais tout simplement pour éviter qu'en cas de déplacement de feuilles dans le classeur actif l'ordre des feuilles ne soit pas celui qui est souhaité et l'ordre des éléments dans l'array n'y change rien

    [EDIT]
    Je constate que l'initiateur de cette discussion ouverte le 14/08 est resté muet à nos réactions. Cela fait toujours plaisir.
    C'est d'ailleurs la raison qui me pousse à ne plus publier de réponses circonstanciées avec code à l'appui vu le peu de réaction de ceux qui posent des questions.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Deviseur
    Inscrit en
    Août 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Deviseur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2021
    Messages : 5
    Par défaut
    Bonjour à tous

    Je suis resté muet cette semaine effectivement car énormément de travail en dehors du bureau. Veuillez m'en excuser.

    Je tiens à vous remercier tous les 3 pour vos réponses, et rapides qui plus est.

    Dans un premier temps, mes compétences en VBA sont limitées, je comprends certaines lignes de code mais d'autres me semblent très élaborées.
    J'adapte les lignes de code en fonction des solutions apportées sur les différents forums.
    Jusque là, j'ai réussi à les adapter à mes besoins mais là j'avais besoin de votre aide.

    Je ne connais pas le principes des boucles comme le préconise Philippe TULLIEZ.

    J'ai essayé le code de Habbo3 mais rien ne se produit.

    J'ai essayé la solution d'Alex020181 et celle-ci fonctionne très bien.
    Pour répondre à ta question, j'ai utilisé les "" car dans les totaux j'avais parfois des #valeurs et je voulais conserver les lignes vides pour les afficher ou masquer au besoin.

    Un grand merci à tous pour votre participation.
    Vous m'avez fait gagner du temps, et il est pour chacun précieux.

    J'en profite pour préciser que j'ai reconnu vos pseudos et que l'ensemble de mon devis a été élaboré grâce à vos conseils et recommandations auprès de d'autres personnes sur différents sujets.
    Je vous en suis très reconnaissant.



  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je ne connais pas le principes des boucles comme le préconise Philippe TULLIEZ.
    Alors à la lecture de votre demande
    J'ai plusieurs onglets, dont 2 qui seront tout le temps imprimés (Accomp et PageGarde)
    Les autres (RENOVATION, ELECTRICITE, et PLOMBERIE) doivent être sélectionnés selon la valeur d'une cellule en particulier sur chacun (le montant devisé sur chaque onglet). Si égal à Zéro, il ne doit pas être sélectionné ni imprimé.
    Je comprends que votre classeur contient plusieurs feuilles dont deux doivent toujours être imprimées et d'autres comme par exemple (RENOVATION, ELECTRICITE, et PLOMBERIE) ne le doivent que sous conditions
    Ainsi, l'idée est de parcourir chaque feuille concernée et vérifier si elle répond aux conditions or pour effectuer ce travail, il n'y a pas 36 façons de faire en programmation, il faut utiliser une boucle

    Organisation
    Comme je privilégie toujours de faire la maximum de travail avec les fonctionnalités natives d'excel, je vais prévoir dans chaque feuille concernée par le devis une cellule nommée pToBePrint de portée feuille (celle qui l'a contient) et qui renverra simplement VRAI ou FAUX

    Illustration du gestionnaire des noms affichant les cellules nommées de portée feuille
    Nom : Cellules nommées.png
Affichages : 93
Taille : 7,3 Ko

    Pour l'exemple la formule contenue dans la cellule nommée pToBePrint de la feuille nommée [Electricité] sera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SOMME(t_ElectricityQuote[Total])>0
    Pour les feuilles qui doivent impérativement être imprimées, il y a lieu de mettre simplement VRAI dans la cellule nommée

    Illustration du tableau structuré nommé t_Sheets2Export
    Pour nous faciliter la maintenance et surtout prévoir le futur, une autre feuille pouvant devait s'ajouter, comme par exemple [PLAFONNAGE], nous placerons dans une feuille nommée [Parameter], un tableau structuré à deux colonnes avec en première colonne, le nom de la feuille et en seconde colonne l'ordre de sortie à l'imprimante

    Nom : Parameter - .png
Affichages : 67
Taille : 3,8 Ko

    La programmation

    Elle se résume à deux fonctions génériques et une procédure nommée Main

    Fonction GetArray

    Cette fonction va renvoyer la table contenant les noms des feuilles à imprimer et qui répondent donc aux conditions soit avoir VRAI dans la cellule nommée pToBePrint
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function GetArray(TableName As String, CellName As String) As Variant
      ' Renvoie une table avec le nom des feuilles dont la cellule nommée par CellName renvoie VRAI
      ' Arguments
      '   TableName  Nom de la colonne du tableau structuré
      '   CellName   Nom de la cellule nommée de portée feuille qui doit contenir VRAI ou FAUX
      Dim Tt As Variant, Jt As String, El As Integer
      Tt = Application.Transpose(Range(TableName).Value)
      For El = LBound(Tt) To UBound(Tt)
       If Worksheets(Tt(El)).Range(CellName).Value Then Jt = Jt & IIf(Len(Jt), ";" & Tt(El), Tt(El))
      Next
      GetArray = Split(Jt, ";")
    End Function
    Fonction CopySheets

    Cette fonction que j'utilise depuis un certain nombre d'années, se charge de copier les feuilles dans un nouveau classeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    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
    32
    Function CopySheets(SheetsList As Variant, Optional oWorkbook As Workbook) As Workbook
      ' Renvoie un objet classeur représentant le nouveau classeur contenant les copies
      '   Effectue la copie des feuilles dans unnouveau classeur
      ' Author  : Philippe Tulliez (www.magicoffice.be)
      ' Version : 1.2
      ' Arguments
      '   SheetsList        Array contenant le nom des feuilles à copier
      '   [oWorkbook]       Objet Workbook parent des feuilles à copier (d:=ActiveWorkbook)
      '
      ' Déclaration et assignation des variable
      Dim Sht As Worksheet  ' Objet feuille utilisé dans la boucle
      Dim Nwk As Workbook   ' Objet représentant le nouveau classeur construit avec les feuilles copiées
      Dim Shn As Integer    ' Variable de la boucle
      Dim CnC As Byte       ' Compteur des copies
      If oWorkbook Is Nothing Then Set oWorkbook = ActiveWorkbook
      '
      With oWorkbook
        For Shn = LBound(SheetsList) To UBound(SheetsList)
          Set Sht = .Worksheets(SheetsList(Shn))
          ' Copie des feuilles répondant aux critères
          If CnC Then
             Sht.Copy After:=Nwk.Worksheets(Nwk.Worksheets.Count)
            Else
             Sht.Copy
             Set Nwk = ActiveWorkbook
             CnC = CnC + 1
          End If
        Next
      End With
      Set CopySheets = Nwk
      Set Nwk = Nothing: Set Sht = Nothing
    End Function
    Procédure Main
    Cette procédure invoque les deux fonctions précédentes et se charge d'imprimer le classeur nouvellement créé et le ferme ensuite.
    On pourrait ajouter une ligne pour sauver ce classeur, l'exporter en pdf et ainsi de suite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub main()
      Dim Ts As Variant
      Dim Wkb As Workbook
      Ts = GetArray("t_Sheets2Export[Name]", "pToBePrint") ' Renvoie ls liste des noms de feuilles à traiter
      Application.ScreenUpdating = False
      Set Wkb = CopySheets(Ts)
      With Wkb
      .PrintOut                 ' Impression du classeur
      .Close SaveChanges:=False ' Fermeture du classeur sans le sauver
      End With
      Set Wkb = Nothing
    End Sub
    J'espère que mon explication vous aura aidé à mieux comprendre l'intérêt de la boucle
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  9. #9
    Nouveau candidat au Club
    Homme Profil pro
    Technicien bureau d'étude
    Inscrit en
    Avril 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien bureau d'étude

    Informations forums :
    Inscription : Avril 2018
    Messages : 2
    Par défaut
    Citation Envoyé par PANANTES Voir le message
    Bonjour à tous

    J'ai essayé le code de Habbo3 mais rien ne se produit.
    Bonjour,

    Si vous exécuter le code au pas à pas vous verrez que la variable numeroLigne contient le numéro de la dernière ligne remplit après C32 et avant C40, vous n'avez plus qu'à y ajouter 1 pour avoir la prochaine ligne vide et remplacer votre Rows.Count par la variable.
    Je ne savais pas qu'on devait tous coder à votre place. Avez-vous au moins essayer de comprendre toutes les solutions que nous vous avons donné ou avez-vous juste appuyer sur F5 sans réfléchir ?

    Juste faire des copier coller ne vous ferons pas avancer (malheureusement).

    Cordialement

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Deviseur
    Inscrit en
    Août 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Deviseur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2021
    Messages : 5
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Merci pour cette explication très détaillée qui m'aide à comprendre la logique.

    Citation Envoyé par Habbo3 Voir le message
    Bonjour,

    Je comprends votre point de vue, et comme j'ai déjà pu le dire plus haut, merci d'avoir pris le temps de m'aider.

    Je ne fais pas un vulgaire "copier connerie", j'essaye de comprendre et de m'adapter.
    C'est d'ailleurs ce que j'ai fait pour le code d'Alex020181 auquel j'ai rajouté des paramètres divers (onglets protégés et masqués), etc..
    J'ai tenté de reprendre votre code mais je n'y suis parvenu.
    Le vocabulaire VBA est, vu de l'extérieur, complexe. Je ne suis pas spécialiste en la matière et le reconnais volontiers.
    Je suis assez pédagogue, j'aime bien comprendre étape par étape mais quand je n'y arrive pas je m'en remets aux autres.


    Transposons, je vous demande demain de me câbler une armoire électrique industrielle en vous donnant du câble, un tournevis et une pince, à l'appui une photo, et vous dit, c'est comme ça qu'il faut faire...

    VBA est riche de possibilités mais il faut y aller step by step.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'ouverture de fichiers en série pour impression en pdf
    Par CeluiQuiCherche dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/06/2021, 13h55
  2. Changement font pour impression en pdf
    Par zanki dans le forum Débuter
    Réponses: 2
    Dernier message: 14/09/2018, 22h32
  3. [XL-2010] Changer de workbook pour impression en pdf
    Par shakapouet dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/06/2012, 10h57
  4. [XL-2010] Enregistrement PDF avec pour nom de fichier le contenu d'une cellule.
    Par Julzz dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/01/2012, 11h46
  5. Réponses: 6
    Dernier message: 28/06/2007, 10h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo