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élection de feuilles via une liste cochable


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 106
    Points : 57
    Points
    57
    Par défaut Sélection de feuilles via une liste cochable
    Bonjour tout le monde.

    Voilà mon énigme.
    Je souhaiterais, via une imputbox ou autre, faire apparaitre la liste des feuilles non masquées dans mon classeur afin de sélectionner celles que l'on veut imprimer.

    Ensuite à partir de cette sélectioin lancer un bout de code du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Sheets(Array("Feuil1", "Feuil2",....)).selected
    ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
    Mais je ne sais pas comment créer un listing cochable de mes feuilles.
    J'ai essayé à partir d'un usf mais mon niveau vba est trop limité et j'étais vite bloqué.

    Help please.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    Tu as besoin de la propriété Visible pour trouver quelles feuilles sont visibles.
    Tu dois parcourir ta collection Sheets, et à chaque feuille, si elle est visible, tu rajoute un label et un checkbox (le label servira de texte à coté du checkbox: ce sera le nom de la feuille) dynamiquement dans ton userform.

    Tu auras grandement besoin de cette FAQ:
    http://excel.developpez.com/faq/?pag...laireDynamique

    Bon courage: ça ne sera pas facile du tout, car en plus tu dois programmer un espacement entre chaque "ligne" de ton userform, et aussi le redimensionner automatiquement en fonction du nombre de lignes.

  3. #3
    Membre régulier
    Inscrit en
    Février 2007
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 118
    Points : 74
    Points
    74
    Par défaut
    Voici un bout de code...

    Mais auparavant, tu dois créer une userform avec 1 Listbox et 2 Commandbutton. Dans les paramètres de la Listbox, il faut choisir pour le paramètre Multiselect l'option 1 - fmMultiSelectMulti

    J'espère que ça t'aidera...

    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
    Private Sub CommandButton1_Click()
     
    For Each ws In Worksheets
        UserForm1.ListBox1.AddItem (ws.Name)
    Next ws
     
    End Sub
     
    Private Sub CommandButton2_Click()
     
    For i = 0 To UserForm1.ListBox1.ListCount - 1
     
        If UserForm1.ListBox1.Selected(i) = True Then
           Sheets(UserForm1.ListBox1.List(i)).Select
           Sheets(UserForm1.ListBox1.List(i)).Activate
           ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:="NOM DE L'IMPRIMANTE", Collate:=True
    '       ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:= _
    '        "HP DeskJet 930C/932C/935C on Ne03:", Collate:=True
         End If
    Next i
    End Sub
    Bon courage...

  4. #4
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 106
    Points : 57
    Points
    57
    Par défaut
    Merci pour ton code, c'est exactement ici que j'en étais arrivé.
    J'ai mon usf avec un listbox contenant l'ensemble de mes feuilles visibles.

    Le problème avec ton code c'est que les feuilles sont imprimées une par une. Or en pied de page j'ai une pagination m'indiquant page/pages. Et du coup avec ce code toutes mes pages ont en pied : 1/1, ce qui ne convient pas.

    Je pensais plus à une selection globale regroupant tous les items selectionnés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Sheets(Array(".......")).select
    activewindow.selectedsheets.printout ....

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    Essaye déjà d'enregistrer:
    -sélection de plusieurs feuilles (avec la touche Ctrl)
    -et enregistrement

    L'enregistreur de macros est ton ami, et il répondra à la plupart de tes questions.

  6. #6
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 106
    Points : 57
    Points
    57
    Par défaut
    Justement quand je fais une selection à la souris de mes pages ça va bien, je sais faire, mais là c'est en fonction des items selectionnés dans la listbox.

    Avec ce code je sens que je suis pas loin de la solution mais je tourne autour sans mettre le doigt dessus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Dim Msg As String, i As Integer
        Msg = ""
        With UserForm1.ListBox1
            For i = 0 To .ListCount - 1
                    If .Selected(i) Then
                    Msg = Msg & Sheets(UserForm1.ListBox1.List(i))
                    End If
            Next i
        End With
     
        MsgBox Msg, , "Les feuilles à imprimer sont...."
        Sheets(Array(Msg)).PrintOut copies:=1, collate:=True
    Unload Me
    Le message box me disant les feuilles à imprimer n'est pas d'une grande utilitée, mais c'est la suite qui m'interesse.

    Qqun a une idée???

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    Non tu n'y es pas.

    Ce qu'il faut faire, c'est créer une variable tableau dynamique, tableau que tu agrandis d'une case et complète à chaque fois que tu rencontre une sélection.

    Rajoute donc ceci en début de procédure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim liste_feuilles() As String, taille_tableau As Integer
    Et en haut du module:
    Pour parcourir ta Listbox, c'est le bon code, mais il faut que tu modifies l'intérieur de ta condition comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    If .Selected(i) Then
            On Error Resume Next
            taille_tableau = UBound(liste_feuilles)
            If Err.Number <> 0 Then
                taille_tableau = 1
                ReDim liste_feuilles(1)
                Err.Clear
            Else
                taille_tableau=taille_tableau + 1
                ReDim Preserve liste_feuilles(taille_tableau)
            End If
            listes_feuilles(taille_tableau) = Sheets(i).Name
            On Error GoTo 0
        End If
    Tu n'auras plus qu'à passer ton tableau liste_feuilles dans ton Printout.

    Vu que je t'ai fait ce code, tu es prié de bien l'assimiler et le comprendre. Il utilise la gestion des tableaux dynamiques et la gestion des erreurs (pour ma part je fais toujours comme ça: c'est bien et ça mange pas de pain).

    Je n'ai rien testé: est-ce que ça marche?

  8. #8
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 106
    Points : 57
    Points
    57
    Par défaut
    En effet j'ai besoin d'une petite explication de texte sur ton code.
    Mais pour l'instant il ne fonctionne pas quand je rajoute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    liste_feuilles.PrintOut copies:=1, collate:=True
    il me surligne liste_feuilles et me dit "Qualificateur incorrect".

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    Normal: tu n'as pas compris que liste_feuilles était un tableau!

    La fonction Array() te renvoie un tableau, donc tu mets liste_feuilles à la place de Array, comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets(liste_feuilles).PrintOut copies:=1, collate:=True

  10. #10
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 106
    Points : 57
    Points
    57
    Par défaut
    Erreur "9"

    L'indice n'appartient pas à la selection.


    Maintenant j'ai bien intégré le fait que liste_feuilles est un tableau, mais je crois que ça pose un pb à excel.

    Si j'ai bien compris tu scan la listbox et tu inscrit dans un tableau les items selectionnés.
    Ce que je n'ai pas pigé c'est comment tu peux lui dire d'imprimer d'un coup l'ensemble des données de ce tableau.

    Désolé si ça parait trop lent mais ça fait 6 mois que je vivote sous VBA et là tu me sors un truc super aboutit (mille mercis) mais dont j'ai un peu de mal à comprendre la substance.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    Oups je n'avais pas vu: c'est dans ton script qu'il y a un problème.

    Les feuilles d'un classeur commencent à l'indice 1, pas à l'indice 0.

    Donc tu change très légèrement ta boucle for:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = 1 To .ListCount

  12. #12
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 106
    Points : 57
    Points
    57
    Par défaut
    Toujours la même erreur mais ça explique un phénomène bizarre que j'avais avec un autre ligne de code sur cette procédure!!!

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    Essaye d'exécuter au pas à pas ta procédure (touche F8), et dis-moi à quel endroit il plante.

    Ou alors tu me donne ton classeur, et je trouverai facilement d'où ça vient.

  14. #14
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 106
    Points : 57
    Points
    57
    Par défaut
    Alors :

    1. Quand je selectionne 1 item dans ma listbox, ton code fonctionne, cependant il imprime la feuille se trouvant avant (dans mon classeur) celle indiquée dans la listbox. J'ai essayé de remettre le compteur à partir de 0 dans ma boucle for..next, mais rien à faire.

    2. Quand je selectionne plusieurs item, ça plante en "erreur 9, L'indice ne se trouve pas dans la selection", à cet endroit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Sheets(liste_feuilles).PrintOut copies:=1, collate:=True

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    Je pense avoir trouvé la raison: à mon avis Sheets ne supporte pas les tableaux commençant à l'indice 1, ce qui expliquerait le décalage de 1 et le plantage à cet endroit.

    Donc finalement tu supprime cette ligne:
    Et tu mets ce code à la place de celui proposé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    If .Selected(i) Then
            On Error Resume Next
            taille_tableau = UBound(liste_feuilles)
            If Err.Number <> 0 Then
                taille_tableau = 0
                ReDim liste_feuilles(0)
                Err.Clear
            Else
                taille_tableau=taille_tableau + 1
                ReDim Preserve liste_feuilles(taille_tableau)
            End If
            listes_feuilles(taille_tableau) = Sheets(i).Name
            On Error GoTo 0
        End If
    J'espère que ce coup-ci ça marche.

  16. #16
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 106
    Points : 57
    Points
    57
    Par défaut
    Bonne nouvelle, ça imprime une sélection multiple d'items.
    Par contre ça décale toujours les feuilles.

    La première page imprimé est celle se trouvant avant dans mon classeur et du coup la dernière selectionnée n'est pas imprimée.

    Je comprend toujours pas ce décalage.

    J'ai essayé en recalant la boucle sur 1.

    ça ne doit pas venir du code. A mon avis c'est un autre truc inérent à excel.
    Mais on tient le bon bout.

  17. #17
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Points : 14
    Points
    14
    Par défaut
    Salut,
    Au lieu de charger dans ton tableau le nom de la feuille correspondant à l'indice, charge la valeur de ta ligne de ta listbox. ca évitera les soucis de base d'indice

    Cdt,

    Frednts

  18. #18
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    106
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 106
    Points : 57
    Points
    57
    Par défaut
    A priori en compensant ce décalage, ça fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    liste_feuilles(taille_tableau) = Sheets(i + 1).Name


    A voir si ça tient la route, mais à priori oui.
    En tous cas merci pour ton acharnement thérapeutique et pour tes explications.

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    753
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 753
    Points : 855
    Points
    855
    Par défaut
    C'est vraiment pas du tout évident quand on a pas de support pour comprendre qu'est-ce qui ne colle pas.

    @frednts:
    Ca je n'en suis pas convaincu: si tu charge le tableau avec les mêmes données il n'y a pas de raison que le résultat soit différent.

  20. #20
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Points : 14
    Points
    14
    Par défaut
    @decodelite,

    Si :
    Il y a un soucis de décalage : l'indice de la combo commence à 0, celui des feuilles à 1, puisque buhrne incrémente son indice pour récupérer le nom de la feuille à prendre.
    Si il charge directement son tableau de noms avec le texte de sa ligne de combo (qu'il a initialement chargé avec la liste des noms de feuilles), il aura tout de suite le bon nom par rapport à sa ligne sélectionnée.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 10
    Dernier message: 15/07/2012, 13h18
  2. [Toutes versions] Recopier un tableau d'une autre feuille via une liste déroulante
    Par alex.du.09 dans le forum Excel
    Réponses: 3
    Dernier message: 18/05/2011, 17h10
  3. Export d une liste de feuilles via une listbox
    Par truespace dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/12/2009, 17h58
  4. [Requête] Tri via une liste déroulante
    Par Burnout dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 09/01/2006, 18h16
  5. récupération des données via une liste déroulante
    Par rahan_dave dans le forum Access
    Réponses: 1
    Dernier message: 13/10/2005, 12h27

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