Impression de feuille à partir d'une listbox en VBA

Bonjour à tous.

J'ai créé un formulaire dans un classeur A dans lequel j'ai inséré une listbox afin d'imprimer les feuilles d'un classeur B. Cette listbox est remplie en allant chercher le nom de tous les onglets du fichier B. Puis, j'ai mis en place une sélection automatique à partir d'un tableau excel (dans le fichier A) reprenant les valeurs à sélectionner. Jusque là, tout fonctionne.

Maintenant, j'aimerais imprimer les feuilles du fichier fichier B qui correspondent aux éléments sélectionner dans la listbox. C'est à ce moment qu'apparaît le message d'erreur : "erreur d'exécution '9' : L'indice n'appartient pas à la sélection".

J'ai cherché dans l'aide microsoft, mais rien à faire. Je commence à désespérer.

Voici mon code :

Private Sub CommandButton1_Click()
Dim i As Long                                                      
Dim FEUILLES As Worksheet                                              
Dim NOM_FICHIER2 As String                               ' stockage du nom du fichier B renseigné dans une cellule du fichier A

' stockage du nom du fichier à imprimer en le récupérant dans le fichier A
ThisWorkbook.Activate
Sheets("IMPRESSION").Activate
Range("E2").Select
NOM_FICHIER2 = ActiveCell.Value

' Boucle d'impression
For Each FEUILLES In Workbooks(NOM_FICHIER2).Worksheets
    With ListBox1
      For i = 0 To .ListCount - 1
        If .Selected(i) = True Then [b][color=#BF0000]Sheets(.List(i)).PrintOut       [/color][/b]' Impression des onglets que l'opérateur a sélectionnés
      Next
    End With
Next

End Sub
------------------------------------------------------------
Private Sub ListBox1_Click()

End Sub
------------------------------------------------------------
Private Sub UserForm_Click()

End Sub
------------------------------------------------------------
Private Sub UserForm_Initialize()

' Script qui va permettre de récupérer dans la listbox le nom des onglets du fichier désigné et préselectionner les onglets de la listbox

Dim COUNT As Object
Dim NOM_ONGLET_TABLEAU As String                                    ' variable de stockage du nom de l'onget disponible dans le tableau
Dim NOM_ELEMENT_LISTE As String                                     ' déclaration de la variable de stockage du nom de l'onglet que l'on souhaite imprimer
Dim INDEX As Long                                                   ' déclaraion de la variable qui stocke le nom de l'élément de la listbox qui sera sélectionné
Dim NOM_FICHIER As String                                           ' déclaration de la variable de stockage du fichier à imprimer

INDEX = 0                                                           ' initialisation de la variable qui servira dans la boucle à définir le nom de l'élément de la liste

' stockage du nom du fichier à imprimer
ThisWorkbook.Activate
Sheets("IMPRESSION").Activate
Range("E2").Select
NOM_FICHIER = ActiveCell.Value

ListBox1.Clear                                                      ' Initialisation à Zéro de la listbox2
ListBox1.MultiSelect = fmMultiSelectExtended                        ' Permet de mettre en place la multisélection

' Boucle de récupération des onglets dans un fichier extérieur afin d'alimenter la listbox1 puis sélectionner
For Each COUNT In Workbooks(NOM_FICHIER).Worksheets
    ListBox1.AddItem COUNT.Name
    NOM_ELEMENT_LISTE = COUNT.Name
    ThisWorkbook.Activate                                           ' positionnement sur le fichier ici présent
    Sheets("IMPRESSION").Select                                     ' positionnement sur la première feuille
    Range("A2").Select                                              ' Positionnement en A2
    Do While ActiveCell.Value <> ""
    NOM_ONGLET_TABLEAU = ActiveCell.Value
            If NOM_ELEMENT_LISTE = NOM_ONGLET_TABLEAU Then          ' boucle qui va comparer l'élement du tableau avec le nom de l'élément de la liste
                ListBox1.Selected(INDEX) = True
            End If
    ActiveCell.Offset(1, 0).Select
    Loop
    INDEX = INDEX + 1
Next

MsgBox ("sélection terminée, veuillez lancer l'impression")
End Sub 

Je suis certain que la solution est toute bête, mais j'ai besoin d'un regard neuf. C'est pourquoi je fais appel à la bienveillance des membres de ce forum.

Merci d'avance.

Cordialement,

Yoann

Bonsoir

Tes fichiers auraient été souhaitable

Sans grande conviction

For Each FEUILLES In Workbooks(NOM_FICHIER2).Worksheets
    With ListBox1
      For i = 0 To .ListCount - 1
        If .Selected(i) = True Then Workbooks(NOM_FICHIER2).Sheets(.List(i)).PrintOut       ' Impression des onglets que l'opérateur a sélectionnés
     Next
    End With
Next

J'ai fini par réussir à prendre du recul sur mon algorythme.

La réponse était très simple :

' Boucle d'impression
Do While COMPTEUR_IMPRESSION < NB_COPIES
    With ListBox1
        For i = 0 To .ListCount - 1
            If .Selected(i) = True Then Workbooks(NOM_FICHIER2).Sheets(.List(i)).PrintOut       ' Impression des onglets que l'opérateur a sélectionnés
        Next
    End With
    COMPTEUR_IMPRESSION = COMPTEUR_IMPRESSION + 1
Loop

J'ai rajouté une variable pour indiquer le nombre d'impressions que l'on souhaite.

Merci à vous, et de m'avoir lu.

Je n'arrive pas à exécuter le code , je suis à excel 2007. Quelqu'un peut-il m'envoyer le fichier .xls, qui marche. merci d'avance

Ouh!!! Ca date un peu.

Je n'avais pas transmis le fichier à l'époque car il s'agissait d'un document professionnel confidentiel, au volume conséquent. Je n'avais pas vraiment envie de m'amuser à l'"anonymer".

Aujourd'hui, je n'ai plus ce fichier en ma possession. Ou quelque part dans mes archives...

En tout cas, le code fonctionne très bien. Il a été développé avec des contraintes spécifiques. Le but n'est pas de le recopier tel quel, mais de s'en inspirer pour développer son propre code. Mais pour cela, il faut avoir quelques bases (pas beaucoup) afin de le lire.

Je suis vraiment nouveau en vba et je cherche cette solution depuis des semaine même en birdouillant avec vba je n'arrive pas. tout ce que je veux c'est seulement m'expliquer comment je peux faire pour faire fonctionner le code et sur cette base je peux l'adapter. je vous en prie, merci beaucoup de votre compréhension


quand j'exécute le code, ça me met un jaune à ce niveau : Sheets("IMPRESSION").Activate

As tu nommé ta feuille "IMPRESSION"?

Sheets("IMPRESSION").Activate va sélectionner la feuille de ton classeur nommée IMPRESSION. Ensuite, le script t'indique qu'on sélectionne une cellule donnée dans laquelle tu auras indiqué un nom de fichier. Et la valeur de cette cellule est stockée dans une variable. C'est le début du code.

Les commentaires en vert sont essentiels pour comprendre ce que cela signifie. Il faut bien les lire.

Mais quoi qu'il en soit, ce script répond à un besoin unique et précis. En l'occurrence, j'avais mis dans la cellule en question une liste déroulante avec les fichiers à imprimer pour que l'utilisateur puisse sélectionner le bon.

J'ai peur que tu ne te sois pas engagé sur la bonne voie. Car avant de vouloir appliquer bêtement un code, il faut le comprendre, et l'adapter à son propre code. Recopier directement un script sans le retravailler, cela ne fonctionne pas.

Ce que je veux pour mon projet, c'est : dans un fichier excel A j'ai une listbox ou un userform qui liste les feuilles d'un fichier excel B selectionné et à partir de cette liste je peux sélectionner les feuille du fichier b à imprimer. tu vois que ton code reponds bien à se que je cherche.

sieyapdji a écrit :

Ce que je veux pour mon projet, c'est : dans un fichier excel A j'ai une listbox ou un userform qui liste les feuilles d'un fichier excel B selectionné et à partir de cette liste je peux sélectionner les feuille du fichier b à imprimer. tu vois que ton code reponds bien à se que je cherche.

Je ne dis pas que ça ne correspond pas. Je te fais simplement remarquer qu'appliquer un code déjà existant est contreproductif. Il faut commencer par analyser son propre code. Et quand on butte, on cherche des solutions ailleurs, et on s'en inspire. Pour cela, il te faut analyser mon code avant d'en extraire des bouts. Je pense que tu n'as pas bien analysé mon code, car le fait de nommer la feuille IMPRESSION est parfaitement identifiable en 2 secondes.

Ce n'est pas méchant ce que je te dis. Je t'explique simplement comment procéder si tu veux réussir. En plus, le code en question est basique.

Bonjour!

jusqu'ici j'ai crée la fichier IMPRESSION , mais je n'arrive pas à faire fonctionner la source , les commentaires dans la source sont pas explicite pour moi. merci de me donner plus d'explication

Si tu avais pris la peine de lire convenablement mes propos, et le code, tu aurais vu que ce n'est pas le fichier qui s'appelle impression, mais la feuille.

Désolé, mais je ne te donnerai pas plus d'info. D'abord parce que ça ne te fera pas avancer. Je pense que tu ne maîtrises pas les bases du VBA.

Ensuite, parce que j'ai bossé sur ce code, il n'y a pas de raison que tu n'en fasses pas autant.

Il n'y a franchement rien de compliqué. Je ne suis moi même pas programmeur, ni un génie de l'informatique. J'y ai simplement passé un peu de temps.


Et estime toi heureux que j'y ai mis des commentaires. Ce n'est pas toujours le cas.

Rechercher des sujets similaires à "impression feuille partir listbox vba"