Impression d'un userform de feuille provenant d'un autre fichier

Fermé
sieyapdji - 21 oct. 2015 à 15:42
PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019 - 23 oct. 2015 à 14:56
Bonjour,

j'ai trouver il y'a quelque temps ce code dans un autre forum mais je n'arrive pas à exécuter. quelqu'un pourait - t-il m'envoyer un fichier .xls avec le code exécuté. merci pour votre aide.

l'idée c'est que :

dans le classeur A j'ai un lisbox ou un userform qui liste tous les feuilles d'un classeur B. dans cette userform je selectionne une feuille ou une plage de feuille à imprimer.

voici le code :

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
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

End Sub

Sub ListBox1_Click()

End Sub

Sub UserForm_Click()

End Sub

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




A voir également:

4 réponses

PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019 26
21 oct. 2015 à 19:20
Bonjour,

Je ne suis pas le meilleur en VBA, mais ne voyant pas de réponse pour l'instant, je me lance.

https://www.cjoint.com/c/EJvroYTjmrP
Ci-joint, un fichier avec un listbox et deux bouton.
Le premier bouton choisit le fichier et liste les feuilles.
L'autre permet d'imprimer les sélections faites dans le listbox.

Bien sûr, le tout est a adapter selon vos besoins et particularité.

Je me suis grandement inspiré du code que vous avez écrit a quelques différences pret :
- Pas de userform
- Au lieu d'avoir a écrire sans faute le chemin et le nom de fichier en A1, une boite de dialogue est relié au bouton.

Dans les améliorations possibles :
- Inscrire aussi le chemin du fichier dans le listbox et permettre de lister les feuilles de plusieurs fichiers en même temps.
0
Merci bcp PlacageGranby vraiment tu es le messi. ça fait plusieurs jour que je boucle dessus. c'est exactement ce que je voulais.

mais stp j'ai un autre soucis dans mon dossier.

dans mon dossier j'ai un classeur protégé par mot de passe. lorsque je sélection un fichier autre pour l'ouvrir ce classeur protégé par mot de passe s'ouvre automatiquement et du coup ça me génère des erreurs.

quand j'enlève ce fichier dans ce dossier ça marche normalement. mais ce fichier est important pour que d'autre fonctionne

stp tu peux savoir d'ou ça viens. merci bcp
0
PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019 26
Modifié par PlacageGranby le 22/10/2015 à 15:09
Re-Bonjour,

J'ai tester ici, et lorsqu'il y a un mot de passe, il est demandé à l'ouverture via un popup.
Si on ne veut pas entrer le mot de passe, alors il est possible de le coder.
Set xlBook = xlApp.Workbooks.Open(Filename:=chemin_fichier, Password:="test")


La présence du paramètre Password n'empèchera pas la macro d'ouvrir les autres fichiers.
Lorsque le fichier n'est pas protèger, le password est oublié :o

Ce qui est sûr, c'est que selon l'importance de ce fichier, il faudrait sécuriser aussi le fichier avec la macro pour qu'un utilisateur ne puisse pas voir le mot de passe dans les macro.
0
sieyapdji > PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019
23 oct. 2015 à 10:24
Re-bonjour PlacageGranby vraiment merci pour l'aide que tu m'apportes sur ce projet. En quelques jours j'ai beaucoup évolué en VBA. stp où est ce que je dois insérer ce bout de code pour que ça fonctionne. j'ai essayé partout mais ça ne fonctionne pas. merci bcp
0
PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019 26
23 oct. 2015 à 14:06
Re-Bonjour,

Voici la ligne que tu avais pour ouvrir un fichier.
Set xlBook = xlApp.Workbooks.Open Filename:=chemin_fichier


Le "nouveau" code, est en fait une modification de l'ancien code.
Set xlBook = xlApp.Workbooks.Open(Filename:=chemin_fichier, Password:="test")

On ajoute seulement le mot de passe en paramètre pour que LE fichier avec un mot de passe s'ouvre comme les autres.
"test" est un exemple. Remplacer "test" par le vrai mot de passe (conserver les "guillemet").

Si vous avez plusieurs fichiers avec des mots de passe différent, alors ce code ne marchera pas.
0
PlacageGranby vraiment merci pour l'aide que tu m'apportes sur ce projet. En quelques jours j'ai beaucoup évolué en VBA. stp où est ce que je dois insérer ce bout de code pour que ça fonctionne. j'ai essayé partout mais ça ne fonctionne pas. merci bcp
0
PlacageGranby voici le problème. dans un dossier j'ai 10 classeurs et parmis ces classeurs il y en a un qui à un mot de passe et je ne voudrais pas que les gens ouvre ce fichier. les autres fichiers fonctionne grâce à ce fichier. le problème c'est que quand je selectionne un fichier avec ton application ce fichier avec mot de passe ouvre par defaut et me demande d'entrer le mot de passe. c'est un fichier qui ne peut être consulté par quelqu'un d'autre que moi. merci bcp pour ton aide
0
PlacageGranby Messages postés 393 Date d'inscription mercredi 26 mars 2014 Statut Membre Dernière intervention 7 mars 2019 26
Modifié par PlacageGranby le 23/10/2015 à 14:57
Re

Bon je comprend mieux le problème.
Un utilisateur peut essayer d'ouvrir le fichier protéger même sans passer par la macro.
Il pourrait essayer d'ouvrir le fichier directement via excel.

Tu pourrais bouger le fichier protéger dans un sous-répertoire.
A vérifier qu'il n'y ait pas de macro dans ce fichier. Elle pourrait être touché quand on bouge le fichier.


Tu pourrais aussi poser un filtre sur la botie de dialogue. Et jouer avec la première lettre des fichiers. Même chose, tu dois vérifier qu'il n'y a pas d'autre macro sur ces fichiers qui pourrait être perturbé par un changement du nom des fichiers.
On remplace
chemin_fichier = Application.GetOpenFilename("Fichiers,*.xls*")

qui nous listait tout les fichier *.xls* (xls, xlsx, xlsm )
Pour :
'** Choisit le fichier **'
Dim fd As FileDialog, chemin_fichier As String
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
    .InitialFileName = "a*.xls"
    .AllowMultiSelect = False
    .Show
    If .SelectedItems.Count > 0 Then
        chemin_fichier = .SelectedItems(1)
    Else
        MsgBox "Erreur lors de la sélection du fichier"
        Exit Sub
    End If
End With
Range("B1").Value = chemin_fichier   'Inscrit le chemin + fichier en B2

Qui nous liste seulement les fichers excel commençant par la lettre A.

Tu pourrait mettre un préfixe a chaque fichiers genre "FAI_" (pour fichier à imprimer) que tu veux que les utilisateurs voit.
Genre changer toto.xls par FAI_toto.xls
Et dans ton code, .InitialFileName = "FAI_*.xls"

Donc, la boite de dialogue va seulement montrer les fichiers voulu.

Et finalement,
Voici un lien vers la deuxième version du fichier comprenant un préfixe FAI_ pour la boite de dialogue
https://www.cjoint.com/c/EJxm3AnunrP
0