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 ligne VBA (en-dessous de la ligne active) [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Contrôleur de gestion
    Inscrit en
    Avril 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2014
    Messages : 31
    Par défaut Insertion ligne VBA (en-dessous de la ligne active)
    Bonjour,

    Je trouve toujours une grande source d'inspiration sur ce site alors que je ne connais pas le VBA, mais j'arrive tout de même à bricoler des choses. Je me retrouve donc à vous soumettre un fichier et le code qui m'a permis d'insérer une ligne dans une plage délimitée. J'ai deux points à vous soumettre :

    1/ j'aimerais que ma macro insére une ligne en-dessous de la cellule active et non pas en dessus.
    2/ j'aimerais ajouter un message d'erreur via msgbox pour indiquer que l'action "d'insérer la ligne" n'est pas possible en dehors du champ, mais je ne comprends pas où mettre cette commande

    Point complémentaire : toute remarque sur mon code sera la bienvenue (je suis vraiment un bricoleur et le code peut certainement être un peu plus propre)

    Voilà mon code et le fichier attaché :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    Sub Insert_BFU2()
     
     
    ' Cette macro permet d'insérer une ligne dans le document.
     
    Dim DernièreLigne As Long
    Dim x As Long
    Dim y As Long
     
    ' Définition de la zone cible, càd, la plage dans laquelle peut être inserée une ligne
    ' Astuce : la dernière ligne est définie comme étant la dernière ligne non-vide, pour obtenir une ligne non vide, j'ai saisi "MSF" dans la cellule choisie.
     
        x = ActiveCell.Row
        DernièreLigne = ActiveSheet.Range("AY7").End(xlDown).Row
     
     
    ' Si l'utilisateur se positionne en dehors de cette plage (ligne 7 à "dernière ligne"), la commande s'arrête
     
    If Not ((x > 9) And (x < DernièreLigne)) Then
    Exit Sub
    End If
     
    'Déprotection de la feuille dont le mot de passe est "MSF"
     
        ActiveSheet.Unprotect Password:="MSF"
     
    ' Insertion de la nouvelle ligne : les cellules copiées cont de la colonne A à la colonne J
     
    With Range("A" & x & ":AY" & x)
        .Insert Shift:=xlDown
        .Offset(-1).FillDown
        .Offset(-1).Clear
        .Offset(-1).Locked = Falseµ
        .Offset(-1).NumberFormat = "#,##0.00"
     
    ' Une manière de contourner les erreurs d'exécution du script (peut certainement être revu et amélioré...)
     
    On Error Resume Next
        .Offset(-1).SpecialCells(xlCellTypeConstants, 23).ClearContents
     
    'Protection de la feuille dont le mot de passe est "MSF"
     
    On Error GoTo 0
        ActiveSheet.Protect UserInterfaceOnly:=True, Password:="MSF", DrawingObjects:=True, Contents:=True, Scenarios:=False _
    , AllowSorting:=True, AllowFiltering:=True, AllowFormattingCells:=True, AllowFormattingColumns:=False, _
    AllowFormattingRows:=False
     
    End With
     
     End Sub

    ... Pour info, j'ai aussi ajouté une autre macro pour supprimer certaines lignes (seulement celles qui sont insérées) :

    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
       Sub Delete_BFU2()
    ' Cette macro permet de supprimer une ligne dans le document.
     
    Dim DernièreLigne As Long
    Dim x As Long
    Dim y As String
     
    ' Définition de la zone cible, càd, la plage dans laquelle peut être suprimée une ligne
    ' Astuce : la dernière ligne est définie comme étant la dernière ligne non-vide, pour obtenir une ligne non vide, j'ai saisi "MSF" dans la cellule choisie.
     
        x = ActiveCell.Row
        y = Cells(x, 1)
        DernièreLigne = ActiveSheet.Range("AY7").End(xlDown).Row
     
    ' Si l'utilisateur se positionne en dehors de cette plage (ligne 7 à "dernière ligne"), la commande s'arrête
     
    If Not ((x > 9) And (x < DernièreLigne)) Then
    Exit Sub
    End If
     
    If Not (y = "") Then
    Exit Sub
    End If
     
    'Déprotection de la feuille dont le mot de passe est "MSF"
     
        ActiveSheet.Unprotect Password:="MSF"
     
    ' Suppression de la ligne selectionée
    With ActiveSheet
     
    Rows(ActiveCell.Row).Delete Shift:=xlUp
    ActiveSheet.Protect UserInterfaceOnly:=True, Password:="MSF", DrawingObjects:=True, Contents:=True, Scenarios:=False _
    , AllowSorting:=True, AllowFiltering:=True, AllowFormattingCells:=True, AllowFormattingColumns:=False, _
    AllowFormattingRows:=False
    End With
    End Sub
    Je vous remercie pour votre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    j'aimerais que ma macro insére une ligne en-dessous de la cellule active et non pas en dessus.
    j'aimerais ajouter un message d'erreur via msgbox pour indiquer que l'action "d'insérer la ligne" n'est pas possible en dehors du champ, mais je ne comprends pas où mettre cette commande
    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 Inserer()
     
        If Not Intersect(ActiveCell, Range("A1:D20")) Is Nothing Then
     
            ActiveCell.Offset(1, 0).EntireRow.Insert xlShiftDown
     
        Else
     
            MsgBox "Vous ne pouvez pas insérer une ligne en dehors de la plage 'A1:D20' !"
     
        End If
     
    End Sub
    Hervé.

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

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

    Informations forums :
    Inscription : Avril 2014
    Messages : 31
    Par défaut
    Bonjour Hervé et merci pour ta réponse. La solution que tu proposes ne semble pas convenir à ma demande qui n'est peut-être pas suffisamment explicite. J'ai par ailleurs tester ton code qui me renvoie une erreur. Au delà de l'écriture du code sur laquelle je peux rien dire vu mon niveau, je n'en comprends pas très bien le sens.

    Tu sembles utiliser intersect pour trouver l'intersection entre une celulle active et une plage donnée. Dans mon code (notamment sur le deuxième qui permet de supprimer une ligne), je cherche plutôt à combiner deux conditions pour éviter de supprimer n'importe quoi:

    1/ l'utilisateur ne peut supprimer une ligne que dans la plage de donnée définie : Range("A1 : D20") si nous reprenons ton exmple
    2/ l'utilisateur ne peut supprimer une ligne que si la première cellule de cette ligne est vide ("")... j'ai donc ajouté des caractères dans cette première cellule ce qui évite que celle-ci soit supprimées

    C'était peut être ton intention de me proposer une combinaison de condition en utilisant "intersect" ou pas...

    Pour en revenir à mon problème d'insertion en dessous, mon code est quelque peu tordu et je pense qu'il n'est pas correct, j'aimerais ton avis...

    Donc j'ai déterminé que la macro ne s'éxécute que dans une plage définie et cela fonctionne plutôt bien :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Dim DernièreLigne As Long
    Dim x As Long
    Dim y As Long
     
     
        x = ActiveCell.Row
        DernièreLigne = ActiveSheet.Range("AY7").End(xlDown).Row
     
     
    If Not ((x > 9) And (x < DernièreLigne)) Then
    Exit Sub
    End If
    Ensuite, viens l'insertion proprement dite, mon objectif était s'insérer en dessous de la ligne ou cellule sélectionnée par l'utilisateur, une nouvelle ligne vierge au format numérique" et qui ne soit pas "vérouillée"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    With Range("A" & x & ":AY" & x)
        .Insert Shift:=xlDown
        .Offset(-1).FillDown
        .Offset(-1).Clear
        .Offset(-1).Locked = False
        .Offset(-1).NumberFormat = "#,##0.00"
    Voilà j'espère que tu pourras m'aider, le résultat que j'obtiens est satisfaisant à l'éxception que ma ligne s'insére au dessus...

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

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

    Informations forums :
    Inscription : Avril 2014
    Messages : 31
    Par défaut
    J'ai finalement trouvé une solution, voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    'Insère une nouvelle ligne en-dessous de celle qui est sélectionnée (format numérique, cellule dévérouillée)'
     
        ActiveCell(2).EntireRow.Insert
        ActiveCell(1).EntireRow.Copy ActiveCell(2).EntireRow
        ActiveCell(2).EntireRow.Clear
        ActiveCell(2).EntireRow.NumberFormat = "#,##0.00"
        ActiveCell(2).EntireRow.Locked = False

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

Discussions similaires

  1. [VBA-E]Selection d'une ligne a partir d'une certaine colonne
    Par deathsurfer dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 29/06/2006, 16h36
  2. [VBA Excel] Ajouter, supprimer une ligne ou collone range
    Par loacast dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 22/11/2005, 15h53
  3. VBA EXCEL - Sélection d'une ligne suivant saisie
    Par brethomeau dans le forum Macros et VBA Excel
    Réponses: 48
    Dernier message: 15/11/2005, 17h41
  4. trait en dessous de chaque ligne d'un tableau
    Par auduma dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 14/04/2005, 13h51
  5. [Excel - VBA] Problème de suppression de lignes...
    Par beholder2 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 28/01/2005, 17h27

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