[RESOLU] Userform pour impression dynamique

Int0x

XLDnaute Occasionnel
Bonjour à tous,

Avant toute chose, je ne suis qu'un débutant en VBA. Je tatonne, je bidouille et j'observe, mais il me manque énormément de connaissances & de pratique. Donc merci à tous ceux qui participent au bon fonctionnement de ce forum.

Je vous explique globalement mon projet. Il est très simple, puisque le but est d'imprimer en PDF un fichier Excel comprennant environ 70 onglets.

J'ai actuellement une macro qui permet d'imprimer les onglets voulus sous format PDF.

Code:
Sub Impression()

Sheets(Array("PDG", "1.1", "1.2", "1.3", "2.1", "2.2", "2.3", "2.4", "2.5", "2.6", "2.7", "3.1", "3.2", "3.3", "3.4", "3.5")).Select

Application.ActivePrinter = "PDFCreator sur Ne00:"
ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:= _
"PDFCreator sur Ne00:", Collate:=True

Sheets("Sommaire").Select

End Sub

Cette macro fonctionne très bien, et me permet de rentrer des impressions prédéfinies (onglet A, B et D par exemple). Mon objectif est de trouver une interface (userform) permettant de rendre ces impressions dynamiques (sans que l'utilisateur n'ai à rentrer dans le code).

Ainsi, par exemple, cet userform permettrait de lister tous les onglets disponibles sur une partie gauche, de pouvoir balancer les onglets voulu sur une partie droite et de lancer l'impression.

Sauriez-vous vers quelle voie me lancer, des idées ou des tutos à me proposer ?
Je prends également les exemples à partir des quels je pourrais m'adapter :p

Par avance merci,
Int0x
 
Dernière édition:

nyko283

XLDnaute Occasionnel
Re : Userform pour impression dynamique

Bonjour Int0x, le forum,

Dans ton cas, je partirai sur 2 listbox sur un userform la premiere listbox serait rempli par les noms de tous les onglets du classeur lors de l'initialsation de l'userform puis avec l'evenement doubleclic de la listbox je remplirai la deuxieme listbox.

j'envisagerais également l'evenement doubleclic sur la deuxieme listbox avant de pouvoir supprimer des choix fait par erreur, et meme si tu le souhaite de parametrer une édition type que l'on peut modifier

ne pas oublier de faire un test pour eviter les doublons dans la 2eme listbox.

tu peut aussi prevoir qu'au fur et à mesure que tu sélectionne des onglets pour l'édition qu'ils disparaissent de la 1ere listbox et donc prévoir de les rajoutés si tu les supprime de la deuxieme listbox.

Bon courage
 

Int0x

XLDnaute Occasionnel
Re : Userform pour impression dynamique

Bonjour Nicolas et merci pour ta réponse,

Cela correspond tout à fait à ce que je souhaite.Aurais-tu des fichiers ou codes exemples pour tout ceci ?

Car c'est principalement le code qui va me poser problème:
- comment alimenter la première listbox avec tous les onglets ?
- comment indiquer que je veux imprimer les onglets présents dans la seconde listbox ?
etc...

Par avance merci,
Int0x
 

Int0x

XLDnaute Occasionnel
Re : Userform pour impression dynamique

Merci pour vos réponses, j'ai pu avancer un peu sur mon projet.

Pour faire simple, j'ai un userform composé de:
- Une listbox1, dans laquelle sont recensés tous les noms d'onglets
- Une listbox2, dans laquelle sont basculés tous les onglets qui doivent être imprimés
- Un CommandButton1, qui me permet de basculer de la listbox1 vers la listbox2 (choix de l'utilisateur)
- Un CommandButton2, qui permet de basculer dans l'autre sens (finalement, on annule l'opération du dessus)
- Un bouton imprimer qui lance l'impression des onglets présents dans la listbox2

La macro de ce bouton est donc:
Code:
Private Sub Imprimer_Click()
Dim Nom_Feuilles() As Variant, j, n
 
n = Me.ListBox2.ListCount
j = 0
 
For i = 0 To n - 1
    If Me.ListBox2.Selected(i) = True Then
        ReDim Preserve Nom_Feuilles(j)
        Nom_Feuilles(j) = Me.ListBox2.List(i)
        j = j + 1
    End If
Next
 
If j > 0 Then
    Sheets(Nom_Feuilles()).Select
End If

Application.ActivePrinter = "PDFCreator sur Ne00:"
ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:= _
"PDFCreator sur Ne00:", Collate:=True

Me.Hide
 
End Sub

Le problème est que l'impression ne va se faire QUE sur le nom de l'onglet surligné dans la listbox2 (celui sur lequel on a cliqué). Je souhaiterais que TOUS les onglets présents dans la listbox2 soient imprimés. Comment y remédier ?

Autrement, comment ajouter l'évenement double clic pour qu'il donne le même effet que les 2 boutons de bascule ?

Par avance merci,
Int0x
 

Int0x

XLDnaute Occasionnel
Re : Userform pour impression dynamique

J'ai finalement trouvé, c'était tout bête (supprimer le premier IF).

Code:
Private Sub Imprimer_Click()
Dim Nom_Feuilles() As Variant, j, n
 
n = Me.ListBox2.ListCount
j = 0
 
For i = 0 To n - 1
  
        Nom_Feuilles(j) = Me.ListBox2.List(i)
        j = j + 1
    Next
 
If j > 0 Then
    Sheets(Nom_Feuilles()).Select
End If

Application.ActivePrinter = "PDFCreator sur Ne00:"
ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:= _
"PDFCreator sur Ne00:", Collate:=True

Me.Hide
 
End Sub

Autre question: comment intégrer la notion d'évènement dans mes listbox ?
De telle manière que quand je clique dessus, l'opération soit la même que celle associé aux boutons.

Par avance merci,
Int0x
 

Int0x

XLDnaute Occasionnel
Re : Userform pour impression dynamique

Bonjour,

Je suis toujours bloqué sur le dernier point.
Je ne parviens pas à intégrer la notion d'évènement double clic. Quel code dois-je utiliser (et ou l'intégrer) pour que la fonction double clic fasse la même chose que si je cliquais sur le bouton ?

Pour rappel, le code du bouton est le suivant:
Code:
Private Sub CommandButton1_Click()
With Me.ListBox1
    For i = 0 To (.ListCount - 1)
        If .Selected(i) Then Me.ListBox2.AddItem .List(i)
    Next i
    For i = (.ListCount - 1) To 0 Step -1
        If .Selected(i) Then .RemoveItem (i)
    Next i
End With
With Me.ListBox2
    For j = 0 To .ListCount - 1
        Tmp = Tmp & ";" & .List(j)
    Next j
    Tmp = Split(Right(Tmp, Len(Tmp) - 1), ";")
    Call tri(Tmp, LBound(Tmp), UBound(Tmp))
    .List = Tmp
End With
End Sub

Par avance merci,
Int0x
 

nyko283

XLDnaute Occasionnel
Re : Userform pour impression dynamique

bONJOUR iNT0X,

place le code dans l'userform:

VB:
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
If Me.ListBox1.ListIndex = -1 Then Exit Sub 'si la listebox est vide sorti de procedure
Me.ListBox2.AddItem Me.ListBox1.Value ' alimentation de l'autre listbox
Me.ListBox1.RemoveItem (ListBox1.ListIndex) ' suppression de l'article alimenter
End Sub

Private Sub ListBox2_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
If Me.ListBox2.ListIndex = -1 Then Exit Sub
Me.ListBox1.AddItem Me.ListBox2.Value
Me.ListBox2.RemoveItem (ListBox2.ListIndex)
End Sub
[/COLOR]

a plus
 

Int0x

XLDnaute Occasionnel
Re : Userform pour impression dynamique

Bonjour Nicolas, et merci pour ta réponse.

J'ai placé ce code dans l'userform et j'ai le message d'erreur suivant lorsque je teste le double-clic:
Erreur d'exécution '-2147352571 (80020005)':
Le type ne correspond pas.

Je suis aussitôt renvoyé vers la ligne de code

Code:
Me.ListBox2.AddItem Me.ListBox1.Value

Ai-je oublié de spécifer quelque chose ?

D'avance merci,
Int0x
 

Int0x

XLDnaute Occasionnel
Re : Userform pour impression dynamique

J'ai finalement trouvé mon bonheur.
J'ai juste intégré le code de mon bouton dedans, ce qui marche parfaitement.

Code:
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
With Me.ListBox1
    For i = 0 To (.ListCount - 1)
        If .Selected(i) Then Me.ListBox2.AddItem .List(i)
    Next i
    For i = (.ListCount - 1) To 0 Step -1
        If .Selected(i) Then .RemoveItem (i)
    Next i
End With
With Me.ListBox2
    For j = 0 To .ListCount - 1
        Tmp = Tmp & ";" & .List(j)
    Next j
    Tmp = Split(Right(Tmp, Len(Tmp) - 1), ";")
    Call tri(Tmp, LBound(Tmp), UBound(Tmp))
    .List = Tmp
End With
End Sub

Merci pour vos retours :)
 

Statistiques des forums

Discussions
314 647
Messages
2 111 533
Membres
111 195
dernier inscrit
Cheminotbelgiantrain