Tri automatique et insertion de ligne [Résolu]

Messages postés
112
Date d'inscription
mardi 9 septembre 2008
Dernière intervention
5 mars 2018
- - Dernière réponse : Lameche15
Messages postés
112
Date d'inscription
mardi 9 septembre 2008
Dernière intervention
5 mars 2018
- 29 mai 2013 à 14:08
Bonjour à tous,

J'aurai besoin d'un sérieux coup de main.

J'ai une colonne (B) de mon tableau, qui contient 5 valeurs (texte) possible. Ma macro réalise un tri croissant sur cette colonne.
Jusque là ça fonctionne.
Sauf que je souhaiterais insérer une ligne à chaque changement de valeur et là ça coince j'ai essayé toute les boucles possible y à un truc que je pige pas.

Voici mon code tout pourrit qui ne prend pas en compte les dernières ligne

Agence = Range("B3").Value
i = 4

Do
agencecourante = Range("B" & i).Value
If agencecourante = Agence And agencecourante <> "" Then
j = i
Else: Rows("" & i).Select
Selection.Insert shift:=xlDown
j = i + 1
Agence = Range("B" & j).Value


End If

finOA = Range("B" & j).End(xlDown).Row
i = i + 1
Loop While i <> finOA




Merci d'avance pour votre aide
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Dernière intervention
23 août 2018
3
Merci
Bonjour,

ceci
>>> finOA = Sheets("Bilan OA").Range("A2").End(xlDown).Row
va fonctionner seulement s'il n'y a pas de cellules vides en colonne A
Utilise plutôt
>>> finOA = Sheets("Bilan OA").Cells(Rows.count, "A").End(xlUp).Row

Évite les Select.
Ce n'est pas nécessaire et ça ralentit le processus pour rien même si ce n'est pas beaucoup...

Range("A3:J" & finOA).Select
Selection.Sort Key1:=Range("B2"),....
se traduit par
Range("A3:J" & finOA).Sort Key1:=Range("B2"),....

Pour la boucle je préfère le For...Next, mais c'est une question de choix
For I = FinOA to 3 step -1  'ici tu peux mettre 3 plutôt que 2 puisque la 2e ligne sera différente de l'entête
   If Range("B" & I) <> Range("B" & I - 1) Then
      Rows(I).Insert
   End if
Next

Quand tu postes du code, utilise le 3e icône en partant de la droite.
Sélectionne ton code et clique VB
Et indente ton code pour faciliter la lecture

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI

Merci cs_MPi 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de cs_MPi
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Dernière intervention
23 août 2018
0
Merci
Bonjour,

Pas nécessaire d'ouvrir 2 post pour le même problème...

Quand tu insères ou effaces des lignes, boucle à partir de la fin en remontant.

Donc, vérifie si la valeur en ligne courante est différente de la précédente.
Si oui, tu insères ta ligne.

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Commenter la réponse de cs_MPi
Messages postés
112
Date d'inscription
mardi 9 septembre 2008
Dernière intervention
5 mars 2018
0
Merci
Désolé je pensais que ça n'avait pas fonctionné la première fois.

C'est une bonne idée, je vais essayer de traduire ça avec du texte.

Merci de m'aider
Commenter la réponse de Lameche15
Messages postés
112
Date d'inscription
mardi 9 septembre 2008
Dernière intervention
5 mars 2018
0
Merci
Bonjour,

Désolé de vous ennuyer avec mon problème mais malheureusement je n'arrive pas à obtenir à 100% le résultat souhaité.

Voici mon code:

Sheets("Bilan OA").Activate
finOA = Sheets("Bilan OA").Range("A2").End(xlDown).Row

Range("A3:J" & finOA).Select
Application.CutCopyMode = False
Selection.Sort Key1:=Range("B2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal

'Range("B3:B" & finOA).Select

Agence = Range("B" & finOA).Value
agencecourante = Range("B" & finOA).Value

Do
agencecourante = Range("B" & finOA).Value
If agencecourante = Agence Then 'And agencecourante <> ""
j = finOA
Else: Rows("" & finOA + 1).Select
Selection.Insert shift:=xlDown
j = finOA - 1
Agence = Range("B" & j).Value


End If
finOA = finOA - 1

Loop Until finOA = 2

J'ai le sentiment que j'ai un souci au niveau de ma boucle qui me fait perdre une ligne car aux tests, si je n'ai qu'une seule ligne par catégorie alors la ligne n'est pas insérée ou une fois sur deux
Commenter la réponse de Lameche15
Messages postés
112
Date d'inscription
mardi 9 septembre 2008
Dernière intervention
5 mars 2018
0
Merci
Super merci beaucoup pour ce petit cours.
Tu dois avoir compris que j'apprends beaucoup avec l'enregistreur de macro et que forcément tout n'est pas à recopier.

En tout cas je suis bien débloqué!
Commenter la réponse de Lameche15

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.