Monsieur Excel
Pour tout savoir faire sur Excel !

14 novembre 2006

Macro pour insertion de lignes

Un lecteur m’a posé le problème suivant. On a un certain nombre de valeurs en colonne A et l’on veut, chaque fois qu’une valeur est différente de la valeur suivante, insérer une ligne entre les deux valeurs.

Grosso modo, partant de l’état à gauche ci-dessus, on souhaite – après traitement par la macro – parvenir au résultat à droite ci-dessus.

Si vous êtes à l’aise dans les macros en VBA (Visual Basic for Applications), cela ne vous posera aucun problème. Voici ma solution :

Remarque – Telle qu’elle est écrite, cette macro suppose évidemment que le problème se pose dans la colonne A et que l’on démarre en A1. Si ce n’était pas le cas, il suffirait de remplacer Range("A1").Select par Range("Toto").Select où « Toto » serait le nom faisant référence à la cellule à partir de laquelle on souhaite démarrer le traitement.

11 Commentaire(s):

  • Une bien meilleure programmation (éviter les Goto et Exit Sub) consiste à écrire plutôt le code suivant :-)!

    Public Sub test()
    Dim i As Long
    Dim truc As Range
    Set truc = Range("A1")
    i = 1
    With truc
    While .Cells(i) <> Empty
    If .Cells(i) = .Cells(i + 1) Then
    i = i + 1
    Else
    .Cells(i + 1).Insert Shift:=xlDown
    i = i + 2
    End If
    Wend
    End With
    End Sub

    By Anonymous Anonyme, sur 8:36 AM  

  • Merci pour cette suggestion !

    Vu mon âge avancé, je suis de la vieille école en matière de programmation, ce qui me fait écrire le programme en 9 lignes au lieu de 12, certes en utilisant les GOTOs et les EXIT SUB honnis par certains ...

    Ce qui me permet aussi de développer mes applications plus rapidement que beaucoup...

    Des goûts et des couleurs...

    By Blogger Hervé Thiriez, sur 10:47 PM  

  • Il est vrai que le deuxième programme est plus long à écrire (quoiqu'il faudrait compter le nombre de caractères à taper et non le nombre de lignes...). En revanche l'efficacité d'un programme ne se mesure pas forcément par son nombre d'instructions, mais plutôt par sa lisibilité (compréhension par d'autres programmeurs), sa facilité à être déboggué et aussi bien sûr par sa rapidité d'exécution (à tester dsns ce cas précis!)

    By Anonymous Anonyme, sur 7:19 PM  

  • Tout à fait d'accord. Il y a plusieurs critères à considérer.

    En ce qui concerne la lisibilité, je pense en tout cas qu'un seul niveau d'indentation est plus "lisible" que trois. Mais comme je le disais plus haut, "Des goûts et des couleurs..."

    By Blogger Hervé Thiriez, sur 9:10 AM  

  • Au delà des gouts et des couleurs, le plus important est la finalité.
    Dans ce cas précis, il s'agit d'une petite macro qui n'a pas vocation à évoluer.
    Un petit goto bien placé n'a jamais tué personne, n'en déplaise aux extrémistes de la norme et du "bien coder tout propre".
    Simple, efficace et facile à comprendre : le but est atteint.
    Le goto est à la programmation ce que l'exception est à la règle : à partir d'un certain dégré de maitrise, l'exeption devient la règle.

    By Anonymous Anonyme, sur 1:39 PM  

  • Bonjour Monsieur Excel.
    Sur le sujet du 14 novembre 2006, j'ai testé pour le plaisir de comparer, les deux macros.

    Seule la votre fonctionne et insère des lignes.

    La macro suggérée par Anonyme insère des cellules dans la colonne A.
    Si des données se retrouve dans les autres colonnes, elles se trouvent donc déphasées.

    Bravo, Monsieur Excel.

    By Anonymous Anonyme, sur 9:57 AM  

  • bonjour,
    super pratique ce code
    c'est exactement ce que je cherchais

    par contre est-il possible après l'insertion d'un nouvelle ligne de remplir certains champs de cette ligne avec des formules de calcul ?

    ceci afin que la nouvelle ligne insérée calcul automatiquement des valeurs

    merci de votre aide

    By Anonymous Anonyme, sur 10:47 AM  

  • Bien évidemment, c'est possible :)
    Je ne peux pas en donner le code car tout dépend de ce que vous voulez entrer comme formule...
    En revanche, c'est le genre de chose que je fais facilement dans mon activité de consultant :)

    By Blogger Hervé Thiriez, sur 3:39 PM  

  • Bonjour, j'aimerai réutiliser le code :

    Public Sub test()
    Dim i As Long
    Dim truc As Range
    Set truc = Range("A1")
    i = 1
    With truc
    While .Cells(i) <> Empty
    If .Cells(i) = .Cells(i + 1) Then
    i = i + 1
    Else
    .Cells(i + 1).Insert Shift:=xlDown
    i = i + 2
    End If
    Wend
    End With
    End Sub

    Mais malheureusement chez moi une erreur se produit à la ligne ".Cell(i + 1).Insert Shift:=xlDown" car il s'agit "d'une proriété nongérée par cet objet"... Savez-vous m'aider ? merci d'avance

    By Anonymous Anonyme, sur 4:42 PM  

  • Je ne rencontre pas ce problème...

    J'en rencontre un autre, en revanche. Si une cellule contient un 0, la macro s'arrête !

    By Blogger Hervé Thiriez, sur 7:42 PM  

  • Bonjour,

    Je me permets de réveiller ce vieux sujet car il m'a été très utile pour insérer des lignes dans un tableau.

    Maintenant, je souhaiterais insérer une formule dans la ligne créé qui me permet de faire la somme des valeurs. J'ai écris cette macro à partir de celle de M. Thiriez :

    Sub Essai_somme()
    Dim Lig As Long
    Range("I1").Select
    Reprise:
    ActiveCell.Offset(1, 0).Select
    If ActiveCell.Value = "" Then
    ActiveCell.Value = "=SUM(I" & ActiveCell.Offset(1, 0).Row & ":I" & Cells(Rows.Count, 1).End(xlUp).Row & ")"
    ActiveCell.Font.Bold = True
    ActiveCell.Offset(1, 0).Select
    If Len(ActiveCell) = 0 Then Exit Sub
    End If
    GoTo Reprise
    End Sub

    Mais elle fait la somme des valeurs de "ActiveCell" jusqu'à la fin du tableau et non jusqu'avant la prochaine "ActiveCell".

    Je ne connais pas grand chose en macro et je n'ai trouvé ça qu'à force de bidouillage.
    Je n'ai pas vraiment le temps d'apprendre le VBA en profondeur, donc si vous aviez une solution à me proposer, je serais preneur.

    Merci !

    By Blogger Lionel T, sur 5:19 PM  

Enregistrer un commentaire

<< Accueil