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.
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
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.
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
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.
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
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, lesfeuilles "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
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
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, lesfeuilles "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
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.
YANNbonjour,
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, lesfeuilles "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
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
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.
YANNbonjour,
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, lesfeuilles "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