1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    avril 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 9
    Points : 5
    Points
    5

    Par défaut Insertion d'une ligne avec recopie des formules sur feuille protégée

    Bonjour,
    Je voudrais, sur un classeur contenant plusieurs feuilles protégées, permettre à l'utilisateur d'insérer une ligne supplémentaire simultanément sur plusieurs feuilles.
    Dans un premier temps, j'ai écrit la macro suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub InsertionLigne()
    '
    'permet d'insérer une ligne vide sur toutes les feuilles protégées par un mot de passe
    'l'insertion se fait sur la ligne où se trouve la sélection
    '
        ligne = ActiveCell.Row
        For i = 1 To Sheets.Count
            Sheets(i).Unprotect ("toto")
            Sheets(i).Rows(ligne).Insert shift:=xlDown
            Sheets(i).Protect ("toto")
        Next
    End Sub
    Ça marche bien mais ça ne recopie pas les formules dans la nouvelle ligne.
    J'ai alors essayé ceci :
    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 InsertionLigne()
    '
    'permet d'insérer une ligne vide sur toutes les feuilles protégées par un mot de passe
    'l'insertion se fait sur la ligne où se trouve la sélection
    '
        ligne = ActiveCell.Row
        For i = 1 To Sheets.Count
            Sheets(i).Unprotect ("toto")
            Sheets(i).Rows(ligne).Insert shift:=xlDown
            For j = 1 To 10        'on ne cherche la présence de formules que dans les 10 premières colonnes
                If Sheets(i).Cells(ligne - 1, j).HasFormula Then
                    Sheets(i).Cells(ligne - 1, j).Select
                    Selection.Copy
                    Sheets(i).Cells(ligne, j).Select
                    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
                End If
            Next
            Sheets(i).Protect ("toto")
        Next
    End Sub
    Maintenant, il se produit une erreur sur ce code, que je n'arrive pas à expliquer (Croix rouge avec code 400).
    Quelqu'un peut-il m'aider ?
    Sine qua non : un traceur de courbes gratuit
    http://perso.wanadoo.fr/patrice.rabiller/
    Patrice Rabiller

  2. #2
    Rédacteur

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

    Par défaut

    Bonjour,
    A ta place je créerais une fonction indépendante comme par exemple celle-ci
    Dans cet exemple, on suppose que les données commencent à la ligne 1 qui contient les étiquettes de colonnes et les données à partir de la ligne 2
    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
    Function InsertFunction(sht As Worksheet, RowNumber As Long, NumberOfColumns As Integer, Optional PassWord As String) As Boolean
     ' Arguments
     ' sht            Objet feuille
     ' RowNumber      Numéro de la ligne à insérer
     ' NumberOfColums Nombre de colonnes à vérifier
     ' [PassWord]     Mot de passe par défaut pas de mot de passe
     Dim c As Integer
     If RowNumber > 2 Then
       With sht
        If Len(PassWord) Then .Unprotect PassWord
       .Rows(RowNumber).Insert shift:=xlDown
        For c = 1 To NumberOfColumns
         If .Cells(2, c).HasFormula Then
          .Cells(2, c).Copy .Cells(RowNumber, c)
         End If
        Next
        If Len(PassWord) Then .Protect PassWord
       End With
     InsertFunction = True
     End If
    End Function
    Que l'on invoque comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InsertFunction ThisWorkbook.Sheets("monTest"), ActiveCell.Row, 7, "toto"
    ou comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        If Not InsertFunction(ThisWorkbook.Sheets("monTest"), ActiveCell.Row, 7, "toto") Then
         MsgBox "Pas d'insertion pour les lignes 1 à 2", vbCritical
        End If
    donc pour l'adapter à ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub InsertionLigne()
      Dim i As Integer, ligne As Long
      ligne = ActiveCell.Row
      For i = 1 To Sheets.Count
        If Not InsertFunction(ThisWorkbook.Sheets(i), ligne, 10, "toto") Then
          MsgBox "Pas d'insertion pour les lignes 1 à 2", vbCritical
        End If
      Next
    End Sub
    Le fait de créer une fonction indépendante te facilite la maintenance de ton code et allège la procédure appelante.
    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

  3. #3
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    juin 2007
    Messages
    7 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : juin 2007
    Messages : 7 619
    Points : 13 890
    Points
    13 890

    Par défaut

    Citation Envoyé par patrice rabiller Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub InsertionLigne()
        ligne = ActiveCell.Row
        For i = 1 To Sheets.Count
            Sheets(i).Unprotect ("toto")
            Sheets(i).Rows(ligne).Insert shift:=xlDown
            Sheets(i).Protect ("toto")
        Next
    End Sub
    Ça marche bien mais ça ne recopie pas les formules dans la nouvelle ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub InsertionLigne()
        Dim ligne As Long, i As Long
        ligne = ActiveCell.Row
        For i = 1 To Sheets.Count
            Sheets(i).Unprotect ("toto")
            Sheets(i).Rows(ligne).Copy
            Sheets(i).Rows(ligne).Insert shift:=xlDown
            Sheets(i).Protect ("toto")
        Next i
    End Sub
    Mais le code à créer dépend des références contenues dans tes formules. Donc, sans connaitre ces formules, il y a de fortes chances que les codes proposés ne conviennent pas.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    avril 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 9
    Points : 5
    Points
    5

    Par défaut

    Merci pour votre aide.
    En réalité, ce n'est pas un classeur excel que j'ai fabriqué. C'est un ami qui souhaitait ajouter cette possibilité à son classeur. Je ne connais donc pas en détail la nature des formules qui doivent être recopiées. Je vais me renseigner pour savoir si la solution proposée répond bien à sa demande.

    Je vous tiendrai au courant dès que le problème sera résolu.
    Sine qua non : un traceur de courbes gratuit
    http://perso.wanadoo.fr/patrice.rabiller/
    Patrice Rabiller

Discussions similaires

  1. [XL-2007] Insertion d'une ligne avec copie de certains éléments
    Par Zentin dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 04/07/2014, 17h48
  2. Insérer une ligne en recopiant les formules et mise en forme
    Par mogo107 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 12/06/2013, 22h05
  3. [XL-2003] Insertion d'une ligne avec recopie des formules ?
    Par OtObOx dans le forum Excel
    Réponses: 6
    Dernier message: 31/03/2012, 22h00
  4. [XL-2007] Insertion d'une ligne avec sous-totaux
    Par VIPNO dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 09/02/2012, 16h41
  5. [E-03] Insertion d'une ligne en conservant les formules existantes
    Par neosapri dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/03/2009, 13h42

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