[vb Excel] Désactiver la sélection de la ligne entière

Résolu
ThomasDo Messages postés 9 Date d'inscription vendredi 15 mai 2009 Statut Membre Dernière intervention 11 février 2010 - 3 févr. 2010 à 15:55
ThomasDo Messages postés 9 Date d'inscription vendredi 15 mai 2009 Statut Membre Dernière intervention 11 février 2010 - 4 févr. 2010 à 12:09
Bonjour à tous, je travaille actuellement sur la sécurisation de feuilles (excel) d'inscription.
Je souhaite que dans un tableau donné, les utilisateurs ne puissent pas modifier les cellules non vides à moins de posséder un mot de passe (j'utilise un InputBox).
J'ai réussi à éviter toute modification mais il reste une façon de détourner la sécurité que j'ai mise en place:
L'utilisateur peut sélectionner l'intégralitée de la ligne en cliquant plusieurs fois sur le numero de ligne.
J'ai pourtant gérer ce cas dans un If Target.Columns.Count < 3 --> Range("J" & ActiveCell.Row).Select (je renvoie l'utilisateur dans la colonne J qui ne fait pas partie de mon tableau), mais cela ne marche pas s'il clique trop rapidement.
Ma question: Est-il possible de désactiver la sélection d'une ligne entière?
Si oui, comment?
Merci pour votre attention chers amis développeurs. Cordialement

9 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
4 févr. 2010 à 10:28
C'est cela même ...
Et si on reste donc dans la cellule (car elle n'est pas vide, sinon on irait en A1), toto devient la nouvelle cellule vers laquelle on sera dirigé si l'on clique à nouveau sur une cellule vierge).

Ainsi : au début : toto A1. si on clique sur une vierge ()>> retour vers A1.
Si l'on clique sur A5 non vierge ===>> toto devient A5 . Si l'on clique sur une vierge ===>> retour vers toto, donc A5.

Voilà le principe de base.
Je te l'ai indiqué pour que tu le comprennes et l'adapte ensuite ==>> perfectionnements que je VEUX te laisser mettre en place toi-même et qui passent par l'analyse de l'adresse de Target et de celle de toto afin de :
1) déterminer si l'utilisateur va vers le bas, vers le haut, vers la droite ou vers la gauche (cas notamment de déplacements à l'aide des touches directionnelles du clavier)
2) déterminer alors la cellule où se rendre en fonction de la détermination précédente, plutôt que de revenir à la dernière cellule autorisée ...
Et là : cela fera beaucoup plus appel à ton agilité de l'esprit et à tes capacités d'organisation qu'à des connaissances en matière de VBA ... (de la gymnastique intellectuelle, quoi !)
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
3 févr. 2010 à 16:04
Bonjour,

Oui ? et alors ?
une sélection provoque l'évènement selectionchange ...
si l'utilisateur sélectionne une cellule, Target est cette cellule
s'il sélectionne toute une ligne, Target est la première cellule de la ligne
donc :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   If Cells(Target.Row, Target.Column).Value = "" Then MsgBox "oui"
End Sub

et au lieu de la msgbox, tu l'envoies dans la cellule de ton choix !


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
3 févr. 2010 à 16:12
Tiens :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   Static toto As Range
   If toto Is Nothing Then Set toto = Range("A1")
   If Cells(Target.Row, Target.Column).Value "" Then toto.Activate Else Set toto Target
End Sub

et essaye


____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
ThomasDo Messages postés 9 Date d'inscription vendredi 15 mai 2009 Statut Membre Dernière intervention 11 février 2010
3 févr. 2010 à 16:56
Bonjour et merci pour la rapidité de votre réponse et de votre attention.
J'ai essayé le code que vous m'avez fournit mais je n'en comprends pas vraiment le sens: A chaque fois que je sélectionne une cellule, je suis renvoyé en A1. A quoi correspond toto?
Pour l'instant j'ai solutionner mon problème en renvoyant un msgBox lorsque l'utilisateur tente une selection multiple, afin qu'il ne puisse pas cliquer plusieurs fois sur la selection entière de ligne.
Désolé mais je suis pour l'instant un novice en VBA, jusqu'alors je codait uniquement en C# et j'ai encore du mal à m'y retrouver.
J'ai finis ma journée de travail et je rentre donc chez moi, je regarderai votre réponse demain avec attention.
Merci pour tout
Cordialement
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
3 févr. 2010 à 20:12
Cà, alors !
toto est un une plage (un range).... un objet, donc ...
Target est également un Range ... un o bjet, donc ...
Le reste est évident ! (pour peu qu'on s'intéresse aux rudiments de VBA/Excel) ...

____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
ThomasDo Messages postés 9 Date d'inscription vendredi 15 mai 2009 Statut Membre Dernière intervention 11 février 2010
4 févr. 2010 à 09:48
Bonjour et merci pour vos réponses. Je comprend votre étonnement mais le fait est que vba est un langage vieillissant et qu'il est pour moi (jeune développeur) beaucoup plus naturel de coder en C#, cependant cette fois si je n'ait pas le choix.
Je vais commenter ce que je comprend du code, merci de me corriger s'il y a des incohérences:
'Evenement qui se déclenche lors de la selection de cellules
'Target: l'objet contenant la/les cellules selectionnée(s)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'On initialise une plage de cellule nommée toto, qui ne référence rien
   Static toto As Range
'Si toto ne contient rien, on l'initialise avec la valeur de la cellule A1
   If toto Is Nothing Then Set toto = Range("A1")
'Si la valeur de la cellule selectionnee = rien
'Alors toto.activate -> on active toto et on est renvoyé en A1?
'Sinon toto=Target -> toto recoit la cellule selectionnee? -> on reste dans la cellule?
   If Cells(Target.Row, Target.Column).Value "" Then toto.Activate Else Set toto Target
End Sub

Voila, merci d'avance pour vos réponses, Cordialement
0
ThomasDo Messages postés 9 Date d'inscription vendredi 15 mai 2009 Statut Membre Dernière intervention 11 février 2010
4 févr. 2010 à 11:01
Merci, c'est vraiment très simpa de m'aiguiller de la sorte, j'ai bien compris votre code et l'ait adapté à mes besoins, cependant je n'ait pas utilisé de variable Toto. Pour info, je vous donne donc mon code final. Tout fonctionne, même si je pense qu'il n'est pas optimisé à 100%.

Option Explicit
Dim maPlage As Range

'Evenement qui se lève lorsque l'on sélectionne une/des cellules
Sub Worksheet_SelectionChange(ByVal Target As Range)
'On initialise maPlage avec les references du tableau sécurisé
Set maPlage = Range("tableauSecurised")

'Si on se trouve dans le tableau
If Not Application.Intersect(Target, maPlage) Is Nothing Then
    'Si on sélectionne une seule ligne et moins de 3 colonnes
    '(possibilitée de passer outre la sécurité sans cette condition en commençant à selectionner depuis l'exterieur du tableau)
    If Target.Rows.Count = 1 And Target.Columns.Count < 3 Then
        'Si la cellule est vide
        If IsEmpty(ActiveCell.Value) Then
            'On sort de la procédure->l'utilisateur à acces à la cellule
            Exit Sub
        Else
            'Si la cellule n'est pas vide -> On demmande un mot de passe
            DemandeMotDePasse
        End If
    Else
        'Si l'utilisateur tente une selection multiple -> On annule la saisie
        TentativeSelectionMultiple
    End If
Else
    'Si la selection ne fait pas partie du tableau protégé -> On ne fait rien
    Exit Sub
End If
End Sub
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
4 févr. 2010 à 11:15
Et pourquoi, dans ce cas :
- recenser toutes cellules vides dans un range
- protéger les cellules vides

Je ne comprends par ailleurs pas pourquoi tu demandes un mot de passe pour les cellules non vides (le contraire est compréhensible)....
Si maintenant tu cherches vraiment à protéger par un mot de passe les cellules non vides à modifier : protège donc toute ta feuille d'un seul coup et n'oblige l'utilisateur autorisé à modifier à ne donner qu'une seule fois ton mot de passe ! (et reprotège les cellules vides).
Enfin, voilà ...
____________________
Vous aimez Codes-Sources ? Il vous aide ? Cliquez ici pour l'aider à continuer
Cliquer sur "Réponse acceptée" en bas d'une solution adéquate est
0
ThomasDo Messages postés 9 Date d'inscription vendredi 15 mai 2009 Statut Membre Dernière intervention 11 février 2010
4 févr. 2010 à 12:09
En fait, le problème pour le service est que les agents s'inscrivaient à des sessions, puis modifiaient leurs inscriptions à leur gré malgrès qu'elles aient déja été validées.
L'objectif est donc que les agents, après s'être inscrit ne puissent plus avoir accès aux cellules concernées.
Le principal inconvénient de ma solution est que l'agent habilité à effectuer des modifications doive rentrer le mot de passe à chaque fois qu'il souhaite modifier une case (l'inscription se compose de plusieurs champs: service, nom, prenom et code de l'agent), et donc saisir 4 fois le mot de passe pour annuler une inscription.
J'ai bien sur penser à vérouiller les cellules dès que l'agent a écrit dedans, ce qui me semblait être la meilleure solution, mais je n'ait malheuresement sans succès.
J'ai essayer de me servir de:
With ActiveSheet
   .Cells.Locked = False
   .Range(ActiveCell).Locked = True 
   .Protect AllowFiltering:=True
End With

Je ne sais pas ou rentrer le mot de passe que l'agent devra saisir pour déverouiller la feuille, j'ai essayer dans ThisWorkbook mais cela ne correspondait pas à ce que je souhaitais: tout le document devennait vérouillé.
Voila, je me rend bien compte que mes lacunes peuvent agacer mais je ne développe en VBA que depuis lundi, néanmoins votre aide m'est très utile et je vous en suis très reconnaissant.
Merci pour tout, Cordialement
0
Rejoignez-nous