Valeur Contiguë à celle d'un combobox
Bonjour à tous
Dans la feuille 1, j'ai un userform contenant un combobox, celui-ci contient la liste de fichier qui se dans un répertoire....Cette liste se trouve en feuille 2(Librairies) dans la colonne A....afin de trouver le chemin pour l'imprimer qui se trouve dans colonne B, j'aimerais si possible mettre dans une variable le chemin pour imprimer en fonction du choix(combobox)
Merci d'avance pour votre aide
Oli
Bonjour,
Tes entêtes de colonnes sont inversées !
Le ComboBox possède deux colonnes dont la dernière est cachée (largeur 0) mais elle contient le nom du document correspondant au chemin. Testes pour voir mais attention, aucun lecteur n'est indiqué dans tes chemins :
Private Sub ToggleButton1_Click()
'Sub export_données_dans_signet_word()
Dim NDF As String, NDF2 As String, Rep As String
Dim WordApp As Object, WordDoc As Object
Dim chemin As String
Dim agent As String
chemin = ActiveWorkbook.Path
Rep = MsgBox("Un ficher word va être imprimé, souhaitez-vous poursuivre ?", vbYesNo + vbQuestion, "")
If Rep = vbYes Then
'la colonne est cachée (largeur 0) mais elle contient une valeur
agent = UserForm1.ComboBox1.List(UserForm1.ComboBox1.ListIndex, 1)
chemin = UserForm1.ComboBox1.List(UserForm1.ComboBox1.ListIndex, 0)
NDF = chemin & "\" & agent
Set WordApp = CreateObject("Word.Application")
Set WordDoc = WordApp.Documents.Open(NDF, ReadOnly:=False)
End If
WordApp.Visible = False
Application.Dialogs(xlDialogPrinterSetup).Show
'Si l'utilisateur confirme la configuration de l'imprimante alors...
WordDoc.PrintOut Copies:=1, Collate:=True 'Imprime le document Word
MsgBox "Document word imprimé"
WordDoc.Close '-- fermer le document Word
'WordDoc.Quit '-- fermer la session Word
End Sub
Private Sub UserForm_Initialize()
With Sheets("Librairies")
ComboBox1.ColumnCount = 2
ComboBox1.ColumnWidths = ComboBox1.Width - 10 & ";0"
ComboBox1.List = .Range("A2:B" & .Range("B65536").End(xlUp).Row).Value
End With
End Sub
Bonsoir Theze,
Merci pour ta proposition, je dois juste adapter le chemin car effectivement j'ai un petit soucis à ce niveau....
J'ai un autre petit problème, pour imprimer chaque fichier séparément cela ne pose aucun soucis, par contre je n'arrive à imprimer le répertoire en entier...Tu peux me donner un petit coup de pouce....
Merci d'avance
Oli
Bonjour,
Une piste à adapter que tu peux attacher à un bouton. Je n'ai fais aucun test sur ce code, je te laisse ça :
Sub ImprimerTout()
Dim WordApp As Object
Dim WordDoc As Object
Dim Plage As Range
Dim Cel As Range
Set WordApp = CreateObject("Word.Application")
WordApp.Visible = False
With Worksheets("Librairies"): Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With
For Each Cel In Plage
NDF = Cel.Value & "\" & Cel.Offset(, 1).Value 'je ne suis pas sûr de la nécessité du \ !!!
Set WordDoc = WordApp.Documents.Open(NDF, ReadOnly:=False)
WordDoc.PrintOut Copies:=1, Collate:=True
WordDoc.Close
Next Cel
WordDoc.Quit
MsgBox "Tous les documents ont été imprimés !"
End Sub
Bonjour Theze
J'ai un peu modifier le code car dans ma liste imprimer tout, ne correspond à un fichier mais bien \, donc j'ai mis un if avec avec une instruction de fin et là retour à la feuille 1 sans userform...si je mets une autre instruction , j'ai un message d'erreur.
Comment puis-je retrouver l'userform après l'arrêt de la macro....
Merci
Sub ImprimerTout()
Dim WordApp As Object
Dim WordDoc As Object
Dim Plage As Range
Dim Cel As Range
Dim chem As String
Set WordApp = CreateObject("Word.Application")
WordApp.Visible = False
With Worksheets("Librairies"): Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With
chem = ActiveWorkbook.Path
For Each Cel In Plage
NDF = chem & Cel.Offset(, 1).Value
If NDF = chem & "\" Then End
Set WordDoc = WordApp.Documents.Open(NDF, ReadOnly:=False)
WordDoc.PrintOut Copies:=1, Collate:=True
WordDoc.Close
Next Cel
WordDoc.Quit
MsgBox "Tous les documents ont été imprimés !"
End Sub
Le code que je t'ai donné est soit à mettre dans la procédure événementielle d'un bouton (ce que j'ai fais ci-dessous) soit à appeler depuis cette procédure événementielle.
Sur ton UserForm, tu poses un bouton de commande (CommandButton) et tu colles ce code dans le module :
Private Sub CommandButton1_Click()
Dim WordApp As Object
Dim WordDoc As Object
Dim Plage As Range
Dim Cel As Range
Dim NDF As String
Dim chem As String
Dim Nb As Integer
Set WordApp = CreateObject("Word.Application")
WordApp.Visible = False
With Worksheets("Librairies"): Set Plage = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp)): End With
chem = ActiveWorkbook.Path & "\" '<---Path ne retourne pas le dernier anti-slash, il faut le rajouter !
For Each Cel In Plage
'seulement si la cellule n'est pas vide
If Cel.Value <> "" Then
NDF = chem & Cel.Offset(, 1).Value
Set WordDoc = WordApp.Documents.Open(NDF, ReadOnly:=False)
WordDoc.PrintOut Copies:=1, Collate:=True
WordDoc.Close
Nb = Nb + 1
End If
Next Cel
WordDoc.Quit
MsgBox Nb & " documents ont été imprimés sur " & Plage.Count & " !"
End Sub
re,
Merci je vais tester cela....
J'ai une autre petite question, je vais avoir plusieurs combobox(environ 5), afin de ne pas recopier la macro à chaque fois et savoir quel combobox est actif et enclencher la macro (au niveau de l'impression)...
Merci d'avance
Oli
Tu peux utiliser l'événement "Click()" des ComboBox et les passer en argument à la procédure, exemple :
Private Sub ComboBox1_Click()
Imprimer ComboBox1
End Sub
Private Sub ComboBox2_Click()
Imprimer ComboBox2
End Sub
Private Sub ComboBox3_Click()
Imprimer ComboBox3
End Sub
'etc...
Sub Imprimer(Cmb As MSForms.ComboBox)
'Sub export_données_dans_signet_word()
Dim NDF As String, NDF2 As String, Rep As String
Dim WordApp As Object, WordDoc As Object
Dim chemin As String
Dim agent As String
chemin = ActiveWorkbook.Path
Rep = MsgBox("Un ficher word va être imprimé, souhaitez-vous poursuivre ?", vbYesNo + vbQuestion, "")
If Rep = vbYes Then
agent = Cmb.List(Cmb.ListIndex, 0)
Rep = chemin
NDF = Rep & "\" & agent & ".doc" '"\FR1-1.doc"
Set WordApp = CreateObject("Word.Application")
Set WordDoc = WordApp.Documents.Open(NDF, ReadOnly:=False)
End If
WordApp.Visible = False
Application.Dialogs(xlDialogPrinterSetup).Show
'Si l'utilisateur confirme la configuration de l'imprimante alors...
WordDoc.PrintOut Copies:=1, Collate:=True 'Imprime le document Word
MsgBox "Document word imprimé"
WordDoc.Close '-- fermer le document Word
'WordDoc.Quit '-- fermer la session Word
End Sub
Bonjour,
Si tu appelles une procédure qui appelle elle même une autre procédure et que cette dernière demande un argument, il te faut faire suivre cet argument et ici, c'est un ComboBox donc, ta procédure "MsgBoxSmile()" doit demander aussi ce dernier afin de le passer à la Sub "Imprimer()" :
Public Sub MsgBoxSmile(Cmb As MSForms.ComboBox) '<--- demande d'argument obligatoire...
Dim rep2 As Integer
' Set Hook
hHook = SetWindowsHookEx(WH_CBT, _
AddressOf MsgBoxHookProc, _
0, _
GetCurrentThreadId)
' Run MessageBox
'MsgBox "Voulez-vous Rédiger ou Imprimer ce document ?", vbYesNoCancel, "Gestion Administrative Professeur"
rep2 = MsgBox("Voulez-vous Rédiger ou Imprimer ce document ?", vbYesNoCancel, "Gestion Administrative Professeur")
If rep2 = 6 Then
Imprimer Cmb '... car demandé ici !
Else
MsgBox ("perdu")
End If
End Sub
et dans ton UserForm, c'est :
Private Sub ComboBox2_Click()
MsgBoxSmile ComboBox2
End Sub
Bonjour Theze,
Grand merci pour la solution, j'apprends beaucoup.....
Maintenant quand je sélectionne le combobox2, le msgbox apparait et quand je veux cliquer sur imprimer ou rédiger, la sélection du combobox bouge.... y a t-il moyen de la fixer pour éviter les erreurs....
Oli
Tu as supprimé ton second classeur ? Il me semble que ce matin tu en avais mis un avec ta capture d'écran ?
Là, je suis chez moi et comme demain je ne serais pas au bureau, je ne peux pas faire de test !
Bonsoir Theze,
Oui, il y avait des informations que je pouvais pas laisser, je poste un nouveau, avec les dernières corrections que tu as apporté..
Maintenant quand je sélectionne le combobox2, le msgbox apparait et quand je veux cliquer sur imprimer ou rédiger, la sélection du combobox bouge....
Je ne constate rien d'anormal chez moi !
Pourquoi te compliquer la vie avec cette boîte de message alors qu'un simple formulaire fait très bien l'affaire et t'affranchi de ces Api Windows qui peuvent justement créer ces désagréments ?
Je te retourne ton fichier avec un UserForm qui ressemble à la tienne mais sans Api :
re Theze,
oui, effectivement c'est beaucoup simple et me causeras moins de soucis....je continue le développement..et je reviens vers toi
Encore merci ....
Oli