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 :

Insertion d'une ligne dans un tableau protégé [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Avril 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Avril 2014
    Messages : 31
    Points : 19
    Points
    19
    Par défaut Insertion d'une ligne dans un tableau protégé
    Bonjour,

    N'étant qu'un amateur VBA, j'apprends avec l'aide des forums et l'utilisation de l'enregistreur, d'oû mes diffcultés. J'ai passé des heures à chercher des solutions sur ce forum mais je n'arrive à rien de bien concluant.

    Je vous expose mon problème :

    Je dispose d'un tableau, pour lequel un certain nombre de données sont des champs renseignés par l'utilisateur (liste déroulante ou champs libre), d'autres étant des champs calculés. J'ai créé une ligne masquée (ligne 6) au dessus de ce tableau et à l'aide d'une macro les utilisateurs doivent pouvoir insérer cette ligne dans le tableau (copier / coller standard).

    Problème N°1 : j'aimerais que la macro "copie / colle" cette ligne en dessous de la ligne sélectionnée par l'utilisateur (actuellement ma macro "copie /colle" sur une ligne que j'ai identifiée). L'utilisateur doit pouvoir décider où il souhaite insérer cette ligne.

    Edit : problème N°1 résolu après quelques recherches et de nombreux essais infructueux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Insert()
    x = ActiveCell.Row
    ActiveSheet.Unprotect Password:="MSF"
    With Range("A" & x & ":Z" & x)
        .Insert Shift:=xlDown
        .Offset(-1).FillDown
        On Error Resume Next
        .Offset(-1).SpecialCells(xlCellTypeConstants, 23).ClearContents
        On Error GoTo 0
         ActiveSheet.Protect Password:="MSF"
            ActiveSheet.Protect userinterfaceonly:=True, Password:="MSF", DrawingObjects:=True, Contents:=True, Scenarios:=True _
            , AllowSorting:=True, AllowFiltering:=True
    End With
    End Sub
    Problème N°2 : J'aimerais que les macro ("insert" et "delete") ne soient actives que dans le tableau pour éviter que l'utilisateur ne supprime le titre par exemple ou les intitulés des colonnes. J'imagine qu'il faut pour cela nommer la plage correspondant au tableau, plage dont les coordonnées vont évoluer si nous ajoutons au supprimons des lignes. Je ne sais pas si cela est réalisable, ma difficulté n'ai pas de nommer cette plade, mais de la faire évoluer et surtout de n'autoriser les macros que dans cette plage (plage qui correspond à des lignes allant de 7 à 30 dans mon exemple).


    Problème N°3 : Lorsque je lance les macros, je m'assure que la feuille soit déprotégée, puis protégée à nouveau, mais j'aimerais qu'un certain nombre de fonctions restent accessibles à l'utilisateur : sélection de cellules vérouillées ou non, modification de format, utilisation de la fonction tri et enfin utilisation des filtres sur les cellules groupées.

    Edit : problème N°3 résolu - Merci à Philippe !!! - voir le code proposé et son message ci-après

    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
    Sub TestAutoFilter()
     Dim sht As Worksheet, rng As Range
     Set sht = ThisWorkbook.Sheets("db")
     sht.Protect userinterfaceonly:=True ' Protection de la feuille
     Set rng = sht.Range("A1").CurrentRegion
     MsgBox rng.Address
     With sht
      If Not (.AutoFilterMode) Then .Range("A1").AutoFilter
     End With
     sht.AutoFilter.Sort.SortFields.Clear
     sht.AutoFilter.Sort.SortFields.Add Key:=Range( _
         "L1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
         xlSortNormal
     With sht.AutoFilter.Sort
     .Header = xlYes
     .MatchCase = False
     .Orientation = xlTopToBottom
     .SortMethod = xlPinYin
     .Apply
     End With
    End Sub
    Je vous remercie par avance pour le temps que vous me consacrerez.

  2. #2
    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 769
    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 769
    Points : 28 629
    Points
    28 629
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Problème N°3 : Lorsque je lance les macros, je m'assure que la feuille soit déprotégée, puis protégée à nouveau, mais j'aimerais qu'un certain nombre de fonctions restent accessibles à l'utilisateur : sélection de cellules vérouillées ou non, modification de format, utilisation de la fonction tri et enfin utilisation des filtres sur les cellules groupées.
    Lorsque l'on protège manuellement une feuille, dans la boîte de dialogue Protéger la feuille, on peut apercevoir une liste d'option en dessous du texte Autoriser tous les utilisateurs de cette feuille à :. Cette phrase est suffisamment explicite pour comprendre que tous ce qui est coché autorise l'utilisateur à effectuer certaine chose même si la feuille est protégée.
    Pour en connaître le code VBA, il suffit de cocher les options en enclenchant au préalable l'enregistreur de macros.
    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

  3. #3
    Membre à l'essai
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Avril 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Avril 2014
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    Bonjour Philippe, et merci pour ta réponse,
    Je connais cette fonction de protection manuelle et je m'en suis servi. J'ai aussi eu recours à l'enregistreur pour connaître le code VBA, cela ne résoud pas mon problème de tri, ni de format.

  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 769
    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 769
    Points : 28 629
    Points
    28 629
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pour le tri effectivement même si l'option Autoriser Tri est cochée, le tri est impossible si les cellules contenant les étiquettes de colonnes sont protégées. par contre le formatage des cellules ne pose pas de problème à mon sens.
    Il est possible aussi de protéger par VBA la feuille en empêchant l'utilisateur d'accéder au cellules verrouillées tout en continuant à y accéder par VBA, L'argument est userinterfaceonly
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Dim sht As Worksheet
     Set sht = ThisWorkbook.Sheets("db")
     sht.Protect userinterfaceonly:=True
    et là par code, pas de problème pour trier. Il suffit de placer un bouton dans la boîte d'outil personnalisée appelant ta procédure.
    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
    Membre à l'essai
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Avril 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Avril 2014
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    Merci pour ces précisions, il semble que le tri soit impossible si une cellule du tableau est vérrouillée (pas seulement les étiquettes). La seule solution (dans la limite de mes connaissances), c'est de laisser mes cellules dévérouillées ou de prendre un stagiaire qui touche un peu en VBA.
    Merci d'avoir pris le temps de me répondre.

  6. #6
    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 769
    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 769
    Points : 28 629
    Points
    28 629
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Sauf si je le précise, je fais toujours un test avant de répondre ne fut-ce que pour éviter des erreurs de syntaxe.
    Donc voici le test complet que j'ai réalisé (Tri par l'AutoFilter) sur une feuille dont toutes les cellules étaient protégées.
    La plage de données est A1:M15 sur une feuille nommée [db], la colonne L est triée par ordre croissant par l'outil AutoFiltre. Test réalisé sur Office 2010 PRO
    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
    Sub TestAutoFilter()
     Dim sht As Worksheet, rng As Range
     Set sht = ThisWorkbook.Sheets("db")
     sht.Protect userinterfaceonly:=True ' Protection de la feuille
     Set rng = sht.Range("A1").CurrentRegion
     MsgBox rng.Address
     With sht
      If Not (.AutoFilterMode) Then .Range("A1").AutoFilter
     End With
     sht.AutoFilter.Sort.SortFields.Clear
     sht.AutoFilter.Sort.SortFields.Add Key:=Range( _
         "L1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
         xlSortNormal
     With sht.AutoFilter.Sort
     .Header = xlYes
     .MatchCase = False
     .Orientation = xlTopToBottom
     .SortMethod = xlPinYin
     .Apply
     End With
    End Sub
    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

  7. #7
    Membre à l'essai
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Avril 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Contrôleur de gestion
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Avril 2014
    Messages : 31
    Points : 19
    Points
    19
    Par défaut
    Bonjour Philippe et merci infiniment, j'ai adapté ce code à mon fichier et les résultats sont satisfaisants, je vais limiter le fitre à une colonne et par ordre de croissant, cela sera amplement suffisant dans mon cas.

  8. #8
    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 769
    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 769
    Points : 28 629
    Points
    28 629
    Billets dans le blog
    53
    Par défaut
    Bonjour Arnault,
    Merci pour ton retour d'information et pour le vote cela fait toujours plaisir.
    Si tu souhaites trier ton tableau sur plusieurs colonnes (maximum 3), croissant et/ou décroissant et d'autres possibilités, j'ai écris une fonction toutes faites et très complètes qu'il suffit de copier dans un module et d'invoquer depuis une de tes procédures.
    Voir l'explication dans cette contribution Procédure de tri - Excel 2003-2010 qui renvoie vers un lien de téléchargement où tu trouveras un classeur à télécharger avec des exemples. Tu peux aussi aller directement vers ce lien en cliquant sur l'emblème Posteur de source qui se trouve juste en dessous des étoiles dans le bandeau gauche.
    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

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

Discussions similaires

  1. [HTML] Sélectionner une ligne dans un tableau en html
    Par jehlg dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 16/06/2008, 11h55
  2. Ajax : insertion d'une ligne dans un tableau
    Par Flackou dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 26/05/2008, 13h50
  3. [VBA-E]insertion automatique d'une ligne dans un tableau
    Par janus82 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 06/04/2006, 15h42
  4. selection d'une ligne dans un tableau en html
    Par jehlg dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/02/2006, 23h08
  5. probleme bizarre de hauteur auto d'une ligne dans un tableau
    Par zax-tfh dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 17/01/2005, 23h34

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