Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Pour anonymous ....... Userform

3 réponses
Avatar
YANN24
Bonjour,
encore merci pour ton code d'avant-hier pour mon userform.
Mais, comme je ne suis pas un as en informatique, je ne comprend pas tout ce
que tu marques, et il faut que je me l'adapte, donc :

*Au début, tu mets :
Private Declare Fonction GetWindowsLongA Lib"user32", mais est ce bien
"user32" qu'il faut mettre?, ou dois je adapter à mon poste?

*A quoi sert la ligne :
Dim hwnd As Long '? ça sert au mot de passe je suppose? (c'est juste pour
déchiffrer et comprendre un peu)

*A quelle partie du code dois-je spécifier que si on clique 2005, les
feuilles "01.05" à "12.05" et "CP 05" apparraissent, et si on clique 2006,
les feuilles "01.06" à " 12.06" et "CP 06" apparaissent.
Pour Administrateur, je crois que c'est bon, "Visible = True", ça veut dire
que ça va m'afficher toutes mes feuilles.

Bon, je te remercie pour toutes tes contributions, et si tu pouvait éclairer
ma lanterne, ce serait vriament sympa.
PS, ci après le code que tu m'as donné avant hier.
Merci. YANN

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

3 réponses

Avatar
anonymousA
bonjour,

1)les déclarations de fonctions des DLL se mettent en haut dans le code du
Userform, donc toutes les fonctions du type Private Declare Fonction
GetWindowsLongA Lib"user32", sont à positionner là.De toute façon, si tu
voulais les mettre ailleurs dans le code, VBA ne serait pas d'accord.Et c'est
bien user32.

2)Dim hwnd As Long n'est pas un mot de passe mais le handle de la fenêtre du
userform . Ce handle permet de désigner à Windows de quelle fenêtre il s'agit.
Ne t'inquiètes pas de ces subtilités, car elles sont en lien avec API et ne
doivent pas te perturber pour la compréhension du code.
En fait, pour faire court, pour enlever la croix du userform , on ne peut
pas utiliser les propriétés ou méthodes de VBA car il n'y en a pas qui
correspondent à ce qu'on souhaite. On est obligé pour faire ca de faire appel
à des programmes que Windows comprend et qui font ce travail.

3) > *A quelle partie du code dois-je spécifier que si on clique 2005, les
feuilles "01.05" à "12.05" et "CP 05" apparraissent, et si on clique 2006,
les feuilles "01.06" à " 12.06" et "CP 06" apparaissent.
Pour Administrateur, je crois que c'est bon, "Visible = True", ça veut dire
que ça va m'afficher toutes mes feuilles.


dans le
Case "2005" au lieu d'écrire
ThisWorkbook.IsAddin = False
For I = 3 To 3
Sheets(I).Visible = True
Next

c'est là que tu écris
ThisWorkbook.IsAddin = False
sheets("01.05").visible=true
sheets("12.05").visible =true
sheets("CP 05").visible =true

Tu fais pareil pour Case "2006" avec les bonnes feuilles et le tour est joué.

On peut faire plus court et je crois même que tu avais déjà demandé ce
mois-ci ou le mois dernier et obtenu des codes plus rapides .Je te laisse
les retrouver.

A+


Bonjour,
encore merci pour ton code d'avant-hier pour mon userform.
Mais, comme je ne suis pas un as en informatique, je ne comprend pas tout ce
que tu marques, et il faut que je me l'adapte, donc :

*Au début, tu mets :
Private Declare Fonction GetWindowsLongA Lib"user32", mais est ce bien
"user32" qu'il faut mettre?, ou dois je adapter à mon poste?

*A quoi sert la ligne :
Dim hwnd As Long '? ça sert au mot de passe je suppose? (c'est juste pour
déchiffrer et comprendre un peu)

*A quelle partie du code dois-je spécifier que si on clique 2005, les
feuilles "01.05" à "12.05" et "CP 05" apparraissent, et si on clique 2006,
les feuilles "01.06" à " 12.06" et "CP 06" apparaissent.
Pour Administrateur, je crois que c'est bon, "Visible = True", ça veut dire
que ça va m'afficher toutes mes feuilles.

Bon, je te remercie pour toutes tes contributions, et si tu pouvait éclairer
ma lanterne, ce serait vriament sympa.
PS, ci après le code que tu m'as donné avant hier.
Merci. YANN

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



Avatar
YANN24
OK, merci, j'ai donc modifier pour "2005" et "2006".
Par contre, ça plante, et au démarage, il me met :
"Erreur de compilation dans le module caché : Userform1"

Puis :
"Erreur d'éxécution '91':
Variable objet ou variable de bloc With non définie"

Et là, je ne comprend pas.
Merci si tu peux m'aider.
YANN


bonjour,

1)les déclarations de fonctions des DLL se mettent en haut dans le code du
Userform, donc toutes les fonctions du type Private Declare Fonction
GetWindowsLongA Lib"user32", sont à positionner là.De toute façon, si tu
voulais les mettre ailleurs dans le code, VBA ne serait pas d'accord.Et c'est
bien user32.

2)Dim hwnd As Long n'est pas un mot de passe mais le handle de la fenêtre du
userform . Ce handle permet de désigner à Windows de quelle fenêtre il s'agit.
Ne t'inquiètes pas de ces subtilités, car elles sont en lien avec API et ne
doivent pas te perturber pour la compréhension du code.
En fait, pour faire court, pour enlever la croix du userform , on ne peut
pas utiliser les propriétés ou méthodes de VBA car il n'y en a pas qui
correspondent à ce qu'on souhaite. On est obligé pour faire ca de faire appel
à des programmes que Windows comprend et qui font ce travail.

3) > *A quelle partie du code dois-je spécifier que si on clique 2005, les
feuilles "01.05" à "12.05" et "CP 05" apparraissent, et si on clique 2006,
les feuilles "01.06" à " 12.06" et "CP 06" apparaissent.
Pour Administrateur, je crois que c'est bon, "Visible = True", ça veut dire
que ça va m'afficher toutes mes feuilles.


dans le
Case "2005" au lieu d'écrire
ThisWorkbook.IsAddin = False
For I = 3 To 3
Sheets(I).Visible = True
Next

c'est là que tu écris
ThisWorkbook.IsAddin = False
sheets("01.05").visible=true
sheets("12.05").visible =true
sheets("CP 05").visible =true

Tu fais pareil pour Case "2006" avec les bonnes feuilles et le tour est joué.

On peut faire plus court et je crois même que tu avais déjà demandé ce
mois-ci ou le mois dernier et obtenu des codes plus rapides .Je te laisse
les retrouver.

A+


Bonjour,
encore merci pour ton code d'avant-hier pour mon userform.
Mais, comme je ne suis pas un as en informatique, je ne comprend pas tout ce
que tu marques, et il faut que je me l'adapte, donc :

*Au début, tu mets :
Private Declare Fonction GetWindowsLongA Lib"user32", mais est ce bien
"user32" qu'il faut mettre?, ou dois je adapter à mon poste?

*A quoi sert la ligne :
Dim hwnd As Long '? ça sert au mot de passe je suppose? (c'est juste pour
déchiffrer et comprendre un peu)

*A quelle partie du code dois-je spécifier que si on clique 2005, les
feuilles "01.05" à "12.05" et "CP 05" apparraissent, et si on clique 2006,
les feuilles "01.06" à " 12.06" et "CP 06" apparaissent.
Pour Administrateur, je crois que c'est bon, "Visible = True", ça veut dire
que ça va m'afficher toutes mes feuilles.

Bon, je te remercie pour toutes tes contributions, et si tu pouvait éclairer
ma lanterne, ce serait vriament sympa.
PS, ci après le code que tu m'as donné avant hier.
Merci. YANN

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





Avatar
anonymousA
Vérifie l'orthographe des noms d'onglets dans ton code par rapport aux vrais
noms d'onglets ( même les espaces comptent: ce sont des caractères).
Par ailleurs, vérifie aussi que ton classeur n'est pas protégé. Tu as déjà
eu ,ce me semble, par le passé ce même type de questions et aussi déjà eu le
même type de réponses.

A+


OK, merci, j'ai donc modifier pour "2005" et "2006".
Par contre, ça plante, et au démarage, il me met :
"Erreur de compilation dans le module caché : Userform1"

Puis :
"Erreur d'éxécution '91':
Variable objet ou variable de bloc With non définie"

Et là, je ne comprend pas.
Merci si tu peux m'aider.
YANN


bonjour,

1)les déclarations de fonctions des DLL se mettent en haut dans le code du
Userform, donc toutes les fonctions du type Private Declare Fonction
GetWindowsLongA Lib"user32", sont à positionner là.De toute façon, si tu
voulais les mettre ailleurs dans le code, VBA ne serait pas d'accord.Et c'est
bien user32.

2)Dim hwnd As Long n'est pas un mot de passe mais le handle de la fenêtre du
userform . Ce handle permet de désigner à Windows de quelle fenêtre il s'agit.
Ne t'inquiètes pas de ces subtilités, car elles sont en lien avec API et ne
doivent pas te perturber pour la compréhension du code.
En fait, pour faire court, pour enlever la croix du userform , on ne peut
pas utiliser les propriétés ou méthodes de VBA car il n'y en a pas qui
correspondent à ce qu'on souhaite. On est obligé pour faire ca de faire appel
à des programmes que Windows comprend et qui font ce travail.

3) > *A quelle partie du code dois-je spécifier que si on clique 2005, les
feuilles "01.05" à "12.05" et "CP 05" apparraissent, et si on clique 2006,
les feuilles "01.06" à " 12.06" et "CP 06" apparaissent.
Pour Administrateur, je crois que c'est bon, "Visible = True", ça veut dire
que ça va m'afficher toutes mes feuilles.


dans le
Case "2005" au lieu d'écrire
ThisWorkbook.IsAddin = False
For I = 3 To 3
Sheets(I).Visible = True
Next

c'est là que tu écris
ThisWorkbook.IsAddin = False
sheets("01.05").visible=true
sheets("12.05").visible =true
sheets("CP 05").visible =true

Tu fais pareil pour Case "2006" avec les bonnes feuilles et le tour est joué.

On peut faire plus court et je crois même que tu avais déjà demandé ce
mois-ci ou le mois dernier et obtenu des codes plus rapides .Je te laisse
les retrouver.

A+


Bonjour,
encore merci pour ton code d'avant-hier pour mon userform.
Mais, comme je ne suis pas un as en informatique, je ne comprend pas tout ce
que tu marques, et il faut que je me l'adapte, donc :

*Au début, tu mets :
Private Declare Fonction GetWindowsLongA Lib"user32", mais est ce bien
"user32" qu'il faut mettre?, ou dois je adapter à mon poste?

*A quoi sert la ligne :
Dim hwnd As Long '? ça sert au mot de passe je suppose? (c'est juste pour
déchiffrer et comprendre un peu)

*A quelle partie du code dois-je spécifier que si on clique 2005, les
feuilles "01.05" à "12.05" et "CP 05" apparraissent, et si on clique 2006,
les feuilles "01.06" à " 12.06" et "CP 06" apparaissent.
Pour Administrateur, je crois que c'est bon, "Visible = True", ça veut dire
que ça va m'afficher toutes mes feuilles.

Bon, je te remercie pour toutes tes contributions, et si tu pouvait éclairer
ma lanterne, ce serait vriament sympa.
PS, ci après le code que tu m'as donné avant hier.
Merci. YANN

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