[Aide Boucle] Erreur compatibilité de macro
Bonjour à tous,
Voilà, je me suis lancé récemment dans la conception d'un programme de gestion, pour ce faire j'ai du me pencher sur le langage VBA dont je ne connais pas grand chose mais je m'y met petit à petit !
J'ai réussi à concevoir quelques code en reprenant et modifiant certains code que j'ai pu trouver par ci par là afin d'arriver à mon but.
Je me décide à poster pour une aide éventuelle des membres du forum.
- Mon premier problème et je pense que celà ne sera pas d'une grande difficulté, ( mais tant que j'y suis autant demander de l'aide pour celà aussi), est le suivant :
Je cherche actuellement pour mon petit programme, de pouvoir créer un bouton de remise à zéro de certains contenus de cellules dans certaines feuille :
J'ai réussi à effectuer mon code (Ci dessous) mais pour toutes les feuilles. Ma question est donc : Quelle(s) ligne(s)dois je rajouter pour spécifier le nom de mes feuilles ?
Sub deverroutout()
mdp = InputBox("Veuillez entrer le mot de passe", "Enlever la protection des feuilles", "")
If (mdp = "essai") Then
For i = 1 To Sheets.Count
Sheets(i).Unprotect "toto"
Sheets(i).Range("A1:D10").ClearContents
Sheets(i).Range("A1:D10").Locked = False
FormulaHidden = False
Sheets(i).Protect "toto", DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowFormattingColumns:=True
Next i
Else: MsgBox ("Mauvais mot de passe.")
End If
End Sub- Petite explication du code comme je le conçois (peut être y aura-t-il des modifications à faire
- A savoir que mes feuilles seront toutes verrouillés (même sur la plage A1:D10 qui sera complété) avec le mot de passe qui sera "toto" à chaque modification de cellule (grâce à un autre code que je donnerais plus loin) d'où le déverrouillage au début.
- J'ai réussi à faire en sorte que le contenu des cellules de la plage "A1 : D10" soit supprimé et que ces même cellules soient déverrouillés pour pouvoir y réintroduire des valeurs (Heures) et que toutes les autres cellules en mode "verrouillés" ne soient pas modifiable (En y réintégrant le mot de passe "toto")
- Pour pouvoir faire cette action en cliquant sur un bouton il faudra introduire le mot de passe "essai"
Mon premier problème sera d'introduire la boucle uniquement pour les feuilles nommés par exemple (Janvier, Février)
- Mon second problème et le plus important :
Imaginons trois feuilles identiques
- Pour chaque feuille , un code va permettre 'à chaque modification de cellules, qu'elles se verrouillent (Et pour les déverrouillés il faudra entrer le mot de passe "toto")
Private Sub Worksheet_Change(ByVal Target As Range)
Me.Unprotect Password:="toto"
If Target.Value <> "" Then Target.Locked = True
Me.Protect Password:="toto"
End SubJ'ai crée ces codes avec des fichiers séparés qui fonctionnent très bien, mais lorsque j'essaye de les intégrer tout les deux dans le même ficher Excel quelque chose cloche !
Or voici l'erreur: il doit y avoir un conflit entre ce code et celui plus haut. (Erreur de compatibilité)
Le deuxième code marche bien (lorsque je veux déverrouiller manuellement il me demande bien le mot de passe "toto")
Par contre lorsque je veux Appuyer sur le bouton qui aura pour assignation le premier code,ne marche plus lorsque je rentre le mot de passe "essai" (Erreur de compatibilité, et me renvoie sur le deuxième code et (Plus précisément cette ligne )
If Target.Value <> "" Then Target.Locked = True Que dois je faire pour pallier à ce problème ?
Espérant avoir été assez clair dans mes explications et pouvant vous apporter d'autre précision si nécessaire !
Je vous remercie d'avance pour celui ou ceux qui pourront m'aider
Cordialement
Ywhi.
Nb: Ci-joint le fichier Excel.
Merci beaucoup de votre réponse, à première vue, vous avez bien compris ce que je demandais !
Je vais essayer d'intégrer tout ça sur mon Fichier, je vous tiens au courant !
Bon week end et encore merci !
Merci beaucoup de votre réponse Banzai, j'ai parfaitement réussi à réintégrer et modifier à ma guise le code que vous m'avez fournis dans mon fichier !
Juste une petite question, si j'ai bien compris la principale cause de l'erreur qui survenait provenait de l’événement lors de la modification de cellule.
Et ces deux lignes ont pallié à ce problème ?
Application.EnableEvents = False Application.EnableEvents = True Cordialement.
Bonjour
Tu as parfaitement compris, le fait d'effacer la zone provoque l'événement Change, et comme dans les macros il n'y a pas la gestion des sélections de plus d'une cellule, la méthode la plus simple est d'interdire les événements
Sinon dans toutes les macros événementielles il faut rajouter en 1ère ligne le code suivant
If Target.Count > 1 Then Exit SubBonsoir,
Je vous remercie encore pour l'aide que vous m'avez apporté. Mais de cette aide en découle de nouvelle découverte pour moi et de nouveau problème
Je tourne depuis un petit moment déjà, et je ne pense pas que se soit grand chose.
Je viens d'apprendre l’existence de la Combobox,
J'ai réussi tant bien que mal à monter ce petit code qui me permet dans la liste déroulante de trouver le nom de toutes les feuilles du classeur
Private Sub UserForm_Initialize()
ComboBox1.Clear
For i = 1 To Sheets.Count
ComboBox1.AddItem (Sheets(i).Name)
Next i
End Sub
Private Sub ComboBox1_Click()
Sheets(ComboBox1.Text).Select
Unload Me
End SubQui fonctionne très bien. Mais encore une fois je ne veux pas toutes les feuilles mais juste certaines, j'ai essayé de m'inspirer de ce que vous m'avez fournis mais une erreur apparait. (Incompatibilité de type, qui doit se résumer à un format ou quelques chose comme ça qui ne colle pas)
Private Sub UserForm_Initialize()
ComboBox1.Clear
Dim Ws As Worksheet
For Each Ws In Sheets(Array("Janvier", "Février", "Mars"))
ComboBox1.AddItem (Sheets(Ws).Name)
Next Ws
End Sub
Private Sub ComboBox1_Click()
Sheets(ComboBox1.Text).Select
Unload Me
End SubMa vision du code, si vous pouvez m'éclairer un peu si je me trompe
Dim Ws As WorksheetIci, je déclare que "Ws" correspond au feuille du classeur
For Each Ws In Sheets(Array("Janvier", "Février", "Mars"))Pour les feuilles "Janvier","Février","Mars" (déclaration des feuilles)
ComboBox1.AddItem (Sheets(Ws).Name)Ajout des feuilles sélectionnées "Janvier","Février","Mars"
Next Ws(Je suis actuellement en train de me renseigner sur "Next", mais je vous avouerais que si vous pouviez m'éclairer à ce que nous permet de faire cette fonction, cela me serait bien utile).
Une autre question
Pour la déclaration de la variable ne pouvons nous pas directement déclaré les feuilles que l'on souhaite avec
Set?
Exemple :
Dim Ws As Worksheet
Set Ws = Sheet.("Janvier","Février","Mars") Merci d'avance.
Cordialement.
Nb: (Je repost, ici puisque je souhaite intégrer les autres codes avec cette Combobox )
Bonsoir
Je vais essayer de répondre à tes questions
Dim Ws As WorksheetWS est déclaré en tant qu'objet de type Worksheet
For Each Ws In Sheets(Array("Janvier", "Février", "Mars"))Pour chaque objet( type Worksheet) dans le groupe d'objets (WorkSheet)
[barrer]ComboBox1.AddItem (Sheets(Ws).Name)[/barrer]ici tu as une erreur, il faut ajouter le nom de l'objet seulement
ComboBox1.AddItem Ws.NameNext WsOn passe au prochain objet dans le groupe
Bonne initiative de nommer tes Next, tu sais comme cela sur quelle boucle tu es
Dim Ws As Worksheet
Set Ws = Sheet.("Janvier","Février","Mars") Cela m'étonnerait que cela fonctionne
grosso modo c'est comme si tu voulais affecter à une variable plusieurs valeurs
ce qu'il faut c'est une variable ---> une valeur
Dim Ws1 As Worksheet, Ws2 As Worksheet, Ws3 As Worksheet
Set Ws1 = Sheets("Janvier")
Set Ws2 = Sheets("Février")
Set Ws3 = Sheets("Mars")Ton code pourrait ressembler à ceci
Private Sub UserForm_Initialize()
Dim Ws As Worksheet ' déclaration et "typage" de la variable
Me.ComboBox1.Clear ' Pas utile utile
' On parcourt le groupe
For Each Ws In Sheets(Array("Janvier", "Février", "Mars"))
Me.ComboBox1.AddItem Ws.Name ' On ajoute le nom dans la ComboBox
Next Ws ' Suivant
End Sub
Private Sub ComboBox1_Click() ' clic pour aller sur la feuille
Sheets(Me.ComboBox1.Text).Select
Unload Me
End SubBonjour,
Merci beaucoup de ces explications Banzai ! Cela m'a beaucoup aidé et m'a permis de me débrouiller pour faire ce que je voulais !
Cependant une autre question me turlupine pour ce code sur l’événement de mon fichier.
Private Sub Worksheet_Change(ByVal Target As Range)
Me.Unprotect Password:="toto"
If Target.Value <> "" Then
Target.Locked = True
Me.Protect Password:="toto"
ElseIf Target.Value = "" Then
Target.Locked = False
Me.Protect Password:="toto"
End If
End SubEst il possible de rajouter une Plage de cellule ? Ou alors s'agit il d'un événement que l'on ne peut effectuer que sur l'ensemble d'une feuille ? (J'ai pu voir certains qui le faisaient donc je pense que c'est faisable mais je bloque sur un point ^^)
Un petit aperçu de ce que j'ai essayé de faire
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Plage as Range
Set Plage = Range("A1:B10")
.
.
.Donc c'est ici, j'ai déclaré que Plage est sur une Range A1:B10, mais ce que j'ai du mal à saisir est tout simplement : comment puis je la réutiliser pour ce qui va suivre ?
If Plage.Value <> "" ThenJe pensais remplacer tout les mots qui font référence à "target" qui cible, par la variable "Plage" , mais cela ne fonctionne pas, j'ai essayé de "bidouiller" un peu mais rien non plus, si tu pouvais m'éclairer un peu sur le sujet.
(Sachant que je me demande si en donnant cette Plage, l’événement ne bloquerais pas toute la plage "A1:B10" lors de la modif d'une des cellules.
Or je voudrais que lorsqu'une cellule est modifiée dans cette plage que cette cellule ce bloque, dans ce cas ne faudrait-il pas garder le target.Value et préciser "A un autre endroit" que l'événement ne fait effet que sur cette plage. (Par exemple ici >
Private Sub Worksheet_Change(ByVal Target As Range ("??:??") ) )
Pour ce qui est de la combobox pourriez vous jeter un petit coup d'oeil pour voir s'il y a des modifications à faire pour l'optimiser au maximum (elle fait actuellement exactement ce que je veux, mais je suis toujours preneur ! (Mise à par la mise en forme ^^)))
(Elle se trouve en Feuil3)
Merci d'avance !
En attente de votre réponse , tout en cherchant de mon côté !
Cordialement
Bonjour
Si j'ai suivi (long message) tu veux limiter la zone d'action de la macro
Rien de plus facile
Il suffit de lui indiquer
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Not Intersect(Range("A1:B7"), Target) Is Nothing Then
Me.Unprotect Password:="toto"
Target.Locked = IIf(Target <> "", True, False)
Me.Protect Password:="toto"
End If
End SubSi tu ne connais pas la signification d'une instruction, tu places le curseur sur celle-ci et tu appuies sur F1
Pour l'Userform le code va bien et tant qu'il n'est pas long à s'exécuter, pourquoi s'em...er s'embêter à essayé de l'optimiser ?
Cette déclaration Dim Ws As Worksheet est inutile dans la macro "ComboBox1_Click"
Bonsoir,
Tout d'abord , je tiens à m'excuser pour ces messages un petit peu long, mais j'essayais de détailler un maximum pour que vous compreniez exactement ce que je souhaitais et pour que je puisse apprendre des mes erreurs
Vous avez exactement compris ce que je souhaitais !
Je ne comprenais pas trop l'intérêt de cette ligne
If Target.Count > 1 Then Exit Sub, mais après quelques petites recherches et déduction j'ai bien compris quelles erreurs cette ligne pouvait gérer !
J'ai finalisé ce que je faisais et ce, grâce à vous qui avez répondu à la perfection à mes questions
Encore merci et bonne continuation !