Verrouillage de la ligne saisie par mot de passe

dss

XLDnaute Occasionnel
Bonjour le forum,

J'ai une base de données dans laquelle j'inscris au fur et à mesure des informations qui peuvent être lues par d'autres utilisateurs. Pour info, Le tableau va de la colonne A à la colonne N.

Dans le déroulement de ma macro, je bute sur l'instruction suivante dont le code suit :

VcolN =Val(Range("N" & Target.Row).value
VMdP = InputBox("La date de la demande est déjà enregistrée !" & vbCrLf & vbCrLf _
& "Pour modifier les données existantes, merci de saisir le mot de passe : ", _
"MODIFICATION IMPOSSIBLE ...")
'Vérifie le mot de passe ici
If VMdP <> "TOTO" Then
Application.EnableEvents = False
' Application.Undo
Application.EnableEvents = True
Exit Sub
End If
End If

je pensais que ce bout de code devait normalement me demander un mot de passe pour toute modification d'une cellule sur une ligne déjà saisie dans laquelle figure déjà "Enregistré"en colonne N.
Précision :
La mention "Enregistré" existe déjà lors de la sauvegarde du classeur avant le traitement de cette instruction qui m'entraîne des bugs :

Si l'un ou plusieurs d'entre vous pouviez m'aider à résoudre mon problème ce serait vraiment sympa car j'ai absolument besoin de verrouiller les lignes saisies et enregistrées, à l'aide d'un mot de passe et je galère un max.

Si vous avez besoin d'autres éléments, n'hésitez pas à me le demander

D'avance merci

Amicalement

dss
 

dss

XLDnaute Occasionnel
Re : Verrouillage de la ligne saisie par mot de passe

Bonsoir le forum et Excalibur,
Merci pour ton conseil. Seulement quand j'essaie de faire une recherche alors que je tape verrouillage des lignes, un message d'erreur apparaît et m'indique curieusement qu'il faut au moins 4 caracteres et m'invite à recommencer?
 

dss

XLDnaute Occasionnel
Re : Verrouillage de la ligne saisie par mot de passe

Bonsoir Excalibur et le forum,

Merci pour ton conseil : j'ai été voir les sujets identiques et je n'ai malheureusement rien trouvé se rapprochant de ma situation.
En fait, je vais tenter d'être plus clair dans mes explications: lorsque j'ai saisi une ligne de la colonne A à la colonne M, la macro me demande de valider et si réponse OUI elle tri et enregistre le classeur puis inscrit en colonne N "Enregistré" .
Il faudrait à ce moment là que la modification ou la suppression de cette ligne ne soit possible que par mot de passe.

Et manifestement ma boucle ne va pas sans que je ne sache trop pourquoi?

Si vous avez une idée, votre aide me sera très précieuse.

Amicalement

dss
 

dss

XLDnaute Occasionnel
Re : Verrouillage de la ligne saisie par mot de passe

Bonsoir à nouveau le forum,

Merci jeanpierre ça marche avec verrouillage mais recherche toujours infructueuse par rapport à mon probleme que j'ai essayé de decrire en caractere gras sur le message precedent.
J'espere que quelqu'un aura resolu une situation identique a celle que je retrace et aura l'amabilité de m'aider en la circonstance car je galere dur, dur...

Amicalement

dss
 
C

Compte Supprimé 979

Guest
Re : Verrouillage de la ligne saisie par mot de passe

Salut DSS,

Désolé d'être un peu en retard sur ce fil :D
Tu trouveras un fichier exemple avec, je pense, ce que tu veux faire ;)

A+
 

Pièces jointes

  • DSS_Exemple1.xls
    29.5 KB · Affichages: 87
  • DSS_Exemple1.xls
    29.5 KB · Affichages: 87
  • DSS_Exemple1.xls
    29.5 KB · Affichages: 86

dss

XLDnaute Occasionnel
Re : Verrouillage de la ligne saisie par mot de passe

Bonsoir BrunoM45 et le forum,


Pour info, je copie le code restant de ma macro en l'integrant à ton programme entre :
' Saisie dans une colonne de A à M
VColD = Range("D" & Target.Row).Value
VColL = Range("L" & Target.Row).Value
If VColL <> 0 And VColD <> 0 Then
Setrep = MsgBox("Validez votre saisie :Attention,vous ne pourrez plus modifier la ligne après la validation ", vbYesNo)
End If

Tri des données sur 3 colonnes
If Setrep = 6 Then
Range("A4:M65000").Select
Selection.Sort key1:=Range("D5"), Order1:=xlAscending, Key2:=Range("A5") _
, Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _
:=xlSortNormal
'Enregistre le classeur
ActiveWorkbook.Save
End If
End If
Inscrit Enregistré en colonne N sur la ligne saisie
If ActiveWorkbook.Saved = True And Range("N" & Target.Row).Value = "" Then
Range("N" & Target.Row).Value = "Enregistré"
End If

'Inscrit la date et heure de saisie si n'existe pas déjà
If Range("N" & Target.Row).Value <> 0 Then

Lig = Target.Row
If Range("M" & Lig).Value = "" And Target.Value <> "" Then
Range("M" & Lig).Value = Now()
End If
et ' Vérifie si la ligne est déjà enregistrée

J'ai ensuite testé et la macro bloque apres avoir inscrit enregistré en colonne N au niveau de application.Undo dans IF not intersect......
Peut être à cause de If ActiveWorkbook.Saved = True And Range("N" & Target.Row).Value = "" Then
Range("N" & Target.Row).Value = "Enregistré"

Ca bloque aussi sur mais je n'en suis pas sur...car peu de pratique en VBA et aucune de programmation mais je m'accroche....

"MODIFICATION IMPOSSIBLE ...") <> "TOTO" Then
Application.EnableEvents = False
' Annule les modifications
Application.Undo
Application.EnableEvents = True
et là, je ne comprends pas !

Je suis débutant , j'essaie d'assimiler et de produire ou reproduire du code, mais cette section avec enable.events, j'ai pas vraiment assimilé car déjà ma macro s'arretait sur application.undo.
Si tu as quelques minutes à m 'accorder, merci de me l'expliquer.

Cordialement,

dss
 
C

Compte Supprimé 979

Guest
Re : Verrouillage de la ligne saisie par mot de passe

DSS,

Le code n'est pas évident à placer dans le bon sens, vu toutes les interactions !

Voilà le fichier modifié avec ton code + le mien ;)

Pour info :
Application.EnableEvents = False ou True
Permet d'activer ou de désactiver les évènements dans le classeur

Application.Undo
Permet d'annuler la dernière action manuelle, effectuée dans le classeur
Impossible à exécuter quand le classeur vien d'être sauvegardé

If Not Intersect(Target, Range()) Is Nothing then
Permet de tester si la saisie est dans une des cellules comprise dans Range()

Voilà, le reste est expliqué dans le code en annotation

A+
 

Pièces jointes

  • DSS_Exemple1.xls
    37 KB · Affichages: 74
  • DSS_Exemple1.xls
    37 KB · Affichages: 76
  • DSS_Exemple1.xls
    37 KB · Affichages: 74

dss

XLDnaute Occasionnel
Re : Verrouillage de la ligne saisie par mot de passe

Bonjour BrunoM45 et bonjour le forum,

Avant toute chose, un grand merci à toi pour ton aide précieuse sans laquelle je galérerai probablement encore...
J'ai récupéré ton fichier ce matin et je suis en train de le tester : Ca a l'air de bien fonctionner à part 2 petits détails que j'ai pu détecter:

1) Si je supprime cellule par cellule sur une ligne "enregisté" , je n'ai plus la possibilité de supprimer "enregistré" en colonne N.

2) Si je veux supprimer une ligne ou plusieurs cellules d'une ligne "enregistré", ca me renvoie vers FENETRE DEBOGAGE à la ligne suivante :

If Range("M" & Lig).Value = "" And Target.Value <> "" Then (couleur jaune)

En laissant tel quel et en retournant à la feuille, je peux supprimer tout ce que je veux y compris le probleme enumere au 1) , il n'y a plus aucun controle actif.

Donc je supprime ce je veux , je quitte excel et je le reouvre pour retrouver toutes les fonctionnalités de la macro ?

Lorsque j'ai récupéré ton fichier, je me suis apercu dans l'editeur VBA que le code était à la fois en (général) avec en plus 'Option Explicit et 'Dim VColD, VColL que j'ai désactivé ainsi qu'au niveau de Worksheet .

Est ce que cela a une importance car recopié dans mon fichier en général et worksheet sans 'Option Explicit et 'Dim VColD, VColL ca a l'air de fonctionner de la meme facon ? sachant que j'ai copie ces 2 variables à la ligne de declaration Dim avec les autres variables (pour général et worksheet).

Ce sont des points de détail que j'essaie de comprendre et qui ne m'empeche pas apparemment jusque-là de travailler sur le fichier, mais si tu as quelques minutes pour m'informer a ce sujet, ce sera avec grand plaisir...
,
Encore un grand merci, je vois enfin le bout du tunnel après des jours de galere.
Je n'ai pas encore eu le temps d'etudier le code dans sa structure pour comprendre pourquoi je n'arrivais pas a mes fins, mais je vais m'y atteler des que je pourrais.

Merci à toi

Cordialement

dss
 

dss

XLDnaute Occasionnel
Re : Verrouillage de la ligne saisie par mot de passe

Bonjour BrunoM45 et le forum,

En complement de mon message précédent qui ne m'empeche pas de travailler sur le fichier, je remarque après des tests plus poussés la chose suivante :

Si j'ai la ligne 1 saisie et enregistrée et que par mégarde je saisis la ligne 3 en laissant la ligne 2 à blanc lorsque la macro s'exécute : en triant elle renvoie toutes les cellules de la ligne 3 en ligne 2 SAUF "Enregistré" qui reste en ligne 3 et provoque ainsi un décalage?
Aurais-tu une solution car cela me pose probleme car la saisie peut être faite par des utilisateurs non expérimentés?

Merci d'avance

Cordialement

dss
 
C

Compte Supprimé 979

Guest
Re : Verrouillage de la ligne saisie par mot de passe

Salut DSS,

Très difficile à gérer tout ça :rolleyes:
Je pense qu'on est parti dans le mauvais chemin !

Rien n'empèche effectivement de supprimer une/des ligne(s) entière(s) avec le menu -> Ligne -> Supprimer

Le bogue est dû à "Target.Value" qui ne peut pas renvoyer la valeur si plusieurs cellules sont "sélectionnée"

Je t'avoue que là, ce n'est pas évident :confused:
 

dss

XLDnaute Occasionnel
Re : Verrouillage de la ligne saisie par mot de passe

Salut BrunoM45,

Je ne comprends pas l'importance de target.value (colonneM) puisque la ligne est à blanc. n'est il pas possible à la macro de la supprimer avant de trier.

Dans cet esprit, j'ai "élaboré" la macro suivante :

'Supprimer lignes vides
vDerniereLigne = ActiveSheet.UsedRange.Rows.Count
Application.ScreenUpdating = False
For vLigne = vDerniereLigne To 1 Step -1
If Application.CountA(Rows(vLigne)) = 0 Then Rows(vLigne).Delete
Next

Mais je ne sais pas où la placer correctement dans le programme, ca bogue déjà à application.undo de not intersect N:N ?

Est ce que je fais fausse route et que la situation est désespérée?

A bientôt de te lire et merci encore de m'accompagner dans cette difficulté

Cordialement

dss
 

dss

XLDnaute Occasionnel
Re : Verrouillage de la ligne saisie par mot de passe

Bonsoir BANZAI64,

Merci de ton aide en complément de celle de Bruno : effectivement c'est une autre approche que par mot de passe mais cela peut convenir car le + important pour moi est de proteger les donnees qui seront saisies par plusieurs utilisateurs.

J'ai un peu testé et ajouté (en rouge) dans la section du programme ActiveSheet.Protect Password:="TOTO" pensant que mes données seraient protégées par mot de passe. Or, dans la feuille Excel, je peux oter la protection tout simplement sans même taper le mot de passe en utilisant "Oter la protection" ?

S'il existe une solution de garder active la protection et de ne pouvoir déprotéger qu'avec le mot de passe inscrit dans VBA ce serait OK sachant que le projet serait protégé lui même protégé par MDP au niveau de l'éditeur.

' Réactive les évènements dans le classeur
Application.EnableEvents = True
'protège à nouveau la feuille
ActiveSheet.Protect Password:="TOTO"
'Enregistre le classeur

ActiveWorkbook.Save
End If
End Sub

A bientôt de te lire

Cordialement

dss
 

Discussions similaires

Réponses
5
Affichages
406
Compte Supprimé 979
C
Réponses
2
Affichages
166

Statistiques des forums

Discussions
312 221
Messages
2 086 382
Membres
103 199
dernier inscrit
ATS1