Résolu Boite de dialogue userform

popeyem

Habitué
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
[cpp]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[/cpp]

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 :
[cpp]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[/cpp]

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

 

zeb

Modérateur
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....
 

popeyem

Habitué
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.
[cpp]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[/cpp]

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.
 

zeb

Modérateur
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.
Code:
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
Je n'ai pas compris pourquoi tu mets ce code dans ListBox1_DblClick.
Explique où sont cette liste et les boutons.
 

popeyem

Habitué
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.
 

zeb

Modérateur
Meilleure réponse
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:
Code:
Public UserChoice As Integer
Dans ton bouton [Verrouille], tu mets le code suivant :
Code:
Private Sub CommandButton1_Click()
    UserChoice = 1 ' // 1=Verrouillé / 2=Déverrouillé / autre=Annuler
    Me.Hide
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 :)
 

popeyem

Habitué
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
[cpp]...
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[/cpp]
code sur Userform1
[cpp]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[/cpp]

Qu'est-ce qui ne va pas ?
 

zeb

Modérateur
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.
Code:
' // joli Select Case 
Select Case j
    Case 0 : MsgBox "Zéro"
    Case 1 : MsgBox "Un"
    Case 2 : MsgBox "Deux"
End Select
Surtout qu'un simple MsgBox j aurait suffit. (C'est pour ça que je mets du vrai texte dans l'exmple).
 

popeyem

Habitué
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) ?
 

popeyem

Habitué
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
[cpp]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[/cpp]

Merci les amis

 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 135
Messages
6 718 109
Membres
1 586 397
Dernier membre
Chachabidou
Partager cette page
Haut