Déclarer une variable "mdp" pour l'entièreté du fichier
Bonjour le forum,
Désolé pour la question mais j'aimerais déclarer une variable "mdp" qui définierais le mot de passe des différents sheet.
Le but est de ne pas devoir changer à chaque fois le mdp contenu dans les différentes partie du code, juste le changer dans cette variable.
Mon soucis est que je débute en VBA, et même si je commence à pouvoir tirer mon plan j'ai encore de grosse lacune...
Je suppose qu'il faut déclarer une variable publique, mais ou? (j'ai du code dans des modules, des userform, dans les sheet et dans le thisworkbook).
Je pense que ce sera quelque chose comme :
Public mdp as string
Dim mdp="****"
end sub
pouvez-vous m'aider svp
Merci d'avance
Bonjour,
Je vous renvoie vers l'aide Déclaration de variables (VBA) | Microsoft Learn
Dans votre cas il faut déclarer la variable dans un module, en dehors des subs/fonctions.
Tel que
' éclaration d'une variable utilisable dans tous vos modules de ce classeur
Public MaVariableGlobale As String
' affectaction
MaVariableGlobale = "password123"
Re-bonjour,
merci a vous pour ceci mais je n'arrive pas à l'implémenter dans mon code
Donc dans un module nommé "MDP" j'ai mis ceci :
Option Explicit
Public Const MDP As String = ""
Dans mon code j'ai ceci (les .... représentants le reste du code):
......
Sheets("Rejected deliveries overview").Unprotect ""
......
......
Sheets("Rejected deliveries overview").Protect Password:=""
.......
Si j'éssaye de remplacer le "" par MDP cela ne fonctionne pas, mais je suppose que c'est normal...
Bonjour, vous devez faire une erreur dans votre code, chez moi cela fonctionne :
Public Const MDP As String = "abc"
Sub testLock()
ThisWorkbook.Worksheets(2).Protect Password:=MDP
End Sub
Sub testUnlock()
ThisWorkbook.Worksheets(2).Unprotect Password:=MDP
End Sub
Peut etre, ne mettez pas le MDP entre guillemets
J'obtien une erreur "type mismatch"
J'ai changé mon mot de passe vide par "abc" dans le sheet
voici le code dans mon module MDP
Option Explicit
Public Const MDP As String = "abc"
et voici le code d'un bouton :
'Bouton insérer
Private Sub CommandButton13_Click()
Dim Ligne As Integer
Dim I As Integer
Dim ctrls As Variant
Dim wsModele As Worksheet
Dim wsOverview As Worksheet
Dim Wbe As Workbook
' Renseigner l'onglet "Rejected deliveries overview"
If MsgBox("Are you sure you want to INSERT this data?", vbYesNo, "Request for confirmation") = vbYes Then 'condition : si oui au message
' le déverrouiiler
Sheets("Rejected deliveries overview").Unprotect Password:=MDP
Set Wbe = ThisWorkbook
' Permet de se positionner sur la dernière ligne de tableau NON VIDE
Ligne = Sheets("Rejected deliveries overview").Range("a65536").End(xlUp).Row + 1
ctrls = Array(Me.TextBox11, _
Me.TextBox12, _
Me.ComboBox16, _
Me.TextBox13, _
Me.ComboBox13, _
Me.ComboBox110, _
Me.TextBox16)
For I = 1 To 7 'mettre ici le nombre de contrôle inclus ci-dessus
ws2.Cells(Ligne, I) = ctrls(I - 1).Value
ws2.Cells(Ligne, 8).NumberFormat = "@"
Next I
End If
' Créer un lien hypertexte sur la Cells(Ligne, 3) avec la valeur de la Textbox12
Set wsOverview = ThisWorkbook.Sheets("Rejected deliveries overview")
wsOverview.Hyperlinks.Add Anchor:=wsOverview.Cells(Ligne, 2), Address:="", SubAddress:=TextBox12.Value & "!A1", TextToDisplay:=TextBox12.Value
' Créer un nouvel onglet sur la base du modèle
Set wsModele = ThisWorkbook.Sheets("Template rejected deliv.")
wsModele.Visible = True
wsModele.Copy , Worksheets(Worksheets.Count)
Sheets("Template rejected deliv. (2)").Move after:=Worksheets(4)
Set ws2 = Worksheets("Template rejected deliv. (2)")
ws2.Name = TextBox12.Value ' Remplacez "TextBox12" par le nom de votre TextBox
wsModele.Visible = xlSheetVeryHidden
' Trie les données par date la plus récente dans la colonne A
Sheets("Rejected deliveries overview").Range("A3:G" & Ligne).Sort Key1:=Sheets("Rejected deliveries overview").Range("A3"), Order1:=xlDescending, Header:=xlNo
' Le re-vérouiller
Sheets("Rejected deliveries overview").Protect Password:=MDP
Sheets("Rejected deliveries overview").Activate
Unload Me ' Vide et ferme l'Userform ( formulaire)
'UserForm2.Show
End Sub
C'est parce que vous essayez d'appeler la méthode .Protect ou .Unprotect sur un objet Sheet au lieu de Worksheet.
Meme si ils sont souvent confondus ces deux objets sont un peu différents. Les "sheets" de votre fichier peuvent etre des feuilles de calcul OU BIEN des feuilles de graphique. Les worksheets elles sont uniquement les feuilles de calcul.
Ainsi les deux objets n'ont pas les memes méthodes. En l'occurent un objet sheet n'a pas de Protect/unprotect, d'ou votre erreur de type.
De manière générale, dans votre code remplacez tous vos "Sheet(...)" par des "Worksheet(...)", sauf si vous référencez des feuilles de graphique. Ca vous evitera ce genre de problèmes. Microsoft recommande l'utilisation des worksheets, plus modernes.
Je viens de modifier tous mes sheet par worksheet et de modifier le déverrouillage - vérouillage du fichier mais toujours la même erreur
'Bouton insérer
Private Sub CommandButton13_Click()
Dim Ligne As Integer
Dim I As Integer
Dim ctrls As Variant
Dim wsModele As Worksheet
Dim wsOverview As Worksheet
Dim Wbe As Workbook
' Renseigner l'onglet "Rejected deliveries overview"
If MsgBox("Are you sure you want to INSERT this data?", vbYesNo, "Request for confirmation") = vbYes Then 'condition : si oui au message
' le déverrouiiler
ThisWorkbook.Worksheets("Rejected deliveries overview").Unprotect Password:=MDP
Set Wbe = ThisWorkbook
' Permet de se positionner sur la dernière ligne de tableau NON VIDE
Ligne = Worksheet("Rejected deliveries overview").Range("a65536").End(xlUp).Row + 1
ctrls = Array(Me.TextBox11, _
Me.TextBox12, _
Me.ComboBox16, _
Me.TextBox13, _
Me.ComboBox13, _
Me.ComboBox110, _
Me.TextBox16)
For I = 1 To 7 'mettre ici le nombre de contrôle inclus ci-dessus
ws2.Cells(Ligne, I) = ctrls(I - 1).Value
ws2.Cells(Ligne, 8).NumberFormat = "@"
Next I
End If
' Créer un lien hypertexte sur la Cells(Ligne, 3) avec la valeur de la Textbox12
Set wsOverview = ThisWorkbook.Sheets("Rejected deliveries overview")
wsOverview.Hyperlinks.Add Anchor:=wsOverview.Cells(Ligne, 2), Address:="", SubAddress:=TextBox12.Value & "!A1", TextToDisplay:=TextBox12.Value
' Créer un nouvel onglet sur la base du modèle
Set wsModele = ThisWorkbook.Sheets("Template rejected deliv.")
wsModele.Visible = True
wsModele.Copy , Worksheets(Worksheets.Count)
Worksheet("Template rejected deliv. (2)").Move after:=Worksheets(4)
Set ws2 = Worksheets("Template rejected deliv. (2)")
ws2.Name = TextBox12.Value ' Remplacez "TextBox12" par le nom de votre TextBox
wsModele.Visible = xlSheetVeryHidden
' Trie les données par date la plus récente dans la colonne A
Worksheet("Rejected deliveries overview").Range("A3:G" & Ligne).Sort Key1:=Worksheet("Rejected deliveries overview").Range("A3"), Order1:=xlDescending, Header:=xlNo
' Le re-vérouiller
ThisWorkbook.Worksheets("Rejected deliveries overview").Protect Password:=MDP
Worksheet("Rejected deliveries overview").Activate
Unload Me ' Vide et ferme l'Userform ( formulaire)
'UserForm2.Show
End Sub
Je n'avais pas vu que l'ensemble de ce code se trouvait dans votre userform, ce peut etre un problème de scope/portée de votre variable MDP. Il faudrait que vous regardiez en mode déboguage la valeur de MDP pour s'en assurer.
Essayez de remplacer Password:=MDP par Password:=MonModule.MDP avec MonModule = le nom du module ou vous définissez MDP.
Si ca ne va pas, essayez de définir le MDP directement dans le module de votre userForm.
De manière plus générale si je devais vous donner un conseil, vous devriez avoir le code exécutif en dehors du module de votre userform, et appeler une fonction depuis l'userform. Quelque chose comme cela :
Private Sub CommandButton13_Click()
doThings ' appel d'une macro
End Sub
En spécifiant le nom du module en plus cela à l'ai de fonctionner correctement.
GRAND merci à toi soboh12617 pour ton aide