Se connecter avec
S'enregistrer | Connectez-vous

Boite de dialogue userform

Dernière réponse : dans Programmation

Bonjour à tous,

Après quelques mois d'absence, me revoila au sujet de l'utilisation d'un userform ; J'aurais besoin d'un coup de main sur le sujet suivant:

J'ai 60 fichiers dont les onglets doivent être verrouillés. J'ai crée une macro dans un fichier extérieur pour le faire. Le nom des fichiers apparait dans une listebox, je clique sur celui qui m'interesse et le verrouillage se lance. Jusqu'ici, aucun problème. Je me suis dis ensuite que je pourrais avoir besoin de déverrouiller ces onglets.. donc autant créer une boite de dialogue pour la macro qui me demande l'action à effectuer : verrouiller / déverrouiller les onglets du fichier cliqué.

Voici la macro 1ere version, seulement du verrouilage
  1. Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  2.  
  3. Dim pays_source As Workbook
  4. Dim ws_PIE As Worksheet
  5. Dim compteur As Long
  6. Dim Chemin As String, pays_a_verrouiller As String, nom_pays As String
  7.  
  8. Chemin = ActiveWorkbook.Path
  9. pays_a_verrouiller = Dir(Chemin & "\" & "* 2011 2014 *.xls", vbDirectory)
  10.  
  11. For compteur = 0 To Me.ListBox1.ListCount - 1
  12. If Me.ListBox1.Selected(compteur) Then
  13.  
  14. 'Boite de dialogue
  15. Select Case MsgBox("Verrouiller les onglets PIE, ... " & pays_a_verrouiller, vbOKCancel)
  16. Case vbCancel
  17. Exit Sub
  18. Case vbOK
  19.  
  20. Set pays_source = Workbooks.Open(Chemin & "\" & pays_a_verrouiller)
  21.  
  22. 'Definition des onglets
  23. Set ws_PIE = pays_source.Worksheets("PIE")
  24.  
  25. 'Protection des feuilles
  26. ws_PIE.Protect Password:="XXX", AllowFormattingCells:=True, AllowFormattingColumns:=True, AllowFormattingRows:=True, AllowSorting:=True, AllowFiltering:=True
  27.  
  28. pays_source.Close
  29.  
  30. End Select
  31. End If
  32. pays_a_verrouiller = Dir()
  33. Next
  34. End Sub


Je mets maintenant ce que j'aimerais faire marcher, à savoir,
- utilisation du useform
- en fonction du bouton cliqué, telle action se réalise
J'ai utilisé un select case mais n'arrive pas à le faire marcher :
  1. Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  2.  
  3. Dim pays_source As Workbook
  4. Dim ws_PIE As Worksheet, ws_OMB As Worksheet, ws_TAX As Worksheet, ws_LAW As Worksheet, ws_Admin As Worksheet, ws_PL As Worksheet, ws_TSC As Worksheet
  5. Dim compteur As Long
  6. Dim Chemin As String, pays_a_verrouiller As String, nom_pays As String
  7.  
  8. Chemin = ActiveWorkbook.Path
  9. pays_a_verrouiller = Dir(Chemin & "\" & "* 2011 2014 *.xls", vbDirectory)
  10.  
  11. For compteur = 0 To Me.ListBox1.ListCount - 1
  12. If Me.ListBox1.Selected(compteur) Then
  13.  
  14. 'Boite de dialogue
  15. Select Case UserForm1
  16.  
  17. Case UserForm1.CommandButton1
  18. Set pays_source = Workbooks.Open(Chemin & "\" & pays_a_verrouiller)
  19. 'Definition des onglets
  20. Set ws_PIE = pays_source.Worksheets("PIE")
  21. 'Protection des feuilles
  22. ws_PIE.Protect Password:="XXX", AllowFormattingCells:=True, AllowFormattingColumns:=True, AllowFormattingRows:=True, AllowSorting:=True, AllowFiltering:=True
  23.  
  24. pays_source.Close
  25. UserForm1.Hide
  26. Unload UserForm1
  27.  
  28. Case UserForm1.CommandButton2
  29. Set pays_source = Workbooks.Open(Chemin & "\" & pays_a_verrouiller)
  30. 'Definition des onglets
  31. Set ws_PIE = pays_source.Worksheets("PIE")
  32. 'Déverrouillage des feuilles
  33. ws_PIE.Unprotect "XXX"
  34.  
  35. pays_source.Close
  36. UserForm1.Hide
  37. Unload UserForm1
  38.  
  39. Case UserForm1.CommandButton3
  40. Exit Sub
  41. End Select
  42.  
  43. End If
  44. pays_a_verrouiller = Dir()
  45. Next
  46.  
  47. End Sub


Voila, j'aimerais bien en savoir un peu plus sur ce userform !
Merci pour le coup de main :) 

Autres pages sur : boite dialogue userform

Lassé par la pub ? Créez un compte

Meilleure solution

Expert Programmation

Ah, donc tu as un second userform..... Oki.... :pt1cable:  Eh, faut te suivre, toi.
Ben faut peut-être le charger et l'afficher ce userform !!!!

Bon, voici la grosse astuce.
Crée dans le code de ton userform Verrouille/Déverrouille une variable publique qu'on va appeler UserChoice (j'aime bien la concision de l'angliche pour programmer :)  ) en dehors de toute fonction, et de préférence, tout en haut - après le Option Explicit, évidemment... :sarcastic: 
  1. Public UserChoice As Integer
Dans ton bouton [Verrouille], tu mets le code suivant :
  1. Private Sub CommandButton1_Click()
  2. UserChoice = 1 ' // 1=Verrouillé / 2=Déverrouillé / autre=Annuler
  3. Me.Hide
  4. End Sub
Je te laisse faire pour tes autres boutons.
Je te laisse même trouver et m'expliquer pourquoi j'ai choisi 0 pour le bouton [Annuler].

Dans la procédure ListBox1_DblClick(), à partir de la ligne 13, tu ajoutes le chargement du userform (Load()), son affichage (Show()), la récupération de la valeur du UserChoice, la suppression en mémoire du userform (Unload()). Ensuite tu pourras faire un Select Case.

J'attends de voir ce que tu vas faire de ces quelques conseils :) 
Expert Programmation

Salut :hello: 
Alors, de retour :) 

Bon, j'ai regardé ton code. C'est du grand n'importe quoi. Tant le premier que le second. :o 

Quelle relation y a-t-il entre ta boucle sur compteur et tes fichiers sur le disque dur, quelle corrélation entre List1.Selected et pays_a_verrouiller ? Revois ça.

Ensuite, un Select Case permet d'aiguiller le code en fonction des valeurs d'une variable. Il ne me semble pas que CommandButton1 soit une valeur possible de UserForm1. :/  Revois ça. L'action d'un bouton est dans le code de ce bouton.

Tu utilises 2 fois le même code, à l'exception d'une seule ligne, rationalise ça.

A te lire....

Bonjour professeur Zeb !
oui de retour, je me suis dit qu'un petit recadrage ne ferait pas de mal :) 
Du coup, pour expliquer la relation et la corrélation entre les éléments cités dans ta réponse, voici le code que je n'avais pas mis, autant pour moi. Ce code se trouve dans Feuil1 avant celui du vérouillage.
  1. Option Explicit
  2.  
  3. Private Sub CommandButton1_click()
  4. Dim Chemin As String, pays_a_verrouiller As String, nom_pays As String
  5. 'Trouver les fichiers du répertoire et les afficher
  6. Chemin = ActiveWorkbook.Path
  7. pays_a_verrouiller = Dir(Chemin & "\" & "* 2011 2014 *.xls", vbDirectory)
  8.  
  9. ListBox1.Clear
  10.  
  11. Do While pays_a_verrouiller <> ""
  12. nom_pays = Left(pays_a_verrouiller, Len(pays_a_verrouiller) - 17)
  13. ListBox1.AddItem nom_pays
  14. pays_a_verrouiller = Dir()
  15. Loop
  16.  
  17. End Sub


Maintenant, je sais que pour faire fonctionner un bouton de commande de mon userform, je dois rentrer le code dessus (et non sur Feuil1), c'est ça?. Mais alors je suis obligé de redéfinir toutes les variables? Ne peut-on pas appeler ces boutons depuis Feuil1 ? (auquel cas je n'arrive pas à lancer l'execution du bouton cliqué)

Effectivement, je peux rationaliser, en ouvrant le fichier d'abord, en definissant mes variables (ws_PIE,...) et en demandant ensuite l'action à effectuer.
Expert Programmation

Bon, alors ta grosse astuce de ta boucle For/Dir() est vraiment nase : que ce passe-t-il si pour une raison où une autre, un fichier apparaît ou disparaît entre le chargement de la liste et l'utilisation de cette liste ? Et même, qu'est-ce qui te garantit l'ordre dans lequel Dir() te renvoie les noms de fichiers ?

Bref. A revoir.

Le nom du pays est discriminant, non ? Alors sert-en pour reconstituer le nom du fichier.
  1. For i = 0 To ListBox1.ListCount - 1
  2. If ListBox1.Selected(i) Then
  3. pays_a_verrouiller = Dir(ThisWorkbook.Path & "\" & ListBox1.Selected(i) & "* 2011 2014 *.xls")
  4. ...
  5.  
  6. End If
  7. Next
Je n'ai pas compris pourquoi tu mets ce code dans ListBox1_DblClick.
Explique où sont cette liste et les boutons.

Dans Feuil1 j'ai mis ces 2 codes

1- Fais une recherche (en cliquant sur bouton commande) des fichiers à verrouiller dans le repertoire Z. Fais les moi apparaitre dans listBox1
2- Quand je dble clique sur un pays de ListBox1, j'execute la macro de verrouillage.


La ou je bloque (et ou je veux en venir), c'est que j'ai crée un userform avec 3 boutons: vérrouiller, déverrouiller et annuler. A ces 3 boutons, je veux associer l'execution d'une action pour le Pays sélectionné (double cliqué dans ListBox1).

Et je pensais pouvoir mettre le code de chacune des 3 actions dans Feuil1 au lieu de UserForm.

bon, j'ai beau chercher, le msgbox ne me retourne que la valeur 1, peu importe le bouton sur lequel j'ai appuyé...

code sur Feuil1
  1. ...
  2. Dim j As Integer
  3.  
  4. Chemin = ActiveWorkbook.Path
  5. pays_a_verrouiller = Dir(Chemin & "\" & "* 2011 2014 *.xls", vbDirectory)
  6.  
  7. For i = 0 To Me.ListBox1.ListCount - 1
  8. If Me.ListBox1.Selected(i) Then
  9.  
  10. Load UserForm1
  11. UserForm1.Show
  12. UserForm1.Userchoice = j
  13. UserForm1.Hide
  14. Unload UserForm1
  15.  
  16. Select Case j
  17. Case j = 0
  18. MsgBox ("0")
  19. Case j = 1
  20. MsgBox ("1")
  21. Case j = 2
  22. MsgBox ("2")
  23. End Select
  24.  
  25. End If
  26. pays_a_verrouiller = Dir()
  27. Next

code sur Userform1
  1. Option Explicit
  2. Public Userchoice As Integer
  3.  
  4. Private Sub CmdAnnuler_Click()
  5.  
  6. Userchoice = 0
  7. Me.Hide
  8.  
  9. End Sub
  10.  
  11. Private Sub Cmdverrouiller_Click()
  12.  
  13. Userchoice = 1
  14. Me.Hide
  15.  
  16. End Sub
  17.  
  18. Private Sub Cmddeverrouiller_Click()
  19.  
  20. Userchoice = 2
  21. Me.Hide
  22.  
  23. End Sub


Qu'est-ce qui ne va pas ?
Expert Programmation

Salut,

Sois un tout petit peu plus respectueux de l'indentation (je pinaille).

Explique-moi la ligne 12. (ton problème est là, trouve toi-même la soluce ;)  ).

Ton Select Case est horrible :vomi: 
Mauvaise indentation, mauvaise syntaxe.
  1. ' // joli Select Case
  2. Select Case j
  3. Case 0 : MsgBox "Zéro"
  4. Case 1 : MsgBox "Un"
  5. Case 2 : MsgBox "Deux"
  6. End Select
Surtout qu'un simple MsgBox j aurait suffit. (C'est pour ça que je mets du vrai texte dans l'exmple).

C'est justement à la ligne 12 que je bloque !!
Je précise que "Userchoice" est declarée en tant que variable publique (juste en-dessous d'Option Explicit).

J'ai corrigé le select, je cherche encore et je poste la réponse ! (optimiste le gars!)

Edit: c'est un pb de garder en mémoire l'action effectuée (à tout hasard) ?

merci beru pour l'indice à point nommé ! (flûte ! c'était vraiment tout con)

J'ai donc maintenant ce code qui marche, je vais remplacer mes msgbox par verrouiller/deverrouiller
  1. Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  2.  
  3. Dim pays_source As Workbook
  4. Dim ws_PIE As Worksheet
  5. Dim i As Long
  6. Dim Chemin As String, pays_a_verrouiller As String, nom_pays As String
  7. Dim j As Integer
  8.  
  9. Chemin = ActiveWorkbook.Path
  10. pays_a_verrouiller = Dir(Chemin & "\" & "* 2011 2014 *.xls", vbDirectory)
  11.  
  12. For i = 0 To Me.ListBox1.ListCount - 1
  13. If Me.ListBox1.Selected(i) Then
  14.  
  15. Load UserForm1
  16. UserForm1.Show
  17. j = UserForm1.Userchoice
  18. UserForm1.Hide
  19. Unload UserForm1
  20.  
  21. Select Case j
  22. Case 0: MsgBox j
  23. Case 1: MsgBox j
  24. Case 2: MsgBox j
  25. End Select
  26.  
  27. End If
  28. pays_a_verrouiller = Dir()
  29. Next
  30.  
  31. End Sub


Merci les amis

Lassé par la pub ? Créez un compte