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 :

Code VBA pour empêcher utilisateur de supprimer une ligne


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Gestionnaire de camping
    Inscrit en
    Septembre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Gestionnaire de camping
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2014
    Messages : 23
    Points : 16
    Points
    16
    Par défaut Code VBA pour empêcher utilisateur de supprimer une ligne
    Bonsoir à tous,
    des heures que je cherche et personne n'a visiblement eu besoin de cela.
    J'ai écris un code dans thisworkbook qui empêche de supprimer une ligne. Ca je l'ai fait, ça marche en mettant count>10, car je n'ai pas réussi à trouver comment dire que c'est une ligne dont je veux empêcher la suppression. Là déjà, si quelqu'un peut m'aider, c'est bien.
    Ensuite je voudrais que cela soit quand même possible si c'est une macro qui demande la suppression de ligne. Un code qui dit : si "demandé par macro" then exit sub else "empêche le suppression" etc...
    Je veux donc forcer l'utilisateur à utiliser mes procédures dans mes userform, plutôt que supprimer n'importe quoi sans les vérifications que j'ai incluses dans mes userform.
    Le code ci-dessous fonctionne, sauf si une procédure du userform est lancée et qui bug. Ensuite, le code dans thisworkbook ne fonctionne plus, dans tous les cas, il faut ré-ouvrir le classeur pour que ça re-fonctionne. Là aussi j'aimerai en savoir plus.

    Merci à tous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal target As Range)
     
     
       If target.Count > 10 Then
            With Application
                .EnableEvents = False
                .Undo
                .EnableEvents = True
            End With
        MsgBox "Ne jamais supprimer de ligne sans les formulaires !"
        End If
    End Sub
    A votre bon coeur.

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 182
    Points : 5 514
    Points
    5 514
    Par défaut Une façon de faire
    est de passer par une variable globale et une fonction.
    Exemple: avoir ce code dans un module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Option Explicit
     
    Dim ViaMacro As Boolean
     
    Sub DeleteRow10()    '--- exemple de macro
        ViaMacro = True
        Rows(10).Delete
        ViaMacro = False
    End Sub
     
    Public Function DepuisMacro() As Boolean
        DepuisMacro = ViaMacro
    End Function
    et avoir ce code dans ThisWorkbook
    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
    Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal target As Range)
        Debug.Print target.Address, DepuisMacro
        If DepuisMacro Then
            '--- continuer
        Else
            If target.Count > 10 Then
                With Application
                    .EnableEvents = False
                    .Undo
                    .EnableEvents = True
                End With
            MsgBox "Ne jamais supprimer de ligne sans les formulaires !"
            End If
        End If
    End Sub
    En testant j'ai eu des problèmes en voulant utiliser directement la variable globale ViaMacro dans ThisWorkbook. Cela plante.
    Dans ThisWorkbook, il faut passer par la fonction pour ramener la valeur de cette variable globale.
    Elle n'est donc "globale" que pour les modules, pas pour ThisWorkbook.

    Bonne continuation.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Gestionnaire de camping
    Inscrit en
    Septembre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Gestionnaire de camping
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2014
    Messages : 23
    Points : 16
    Points
    16
    Par défaut C'est réglé.
    Merci pour la réponse.

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 755
    Points : 28 606
    Points
    28 606
    Billets dans le blog
    53
    Par défaut
    Bonjour EricDgn,
    Belle astuce mais
    est de passer par une variable globale et une fonction.
    et
    En testant j'ai eu des problèmes en voulant utiliser directement la variable globale ViaMacro dans ThisWorkbook. Cela plante.
    La déclaration de la variable en tête de module (Dim ViaMacro As Boolean), n'est pas pour une variable globale pour le projet mais une variable Module.

    Si tu fais précéder le nom de la variable par le mot clé Public, celle-ci sera bien entendu reconnue dans le module de classe ThisWorkbook
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public ViaMacro As Boolean
    Lire ce chapitre V. Les niveaux de variables
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour
    sinon je ferais comme ceci
    dans le module de la feuille concerné
    ca te permet de la modifier mais pas la supprimer
    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
    Dim oldvalue_11 As string
    Private Sub Worksheet_Activate()
        oldvalue_11 = Cells(11, 1)
    End Sub
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Row <> 10 Then oldvalue_11 = Cells(11, 1) ' au cas ou on modifie entre temps la cellule en dessous car c'est notre repère et comme ca notre oldvalue_11 est toujours a jour
        ' parce que quand tu supprime la ligne la ligne 11 devient la ligne 10
        If Target.Row = 10 Then
            If Cells(11, 1) <> oldvalue_11 Then
                With Application
                    .EnableEvents = False
                    .Undo
                    .EnableEvents = True
                End With
            End If
        End If
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 942
    Points
    55 942
    Billets dans le blog
    131
    Par défaut
    Salut.

    Une façon de réaliser cela à peu de frais... à tester en fonction de la version utilisée...

    • Déprotéger toutes les cellules de la feuille;
    • protéger la feuille en cochant toutes les permissions sauf la suppression de lignes (avec ou sans mot de passe).



    Pour pouvoir supprimer la ligne par VBA, il suffit simplement d'utiliser le code feuilXXX.Protect userinterfaceonly:=true en utilisant un mdp si souhaité. Cela ne place la protection qu'au niveau d'Excel, laissant toutes les possibilités d'action au VBA. Il est intéressant de noter que déprotection puis la reprotection par Excel n'altère pas la propriété UserInterfaceOnly.

    Toute l'opération du paramétrage de la protection et de la protection elle-même peut être réalisée en VBA, notamment si cela doit être réalisé sur plusieurs feuilles.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Function ProtectSheet(sh As Worksheet)
      sh.Cells.Locked = False
      sh.Protect "123", True, True, True, True, True, True, True, True, True, True, True, False, True, True, True
    End Function
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Membre à l'essai
    Homme Profil pro
    Gestionnaire de camping
    Inscrit en
    Septembre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Gestionnaire de camping
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2014
    Messages : 23
    Points : 16
    Points
    16
    Par défaut Oui mais...
    Oui Pierre,
    l'idée de la protection était ma première idée. Malheureusement, la fonction userinterfaceonly ne fonctionne pas comme on le souhaite. Je précise que la feuille et les cellules étaient paramétrée correctement. Mais rien n'y fait.
    Alors je me suis orienté sur l'interdiction de suppression.
    Merci.

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 942
    Points
    55 942
    Billets dans le blog
    131
    Par défaut
    Ok. Pour ma culture personnelle, j'apprécierais que tu définisses ne fonctionne pas comme on le souhaite
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre à l'essai
    Homme Profil pro
    Gestionnaire de camping
    Inscrit en
    Septembre 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Gestionnaire de camping
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2014
    Messages : 23
    Points : 16
    Points
    16
    Par défaut Explications
    Houlala !
    Depuis tout ce temps je ne me suis pas aperçu que tu avais répondu. J'avais mis résolu, car problème abandonné.
    Désolé.
    Du coup, mes meilleurs voeux.

    Alors je précise ce que veut dire ne fonctionne pas comme on le souhaite :
    la fonction userinterfaceonly était censée n'autoriser la suppression que si cela était demandé dans mon userform. Échec total, la surpression était possible quelque soit le moyen. Manuelle ou macro.

    Voilà.
    Le projet a été abandonné.

    Bon courage.

  10. #10
    Membre actif
    Homme Profil pro
    Pompier de service
    Inscrit en
    Février 2014
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Pompier de service

    Informations forums :
    Inscription : Février 2014
    Messages : 144
    Points : 223
    Points
    223
    Par défaut
    Citation Envoyé par serpiccio Voir le message
    Alors je précise ce que veut dire ne fonctionne pas comme on le souhaite :
    la fonction userinterfaceonly était censée n'autoriser la suppression que si cela était demandé dans mon userform. Échec total, la surpression était possible quelque soit le moyen. Manuelle ou macro.
    Même si la discussion est close, ton problème m'intéresse, car à chaque fois que j'ai fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Feuil1").Protect "pass", , , , True
    , ma feuille était bien protégée contre toute modification MANUELLE, seules les actions sur la feuille VIA LE CODE VBA étaient exécutées (donc y compris celles inclues dans une UF)

    Pourrais-tu STP nous en dire plus ?
    "Rien ne sert de dire ce qu'on fait, si on ne fait pas ce qu'on dit" (Moi)

  11. #11
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 942
    Points
    55 942
    Billets dans le blog
    131
    Par défaut
    Salut.

    La protection de la feuille, c'est uniquement la protection de la feuille. Ca n'a rien à voir avec un userform qui n'est nullement impacté par la protection.

    Donc, UserInterfaceOnly ou non, on pourra toujours modifier les données dans un userform. C'est au développeur du userform de mettre en place la protection de celui-ci.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  12. #12
    Membre actif
    Homme Profil pro
    Pompier de service
    Inscrit en
    Février 2014
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Pompier de service

    Informations forums :
    Inscription : Février 2014
    Messages : 144
    Points : 223
    Points
    223
    Par défaut
    je suis bien d'accord avec toi, Pierre, mais comme le message initial faisait référence à un évènement "Workbook_SheetChange", il était clair qu'il ne parlait pas d'UF mais bien de feuille... pour lesquelles la protection marche (à ma connaissance) correctement...
    "Rien ne sert de dire ce qu'on fait, si on ne fait pas ce qu'on dit" (Moi)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trigger pour empêcher un utilisateur de supprimer une ligne
    Par bams1205 dans le forum SQL Procédural
    Réponses: 10
    Dernier message: 03/04/2017, 15h59
  2. [XL-2007] Code VBA pour le transfert automatique d'une feuille à l'autre
    Par parky67 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/07/2012, 16h21
  3. Code pour empêcher la modifcation d'une cellule
    Par gaefor dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/08/2007, 05h55
  4. [VBA Excel] Userform pour supprimer une ligne précise
    Par Viper7 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/06/2006, 14h32
  5. Réponses: 3
    Dernier message: 06/09/2005, 10h27

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