XL 2019 Confirmer la modification d'une cellule avant de la protéger en suite

arnoldbrice19

XLDnaute Nouveau
Bonjour mes experts, j'espère que vous vous portez bien ?

Je viens aujourd'hui avec une préoccupation.
Tout d'abord, j'ai deux codes : confirmation modification et verrouillage.
En effet, je souhaite qu'après avoir modifier une cellule avec le code suivant, qu'elle ne se verrouille seulement lorsque j'ai confirmé la valeur avec "Oui".
Lorsque je refuse la confirmation présentement avec le code suivant, elle verrouille la cellule. C'est le problème ! Autrement dit, en disant "Non" pour refuser la confirmation, il efface la valeur de la cellule (ce qui m'arrange), mais ne me laisse la possibilité de la modifier, la confirmer aussi avant qu'il ne verrouille la cellule.
VB:
Private Sub Worksheet_Change(ByVal Target As Range)

' ***********Premier code********* Confirmation de saisie
If MsgBox("Valider : " & Target, vbYesNo + vbExclamation, "CONFIRMATION") = vbNo Then
Application.EnableEvents = False   'évite évènement Change
Target = ""    'on efface le contenu
Application.EnableEvents = True  'remet évènement
Else
End If

' **********Deuxième code********** Verrouillage des cellules
If Not Intersect(Target, Range("B3:M3, B5:M6, B8:M8, B10:M27")) Is Nothing Then
ActiveSheet.Unprotect "1123"    'on déprotège la feuille
Target.Locked = True   'on verrouille les cellules
ActiveSheet.Protect "1123", DrawingObjects:=True, Contents:=True, Scenarios:=True _    'on protège la feuille
        , AllowSorting:=True, AllowFiltering:=True
    ActiveSheet.EnableSelection = xlNoRestrictions
End If

End sub
Ci joint le fichier

Merci par avance !!!
 

Pièces jointes

  • RECHERCHE H.xlsm
    30.3 KB · Affichages: 2
Solution
Bonsoir à tous !!!

J'ai pu trouver la solution à mon problème. Tout ce qu'il me fallait faire était tout d'abord de définir ma zone d'encodage avant d'exécuter par la suite la boite de dialogue MsgBox. Globalement, le code était bien écrit, mais très en désordre. Le travail du débutant n'est pas facile du tout. 😁
Finalement, le code VB, solution à mon problème est le suivant :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
 
If Not Intersect(Target, Range("B3:M3, B5:M6, B8:M8, B10:M27")) Is Nothing Then   'définition de la zone d'encodage
If MsgBox("Valider : " & Target, vbYesNo + vbExclamation, "CONFIRMATION") = vbNo Then   'confirmation des saisies
Application.EnableEvents = False   'évite événement Change
Target...

arnoldbrice19

XLDnaute Nouveau
Bonjour à tous,
Un bonjour particulier à Monsieur Jean.

J'ai compris mon problème hier, qui était le "End if" sur le code indiqué dans mon premier problème.
Toutefois, je reviens encore ce matin pour un autre tout petit souci que j'arrive pas à gérer.
En fait, je ne sais pas comment empêcher le MsgBox de s'exécuter en dehors des plages : ("B3:M3, B5:M6, B8:M8, B10:M27"). Puisque là présentement, ces places concernent le verrouillage des cellules concernées. Mais pourtant, j'aimerais qu'elles servent aussi de référence au MsgBox de confirmation de saisie au lieu qu'il s'exécute sur toute l'étendue de la feuille.

Merci de votre aide ! 🙏🙏
 

eriiic

XLDnaute Barbatruc
Bonjour,

c'est déjà le cas...

Par contre si tu veux pouvoir saisir dans certaines cellules il faut les déverrouiller :
- déprotéger la feuille
- sélectionner tes plages de saisie
- clic-droit dessus, 'Format de cellule / Protection' décocher 'Verrouillée'
- reprotéger la feuille
eric
 

arnoldbrice19

XLDnaute Nouveau
Bonjour,

c'est déjà le cas...

Par contre si tu veux pouvoir saisir dans certaines cellules il faut les déverrouiller :
- déprotéger la feuille
- sélectionner tes plages de saisie
- clic-droit dessus, 'Format de cellule / Protection' décocher 'Verrouillée'
- reprotéger la feuille
eric
Bonjour Eric,

Merci déjà pour ta réaction ! 🙏
Je possède un document de facturation dans lequel je suis en train de constituer le code. Bref, la pièce jointe ci-dessus n'est qu'un document qui me sert de test.
Imaginons que je souhaite l'exécuter sur une cellule que je ne souhaite pas verrouiller !!!

J'ai fait des recherche et j'ai pu recueillir une petite infos sur la solution qui ne me débloque pas, car je ne m'y connais pas en macro. Mon niveau est médiocre. En fait, il m'est demandé de placer mon code après cette ligne :
VB:
If Not Intersect(Target, Range("B3:M3, B5:M6, B8:M8, B10:M27")) Is Nothing Then
, puisque c'est elle qui définit la zone d'encodage.
 
Dernière édition:

eriiic

XLDnaute Barbatruc
Bonjour,
"Imaginons que je souhaite l'exécuter sur une cellule que je ne souhaite pas verrouiller !!!"
et bien où est le problème si la cellule est déverrouillée ?
Pour le reste je ne comprend pas tes explications parcellaires
eric
 

arnoldbrice19

XLDnaute Nouveau
....
Pour le reste je ne comprend pas tes explications parcellaires
eric
Merci pour ta réaction Eric !
C'est juste qu'il y a parmi ma sélection des plages de saisie, certaines cellules qui ne doivent pas être verrouillées, qui recevront des valeurs, et que je ne souhaite pas qu'elles affichent le MsgBox.
Mais bon, ta solution est celle que j'ai prévu en plan B. A défaut, je laisserai ce code "MsgBox" de côté pour l'instant.
 

arnoldbrice19

XLDnaute Nouveau
Bonsoir à tous !!!

J'ai pu trouver la solution à mon problème. Tout ce qu'il me fallait faire était tout d'abord de définir ma zone d'encodage avant d'exécuter par la suite la boite de dialogue MsgBox. Globalement, le code était bien écrit, mais très en désordre. Le travail du débutant n'est pas facile du tout. 😁
Finalement, le code VB, solution à mon problème est le suivant :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
 
If Not Intersect(Target, Range("B3:M3, B5:M6, B8:M8, B10:M27")) Is Nothing Then   'définition de la zone d'encodage
If MsgBox("Valider : " & Target, vbYesNo + vbExclamation, "CONFIRMATION") = vbNo Then   'confirmation des saisies
Application.EnableEvents = False   'évite événement Change
Target = ""    'on efface le contenu de la cellule
Application.EnableEvents = True   'remet événement
Else
 
   'vérouillage des cellules après les avoir modifiées
ActiveSheet.Unprotect "0000"
Target.Locked = True
ActiveSheet.Protect "0000", DrawingObjects:=True, Contents:=True, Scenarios:=True _
        , AllowSorting:=True, AllowFiltering:=True
    ActiveSheet.EnableSelection = xlNoRestrictions

End If
End If
End Sub
Merci pour vos différentes réactions et à bientôt !!! 🙏👋
 

Pièces jointes

  • RECHERCHE H.xlsm
    28.5 KB · Affichages: 0

Discussions similaires