[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 Sub

J'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.

27test2.zip (10.69 Ko)

Bonjour

A tester

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 Sub

Bonsoir,

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 Sub

Qui 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 Sub

Ma vision du code, si vous pouvez m'éclairer un peu si je me trompe

Dim Ws As Worksheet

Ici, 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 )

9ywhicombobox.zip (12.10 Ko)

Bonsoir

Je vais essayer de répondre à tes questions

Dim Ws As Worksheet

WS 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.Name
Next Ws

On 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 Sub

Bonjour,

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 Sub

Est 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 <> "" Then

Je 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

12combobox2.zip (15.88 Ko)

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 Sub

Si 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 !

Rechercher des sujets similaires à "aide boucle erreur compatibilite macro"