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.
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 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 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 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 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 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 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 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 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 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 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 Lionel T, sur 5:19 PM
Enregistrer un commentaire
<< Accueil