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

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

    Informations forums :
    Inscription : septembre 2014
    Messages : 20
    Points : 10
    Points
    10

    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
    Membre éprouvé
    Homme Profil pro
    retraité
    Inscrit en
    juin 2012
    Messages
    614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

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

    Informations forums :
    Inscription : juin 2012
    Messages : 614
    Points : 987
    Points
    987

    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
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Corse (Corse)

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

    Informations forums :
    Inscription : septembre 2014
    Messages : 20
    Points : 10
    Points
    10

    Par défaut C'est réglé.

    Merci pour la réponse.

  4. #4
    Rédacteur

    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    janvier 2010
    Messages
    7 730
    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 : 7 730
    Points : 18 074
    Points
    18 074
    Billets dans le blog
    6

    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
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  5. #5
    Expert éminent sénior
    Avatar de patricktoulon
    Profil pro
    Inscrit en
    avril 2009
    Messages
    10 984
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Secteur : Bâtiment

    Informations forums :
    Inscription : avril 2009
    Messages : 10 984
    Points : 17 486
    Points
    17 486
    Billets dans le blog
    1

    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 : résolu: ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Responsable
    Office & Excel

    Avatar de Pierre Fauconnier
    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    10 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 10 932
    Points : 27 186
    Points
    27 186
    Billets dans le blog
    19

    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)
    ---------------
    Vous souhaitez rédiger pour DVP? Contactez-moi
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    Vous avez apprécié l'intervention => Merci pour le
    ---------------

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

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

    Informations forums :
    Inscription : septembre 2014
    Messages : 20
    Points : 10
    Points
    10

    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

    Avatar de Pierre Fauconnier
    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    10 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 10 932
    Points : 27 186
    Points
    27 186
    Billets dans le blog
    19

    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)
    ---------------
    Vous souhaitez rédiger pour DVP? Contactez-moi
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    Vous avez apprécié l'intervention => Merci pour le
    ---------------

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

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

    Informations forums :
    Inscription : septembre 2014
    Messages : 20
    Points : 10
    Points
    10

    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 habitué
    Homme Profil pro
    Pompier de service
    Inscrit en
    février 2014
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Pompier de service

    Informations forums :
    Inscription : février 2014
    Messages : 101
    Points : 169
    Points
    169

    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

    Avatar de Pierre Fauconnier
    Homme Profil pro
    Formateur et développeur informatique indépendant
    Inscrit en
    novembre 2003
    Messages
    10 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur informatique indépendant
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 10 932
    Points : 27 186
    Points
    27 186
    Billets dans le blog
    19

    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)
    ---------------
    Vous souhaitez rédiger pour DVP? Contactez-moi
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    Vous avez apprécié l'intervention => Merci pour le
    ---------------

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

    Informations professionnelles :
    Activité : Pompier de service

    Informations forums :
    Inscription : février 2014
    Messages : 101
    Points : 169
    Points
    169

    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, 16h59
  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, 17h21
  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, 06h55
  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, 15h32
  5. Réponses: 3
    Dernier message: 06/09/2005, 11h27

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