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
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 :
Voila, j'aimerais bien en savoir un peu plus sur ce userform !
Merci pour le coup de main
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
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim pays_source As Workbook
Dim ws_PIE As Worksheet
Dim compteur As Long
Dim Chemin As String, pays_a_verrouiller As String, nom_pays As String
Chemin = ActiveWorkbook.Path
pays_a_verrouiller = Dir(Chemin & "\" & "* 2011 2014 *.xls", vbDirectory)
For compteur = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(compteur) Then
'Boite de dialogue
Select Case MsgBox("Verrouiller les onglets PIE, ... " & pays_a_verrouiller, vbOKCancel)
Case vbCancel
Exit Sub
Case vbOK
Set pays_source = Workbooks.Open(Chemin & "\" & pays_a_verrouiller)
'Definition des onglets
Set ws_PIE = pays_source.Worksheets("PIE")
'Protection des feuilles
ws_PIE.Protect Password:="XXX", AllowFormattingCells:=True, AllowFormattingColumns:=True, AllowFormattingRows:=True, AllowSorting:=True, AllowFiltering:=True
pays_source.Close
End Select
End If
pays_a_verrouiller = Dir()
Next
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 :
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim pays_source As Workbook
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
Dim compteur As Long
Dim Chemin As String, pays_a_verrouiller As String, nom_pays As String
Chemin = ActiveWorkbook.Path
pays_a_verrouiller = Dir(Chemin & "\" & "* 2011 2014 *.xls", vbDirectory)
For compteur = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(compteur) Then
'Boite de dialogue
Select Case UserForm1
Case UserForm1.CommandButton1
Set pays_source = Workbooks.Open(Chemin & "\" & pays_a_verrouiller)
'Definition des onglets
Set ws_PIE = pays_source.Worksheets("PIE")
'Protection des feuilles
ws_PIE.Protect Password:="XXX", AllowFormattingCells:=True, AllowFormattingColumns:=True, AllowFormattingRows:=True, AllowSorting:=True, AllowFiltering:=True
pays_source.Close
UserForm1.Hide
Unload UserForm1
Case UserForm1.CommandButton2
Set pays_source = Workbooks.Open(Chemin & "\" & pays_a_verrouiller)
'Definition des onglets
Set ws_PIE = pays_source.Worksheets("PIE")
'Déverrouillage des feuilles
ws_PIE.Unprotect "XXX"
pays_source.Close
UserForm1.Hide
Unload UserForm1
Case UserForm1.CommandButton3
Exit Sub
End Select
End If
pays_a_verrouiller = Dir()
Next
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
Ah, donc tu as un second userform..... Oki....
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...
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
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...
Dans ton bouton [Verrouille], tu mets le code suivant :
Public UserChoice As Integer
Je te laisse faire pour tes autres boutons.
Private Sub CommandButton1_Click()
UserChoice = 1 ' // 1=Verrouillé / 2=Déverrouillé / autre=Annuler
Me.Hide
End Sub
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
Salut
Alors, de retour
Bon, j'ai regardé ton code. C'est du grand n'importe quoi. Tant le premier que le second.
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....
Alors, de retour
Bon, j'ai regardé ton code. C'est du grand n'importe quoi. Tant le premier que le second.
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.
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.
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.
Option Explicit
Private Sub CommandButton1_click()
Dim Chemin As String, pays_a_verrouiller As String, nom_pays As String
'Trouver les fichiers du répertoire et les afficher
Chemin = ActiveWorkbook.Path
pays_a_verrouiller = Dir(Chemin & "\" & "* 2011 2014 *.xls", vbDirectory)
ListBox1.Clear
Do While pays_a_verrouiller <> ""
nom_pays = Left(pays_a_verrouiller, Len(pays_a_verrouiller) - 17)
ListBox1.AddItem nom_pays
pays_a_verrouiller = Dir()
Loop
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.
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.
Explique où sont cette liste et les boutons.
Bref. A revoir.
Le nom du pays est discriminant, non ? Alors sert-en pour reconstituer le nom du fichier.
Je n'ai pas compris pourquoi tu mets ce code dans ListBox1_DblClick.
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) Then
pays_a_verrouiller = Dir(ThisWorkbook.Path & "\" & ListBox1.Selected(i) & "* 2011 2014 *.xls")
...
End If
Next
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.
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
code sur Userform1
Qu'est-ce qui ne va pas ?
code sur Feuil1
...
Dim j As Integer
Chemin = ActiveWorkbook.Path
pays_a_verrouiller = Dir(Chemin & "\" & "* 2011 2014 *.xls", vbDirectory)
For i = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(i) Then
Load UserForm1
UserForm1.Show
UserForm1.Userchoice = j
UserForm1.Hide
Unload UserForm1
Select Case j
Case j = 0
MsgBox ("0")
Case j = 1
MsgBox ("1")
Case j = 2
MsgBox ("2")
End Select
End If
pays_a_verrouiller = Dir()
Next
code sur Userform1
Option Explicit
Public Userchoice As Integer
Private Sub CmdAnnuler_Click()
Userchoice = 0
Me.Hide
End Sub
Private Sub Cmdverrouiller_Click()
Userchoice = 1
Me.Hide
End Sub
Private Sub Cmddeverrouiller_Click()
Userchoice = 2
Me.Hide
End Sub
Qu'est-ce qui ne va pas ?
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
Mauvaise indentation, mauvaise syntaxe.
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
Mauvaise indentation, mauvaise syntaxe.
Surtout qu'un simple MsgBox j aurait suffit. (C'est pour ça que je mets du vrai texte dans l'exmple).
' // joli Select Case
Select Case j
Case 0 : MsgBox "Zéro"
Case 1 : MsgBox "Un"
Case 2 : MsgBox "Deux"
End Select
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) ?
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
Merci les amis
J'ai donc maintenant ce code qui marche, je vais remplacer mes msgbox par verrouiller/deverrouiller
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Dim pays_source As Workbook
Dim ws_PIE As Worksheet
Dim i As Long
Dim Chemin As String, pays_a_verrouiller As String, nom_pays As String
Dim j As Integer
Chemin = ActiveWorkbook.Path
pays_a_verrouiller = Dir(Chemin & "\" & "* 2011 2014 *.xls", vbDirectory)
For i = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(i) Then
Load UserForm1
UserForm1.Show
j = UserForm1.Userchoice
UserForm1.Hide
Unload UserForm1
Select Case j
Case 0: MsgBox j
Case 1: MsgBox j
Case 2: MsgBox j
End Select
End If
pays_a_verrouiller = Dir()
Next
End Sub
Merci les amis
Lassé par la pub ? Créez un compte
- Contenus similaires :
- articlesBoite de dialogue interactif
- ForumBoite de dialogue en jsp
- ForumBoite de dialogue parcourir
- ForumBoite dialogue confirmation
- ForumBoite de dialogue denregistrement
- ForumVba boite de dialogue
- ForumLogiciel boite de dialogue
- ForumComment créer des boite de dialogue
- articlesUne curieuse boite de dialogue
- ForumNouvelle boite de dialogue
- Voir plus
