OVH Cloud OVH Cloud

Macro assez dure, je suppose

2 réponses
Avatar
YANN24
Bonjour,
je voudrais savoir s'il est possible de faire en VBA, pour qu'à l'ouverture
de mon fichier Excel, une fenetre s'affiche avec un choix (Par exemple,
"2005", "2006", et "Administrateur"). Et à partir de ses choix, seules mes
feuilles concernées (13 pour "2005" et "2006", et la totalité pour
"Administrateur") soient visibles.
De plus, pour "Administrateur", un mot de passe s'impose.

Je ne vois pas du tout comment traiter ça, donc si quelqu'un voit ma
solution, ça serait trop sympa.
Merci.
YANN

2 réponses

Avatar
papou
Bonjour
Je ne crois pas que cela demande beaucoup de travail.
Il faut simplement réfléchir à la méthode à utiliser.
Je t'en propose une assez simple :
Définir sur toutes les feuilles sauf une la propriété Visible à
XlSheetVeryHidden
Sur la seule feuille restée visible placer une zone de liste déroulante à
partir de la boîte à outils contrôles
Pour la propriété ListFillRange, faire référence à une plage de cellules
contenant les différents noms d'utilisateurs
(je suggère d'éventuellement placer cette plage sur la feuille consultable
uniquement par l'administrateur par exemple)
Associer à l'évènement Change de la Combobox un contrôle (avec Select Case
par exemple) sur la valeur trouvée et en fonction de celle-ci réaffecter la
valeur xlSheetVisible aux feuilles qui vont bien.
Pour le mot de passe Administrateur, évidemment le plus pro serait de faire
un petit Userform avec une zone de texte pour la saisie du mot de passe,
mais éventuellement tu peux simplifier à l'extrême avec un InputBox.
Pour la sortie, j'utiliserai l'évènement Workbook_BeforeClose pour aller
vérifier les propriétés Visible de chaque feuille afin de leur réaffecter la
valeur xlsheetveryhidden sauf sur la feuille d'accueil.
Avantage : même si les macros ne sont pas activées, par défaut les feuilles
ne seront pas affichées.
Mais ce n'est qu'une humble suggestion ;-)
Bon courage
Cordialement
Pascal


"YANN24" a écrit dans le message de news:

Bonjour,
je voudrais savoir s'il est possible de faire en VBA, pour qu'à
l'ouverture
de mon fichier Excel, une fenetre s'affiche avec un choix (Par exemple,
"2005", "2006", et "Administrateur"). Et à partir de ses choix, seules mes
feuilles concernées (13 pour "2005" et "2006", et la totalité pour
"Administrateur") soient visibles.
De plus, pour "Administrateur", un mot de passe s'impose.

Je ne vois pas du tout comment traiter ça, donc si quelqu'un voit ma
solution, ça serait trop sympa.
Merci.
YANN


Avatar
anonymousA
bonjour,

Créer un userform et avec 1 combobox de 3 items , "2005",
"2006","administrateur" et avec 2 boutons dénommé "Annuler" (commandbutton2)
et "OK" ( commandbutton1) et 1 textbox (textbox1) avec un label (label1)
qu'on appelera textbox1 et label1. Label1 recoit le texte "entrez mot de
passe".

Au passage , on prive le userform de la croix en utilisant les API.
tu noteras qu'à la fermeture du fichier , celui est considéré comme un addin
donc le fichier ne sera visible qu'à condition de passer par le userform.
Par ailleurs, si tu veux que le textbox du userform affiche des * quand le
mdp est frappé, il faut que tu mettes * dans la propirété Passwordchar du
textbox.
je t'ai aussi donné un exemple dans la fonction controlmdp d'une saisie
possible de plusieurs mdp. c'est à adapter à ta demande bien sur.

Enfin, je n'ai pas prévu de réessais multiples avec une limitation en nombre
d'essais ni de retour en arrière quand on a cliqué sur Administrateur.Mais
le code est evidemment améliorable

Ecrire dans le code du userform les procédures suivantes
'déclarations API nécessaires pour empêcher l'affichage de la
'croix de fermeture du userform

Private Declare Function GetWindowLongA Lib "user32" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long

Private Declare Function SetWindowLongA Lib "user32" _
(ByVal hwnd As Long, ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long

Private Declare Function FindWindowA Lib "user32" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Sub CommandButton2_Click()

'si l'utilisateur clique sur Annuler, on quitte.

Unload Me

ThisWorkbook.Close

End Sub

Private Sub UserForm_Initialize()


'empêche l'affichage de la croix de fermeture en utilisant les API
'déclarées en début de module

Dim hwnd As Long
hwnd = FindWindowA("Thunder" & IIf(Application.Version Like "8*", _
"X", "D") & "Frame", Me.Caption)
SetWindowLongA hwnd, -16, GetWindowLongA(hwnd, -16) And &HFFF7FFFF

With Me.ComboBox1
.AddItem "2005"
.AddItem "2006"
.AddItem "Administateur"
End With

Me.TextBox1.Visible = False
Me.Label1.Visible = False

End Sub

Private Sub combobox1_Click()

Select Case Me.ComboBox1.Value

Case "2005"
ThisWorkbook.IsAddin = False
For I = 3 To 3
Sheets(I).Visible = True
Next

Unload Me

Case "2006"
ThisWorkbook.IsAddin = False
For I = 2 To 2
Sheets(I).Visible = True
Next

Unload Me

Case "Administateur"

With Me
.ComboBox1.Visible = False
With .TextBox1
.Visible = True
.SetFocus
End With
.Label1.Visible = True
End With

End Select

End Sub

Private Sub commandbutton1_Click()

If Me.ComboBox1.Value = "" Then
MsgBox "vous n'avez rien saisi"
Me.ComboBox1.SetFocus
Else
If TextBox1.Value = "" Then
Else
If controlmdp(TextBox1.Value) = True Then
ThisWorkbook.IsAddin = False
For I = 1 To ThisWorkbook.Sheets.Count
Sheets(I).Visible = True
Next
Unload Me
End If
End If
End If

End Sub

Function controlmdp(nommdp)

On Error Resume Next

tabmdp = Array("toto", "tata", "titi", "tutu", "tete", "tyty", "zzz")

trouve = Application.WorksheetFunction.HLookup(nommdp, tabmdp, 1, False)

If Err.Number <> 0 Then
Err.Clear
MsgBox "pas le bon mdp"
Else
MsgBox "bon mdp"
controlmdp = True
End If

End Function

puis écrire dans le module thisworkbook

Private Sub Workbook_BeforeClose(Cancel As Boolean)

On Error Resume Next
Sheets(1).Visible = True
For I = 2 To ThisWorkbook.Sheets.Count
Sheets(I).Visible = xlSheetVeryHidden
Next
ThisWorkbook.IsAddin = True

End Sub

Private Sub Workbook_Open()

UserForm1.Show

End Sub

A+



Bonjour,
je voudrais savoir s'il est possible de faire en VBA, pour qu'à l'ouverture
de mon fichier Excel, une fenetre s'affiche avec un choix (Par exemple,
"2005", "2006", et "Administrateur"). Et à partir de ses choix, seules mes
feuilles concernées (13 pour "2005" et "2006", et la totalité pour
"Administrateur") soient visibles.
De plus, pour "Administrateur", un mot de passe s'impose.

Je ne vois pas du tout comment traiter ça, donc si quelqu'un voit ma
solution, ça serait trop sympa.
Merci.
YANN