IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

VBA : Déverouillez des lignes à partir d'un nom dans une colonne et d'un mot de passe


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juin 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Juin 2019
    Messages : 2
    Points : 1
    Points
    1
    Par défaut VBA : Déverouillez des lignes à partir d'un nom dans une colonne et d'un mot de passe
    Bonjour à tous,
    Débutante en VBA j'aimerais pouvoir permettre à d'autres utilisateurs de déverrouiller pour modification seulement des lignes rapportées à nom grâce à un mot de passe.
    Imaginons que j’ai une feuille appelée «legume »
    Que la colonne D comporte le nom du légume et les colonnes E à Z des poids
    Imaginons que dans la colonne D il y ait les noms Tomate, Concombre, Poivron
    J’aimerai verrouiller la feuille et qu’à l’aide d’un mot de passe on puisse déverouiller que certaines lignes.

    Selon cette logique :
    Si le mot de passe = « T » alors Dévérouiller toutes les lignes comportant le mot Tomate dans la colonne D
    Sinon si le mot de passe = « C » alors Dévérouiller toutes les lignes comportant le mot Concombre dans la colonne D
    Sinon
    Feuille verouillée


    J’ai essayé de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Private Sub acces()
    Sheets("legume").Select
    Dim passe As String
    passe = InputBox("Entrez votre mot de passe :")
      If passe = "T" Then
         If Range("D") = "Tomate" Then
            Range("E:Z").Select
           Range("E:Z").Locked = False
        Else
        ActiveSheet.Protect
        End If
     
     
    Else if passe = "C" Then
         If Range("D") = "Concombre" Then
          Range("E:Z").Select
         Range("E:Z").Locked = False
       Else
        ActiveSheet.Protect
        End If 
    Else 
    MsgBox("Erreur")
    End if
    End Sub
    Par avance merci pour vos réponse !

  2. #2
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Bonjour Anne Sophie et Bienvenu sur le Forum,

    Plusieurs remarques.
    - Toujours reporter un code en le bornant par les balises #
    - A de rares exceptions près, les méthodes Select et Activate ne sont d'aucune utilité.
    - Plutôt que de combiner des blocs If, mieux vaut utiliser le bloc Select Case en utilisant éventuellement la valeur booléenne True. Le code gagnera en lisibilité. C'est mon avis.
    - Cette lisibilité sera d'autant améliorée si le code est bien indenté (mise en retrait des lignes incluses dans les blocs)
    - Pour une meilleure sécurité, toute protection (feuille de travail ou classeur) devrait s'affecter via un mot de passe.

    Sur la syntaxe
    Désigner un objet Range par range("D"), Range("Z") m'interpelle.
    Mieux vaut définir, à mon avis, précisément les plages de cellules concernées.

    Le principe du Forum étant l'aide, une question:
    Sur la base de ce code, aux remarques énoncées près, quelle est la problématique? (Quel message d'erreur sur quelle ligne de code?)

    Ainsi, tu peux revenir avec un code en précisant le(s) point(s) d'achoppement éventuel(s).

    A toute fin utile, ci-joint un document comportant plusieurs liens pouvant t'aider dans ta démarche, notamment sur les objets Range et Worksheet où tu pourras consulter les paragraphes relatifs à leur protection.
    Fichiers attachés Fichiers attachés

  3. #3
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Bonjour le fil, bonjour le forum,

    En reprenant les remarques judicieuses de Marcel, je te propose le code ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Private Sub acces()
    Dim O As Worksheet 'déclare la variable O (Onglet)
    Dim Passe As Variant 'déclare la variable Passe
    Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
     
    Set O = Sheets("legume") 'définit l'onglet O
    DL = Cells(Application.Rows.Count, "D").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne D de l'onglet O
    Passe = Application.InputBox("Entrez votre mot de passe :", "Mot de passe", Type:=2) 'définit la boîte d'entrée Passe
    If Passe = False Then Exit Sub 'si Passe = [Annuler], sort de la procédure
    Select Case Passe 'agit en fonction de la valeur de Passe
        Case Is = "T" 'cas "T"
            For I = 1 To DL 'boucle sur toutes les lignes éditée I de la colonne D de l'onglet O
                If O.Cells(I, "D").Value = "Tomate" Then 'condition : si la cellule ligne I colonne D vaut "Tomate"
                    O.Unprotect 'déprotège l'onglet O
                    O.Cells(I, "E").Resize(1, 22).Locked = False 'déverrouille les cellules ligne I des colonnes E à Z
                    O.Protect 'protège l'onglet O
                End If 'fin de la condition
            Next I 'prochaine ligne de la boucle
        Case "C" 'cas "C"
            For I = 1 To DL 'boucle sur toutes les lignes éditée I de la colonne D de l'onglet O
                If O.Cells(I, "D").Value = "Concombre" Then 'condition : si la cellule ligne I colonne D vaut "Concombre"
                    O.Unprotect 'déprotège l'onglet O
                    O.Cells(I, "E").Resize(1, 22).Locked = False 'déverrouille les cellules ligne I des colonnes E à Z
                    O.Protect 'protège l'onglet O
                End If 'fin de la condition
            Next I 'prochaine ligne de la boucle
        Case Else 'tous les autre cas
            O.Protect 'protège l'onglet O
            MsgBox ("Erreur") 'message
    End Select 'fin de l'action en fonction la valeur de Passe
    End Sub

  4. #4
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Si tu permets, Thautheme.

    J'aurais considéré une autre architecture du code.
    L'exécution du code serait soumis à une entrée valide
    Afin qu'il n'ait lieu qu'une seule fois, le balayage des cellules précèderait la gestion du mot clé (passe)
    Les expressions booléennes peuvent se gérer comme des variables numériques, ce qui permet une économie de bloc If

    Ces paramètres contribuent à l'allègement du code, et, partant, à sa lisibilité.

    Je n'ai pas testé, mais voici l'esprit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Private Sub acces()
     
    Dim O As Worksheet 'déclare la variable O (Onglet)
    Dim Passe As String 'déclare la variable Passe
    Dim DL As Long 'déclare la variable DL (Dernière Ligne)
    Dim i As Long
     
    Passe = Application.InputBox(Prompt:="Entrez votre mot de passe :", Title:="Mot de passe", Type:=2) 'définit la boîte d'entrée Passe
    If Passe = False Then Exit Sub 'si Passe = [Annuler], sort de la procédure
     
    Do While Passe <> "T" And Passe <> "C"
            MsgBox Prompt:="Erreur de saisie" & Chr(13) & "Vous devez saisir ""T"" ou ""C"".", Buttons:=vbCritical, Title:="Erreur"
    Loop
     
    Set O = ThisWorkbook.Worksheets("legume") 'définit l'onglet O
     
    With O
     
            .Unprotect Password:="mercatog"
     
            DL = .Cells(.Rows.Count, "D").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne D de l'onglet O
            For i = 1 To DL 'boucle sur toutes les lignes éditée I de la colonne D de l'onglet O
     
                    Select Case Passe 'agit en fonction de la valeur de Passe
     
                        Case Is = "T" 'cas "T"
                                    .Cells(i, "E").Resize(1, 22).Locked = (.Cells(i, "D").Value <> "Tomate") 'déverrouille les cellules ligne I des colonnes E à Z
                        Case Is = "C" 'cas "C"
                                    .Cells(i, "E").Resize(1, 22).Locked = (.Cells(i, "D").Value <> "Concombre") 'déverrouille les cellules ligne I des colonnes E à Z
     
                    End Select 'fin de l'action en fonction la valeur de Passe
     
            Next i
     
            .Protect Password:="mercatog"
     
    End With
     
    Set O = Nothing
     
    End Sub

  5. #5
    Membre émérite Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Points : 2 594
    Points
    2 594
    Par défaut
    Re,

    Bien sûr que je permets !... Mais je t'avoue que le Case Else me semble tout aussi efficace... En revanche, dévoiler un mot de passe dans un message ?!...


  6. #6
    Expert éminent
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Points : 7 149
    Points
    7 149
    Billets dans le blog
    7
    Par défaut
    Salut,

    Comme je l'ai mentionné, c'est une question d'architecture donc de démarche.
    L'exécution du code est soumis à un contrôle, en amont, du mot entré.

  7. #7
    Nouveau Candidat au Club
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Juin 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 31
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Juin 2019
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    Merci MarcelG et Thautheme pour vos réponses !
    j'ai appliqué vos recommandations sur mon fichier et..ça fonctionne!

    Merci Thautheme pour l'exemple de code cela m'a bien aidé

    et le mémento VBA, MarcelG, est à présent à porté de main sur mon bureau

    Encore merci
    Bonne semaine

Discussions similaires

  1. [XL-2016] fusionner les deux lignes avec le même nom dans une colonne
    Par methos01 dans le forum Excel
    Réponses: 4
    Dernier message: 27/03/2017, 15h26
  2. Explosion de lignes à partir d'un nombre dans une colonne
    Par cerede2000 dans le forum Développement
    Réponses: 4
    Dernier message: 05/08/2016, 16h10
  3. Réponses: 5
    Dernier message: 22/07/2011, 17h13
  4. Réponses: 2
    Dernier message: 19/01/2010, 11h08
  5. Stocker des entier à partir d'un fichier dans une ArrayList
    Par FstDsi dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 10/07/2009, 11h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo