Comment insérer une ligne vide à chaque changement de valeur

geraldine69

XLDnaute Nouveau
Bonoir,

Je suis à la recherche d'une petite macro me permettant d'insérer une ligne vide à chaque changement de valeur sur une colonne donnée.

Exemple si j'ai une série de ce type

A 0 1 2 3 4 5 6 7 8 9
A 1 2 3 4 5 6 7 8 9 0
A 2 3 4 5 6 7 8 9 0 1
B 0 1 2 3 4 5 6 7 8 9
B 1 2 3 4 5 6 7 8 9 0
B 2 3 4 5 6 7 8 9 0 1
C 0 1 2 3 4 5 6 7 8 9
C 1 2 3 4 5 6 7 8 9 0
C 2 3 4 5 6 7 8 9 0 1

J'aimerais obtenir ceci :

A 0 1 2 3 4 5 6 7 8 9
A 1 2 3 4 5 6 7 8 9 0
A 2 3 4 5 6 7 8 9 0 1

B 0 1 2 3 4 5 6 7 8 9
B 1 2 3 4 5 6 7 8 9 0
B 2 3 4 5 6 7 8 9 0 1

C 0 1 2 3 4 5 6 7 8 9
C 1 2 3 4 5 6 7 8 9 0
C 2 3 4 5 6 7 8 9 0 1


Merci


Géraldine
 

Fred0o

XLDnaute Barbatruc
Re : Comment insérer une ligne vide à chaque changement de valeur

Bonsoir Géraldine,

Tu mets ce code dans un module, tu places le curseur sur la 1° ligne, tu lances la macro et voilà !
VB:
Sub Essai()
    Dim CTmp As String
    While ActiveCell.Offset(1, 0).Value <> ""
        CTmp = Left(ActiveCell, 1)
        ActiveCell.Offset(1, 0).Select
        If Left(ActiveCell.Value, 1) <> CTmp Then
            ActiveCell.EntireRow.Insert
            ActiveCell.Offset(1, 0).Select
        End If
    Wend
End Sub

A+
 

haonv

XLDnaute Occasionnel
Re : Comment insérer une ligne vide à chaque changement de valeur

Bonjour geraldine ,fredOo,

Une autre macro.
Sub insérer()
Dim Ligne As Long

For Ligne = Range("A1").End(xlDown).Row To 2 Step -1
If Range("A" & Ligne) <> Range("A" & Ligne - 1) Then
Range("A" & Ligne).EntireRow.Insert
End If
Next
End Sub

Originaire de la même région que vous (proche de Roanne et geraldine doit bien etre du Rhone ,non ?), j'en profite pour vous saluer.

Amicalement
 

geraldine69

XLDnaute Nouveau
Re : Comment insérer une ligne vide à chaque changement de valeur

Bonsoir à vous deux.

Merci beaucoup pour vos solutions.
Sur un fichier de 150000 lignes c'est un peu long mais ça fonctionne parfaitement bien et c'est le principal.

Oui haonv je suis du Rhône à coté de Lyon


Géraldine
 

Fred0o

XLDnaute Barbatruc
Re : Comment insérer une ligne vide à chaque changement de valeur

Bonjour à tous,

Avec ce code, un mix du mien et de celui de haonv, cela devrait être plus rapide.
VB:
Sub Essai()
    Application.ScreenUpdating = False
    Dim Ligne As Long
    For Ligne = Range("A65536").End(xlUp).Row To 2 Step -1
        If Left(Range("A" & Ligne), 1) <> Left(Range("A" & Ligne - 1), 1) Then
            Range("A" & Ligne).EntireRow.Insert
        End If
    Next
    Application.ScreenUpdating = False
End Sub

A+
 

geraldine69

XLDnaute Nouveau
Re : Comment insérer une ligne vide à chaque changement de valeur

Bonjour FredOo

Je n'avais pas testé en situation réelle ton code mais il y a un problème.
Ta macro ne tient compte que du premier caractère de la cellule en A
Si je fais

A
A
B
B
C
C

ça fonctionne bien

Mais si je fais

A1
A2
A3
B1
B2
B3

Il me groupe les A les B et les C alors que la valeur à changé

l'exemple que je donnais ci dessus avec ton code j'obtiens ceci
si tout est mis en colonne A


A 0 1 2 3 4 5 6 7 8 9
A 1 2 3 4 5 6 7 8 9 0
A 2 3 4 5 6 7 8 9 0 1

B 0 1 2 3 4 5 6 7 8 9
B 1 2 3 4 5 6 7 8 9 0
B 2 3 4 5 6 7 8 9 0 1

C 0 1 2 3 4 5 6 7 8 9
C 1 2 3 4 5 6 7 8 9 0
C 2 3 4 5 6 7 8 9 0 1

Alors qu'il faudrait que j'obtienne ceci

A 0 1 2 3 4 5 6 7 8 9

A 1 2 3 4 5 6 7 8 9 0

A 2 3 4 5 6 7 8 9 0 1

B 0 1 2 3 4 5 6 7 8 9

B 1 2 3 4 5 6 7 8 9 0

B 2 3 4 5 6 7 8 9 0 1

C 0 1 2 3 4 5 6 7 8 9

C 1 2 3 4 5 6 7 8 9 0

C 2 3 4 5 6 7 8 9 0 1

Ce que j'obtiens bien avec le code de haonv

Géraldine
 

Fred0o

XLDnaute Barbatruc
Re : Comment insérer une ligne vide à chaque changement de valeur

Re-bonjour Géraldine,

En fait, je n'ai fait que répondre exactement à ta demande initiale.
Exemple si j'ai une série de ce type

A 0 1 2 3 4 5 6 7 8 9
A 1 2 3 4 5 6 7 8 9 0
A 2 3 4 5 6 7 8 9 0 1
B 0 1 2 3 4 5 6 7 8 9
B 1 2 3 4 5 6 7 8 9 0
B 2 3 4 5 6 7 8 9 0 1
C 0 1 2 3 4 5 6 7 8 9
C 1 2 3 4 5 6 7 8 9 0
C 2 3 4 5 6 7 8 9 0 1

J'aimerais obtenir ceci :

A 0 1 2 3 4 5 6 7 8 9
A 1 2 3 4 5 6 7 8 9 0
A 2 3 4 5 6 7 8 9 0 1

B 0 1 2 3 4 5 6 7 8 9
B 1 2 3 4 5 6 7 8 9 0
B 2 3 4 5 6 7 8 9 0 1

C 0 1 2 3 4 5 6 7 8 9
C 1 2 3 4 5 6 7 8 9 0
C 2 3 4 5 6 7 8 9 0 1


Merci


Géraldine


Maintenant, si ta demande a changé, je n'y suis pour rien. Cependant, avec ce code, cela devrait aller :
VB:
Sub Essai()
    Application.ScreenUpdating = False
    Dim Ligne As Long
    For Ligne = Range("A65536").End(xlUp).Row To 2 Step -1
        If Range("A" & Ligne) <> Range("A" & Ligne - 1) Then
            Range("A" & Ligne).EntireRow.Insert
        End If
    Next
    Application.ScreenUpdating = False
End Sub

A+
 

geraldine69

XLDnaute Nouveau
Re : Comment insérer une ligne vide à chaque changement de valeur

Merci FredO0,

Je suis vraiment désolée pour ce malentendu, c'est moi qui me suis emmêlée un peu les pinceaux dans
ce que je voulais faire.
Quoiqu'il en soit et après vérification en situation réelle, les deux codes vont m'être très utile puisque
je n'avais pas envisagé le deuxième cas de figure au départ.
Mon exemple était sur la base d'un caractère par cellule ce qui fait que ton code fonctionnait bien.
Lorsque j'ai fait les essais je l'ai fait avec un copié collé, chaque ligne se retrouvait dans une seule cellule.
C'est comme ça que j'ai pensé que ça ne fonctionnait pas.

Encore désolée et grand merci à toi

Géraldine
 

marat70

XLDnaute Nouveau
Re : Comment insérer une ligne vide à chaque changement de valeur

Bonjour à tous , j'aurai besoin de votre aide concernant cette macro

Sub insérer()
Dim Ligne As Long


For Ligne = Range("W1").End(xlDown).Row To 2 Step -1
If Range("W" & Ligne) <> Range("W" & Ligne - 1) Then
Range("W" & Ligne).EntireRow.Insert
End if
Next
End Sub

J'aimerai que dans le cas ou la cellule est vide la macro continue sa recherche ...

merci d'avance
 

job75

XLDnaute Barbatruc
Re : Comment insérer une ligne vide à chaque changement de valeur

Bonjour marat70, bienvenue sur XLD, bonjour le fil,

Code:
Sub insérer()
Dim Ligne As Long
For Ligne = Range("A1", ActiveSheet.UsedRange).Rows.Count To 2 Step -1
If Range("W" & Ligne) <> "" And Range("W" & Ligne - 1) <> "" And _
  Range("W" & Ligne) <> Range("W" & Ligne - 1) Then _
    Range("W" & Ligne).EntireRow.Insert
Next
End Sub
Si l'on relance la macro il n'y a pas de nouvelles insertions de lignes.

A+
 

marat70

XLDnaute Nouveau
Re : Comment insérer une ligne vide à chaque changement de valeur

Merci pour l'accueil

en faite je souhaiterai que mon fichier original

1255555 750001 12/12/15
1255555 750001 12/12/15
1255555 750001 20/12/15
2255555 750001 12/12/15
2255555 750001 12/12/15
1155555 850000 12/12/15
3333333 850000 12/12/15
3333333 850000 25/12/15
3333333 850000 12/12/15

soit

1255555 750001 12/12/15
1255555 750001 12/12/15

1255555 750001 20/12/15

2255555 750001 12/12/15
2255555 750001 12/12/15

1155555 850000 12/12/15

3333333 850000 12/12/15

3333333 850000 25/12/15

3333333 850000 12/12/15


je sais pas si je me suis bien fait comprendre...

du coup j'utilise la macro
For Ligne = Range("W1").End(xlDown).Row To 2 Step -1
If Range("W" & Ligne) <> Range("W" & Ligne - 1) Then
Range("W" & Ligne).EntireRow.Insert
End if
Next
End Sub


en changeant les Lettre des cellules ....
 
Dernière modification par un modérateur:

job75

XLDnaute Barbatruc
Re : Comment insérer une ligne vide à chaque changement de valeur

Re,

Comme le signale geraldine69 au post #4, sur 150000 lignes c'est un peu long...

En utilisant des tableaux VBA c'est beaucoup plus rapide :

Code:
Sub insérer()
Dim t, ncol%, rest(), j%, i&, n&, x$, y$
With ActiveSheet
  t = .Range("A1:A2", .UsedRange).Formula
  ncol = UBound(t, 2)
  If ncol < 23 Then Exit Sub
  ReDim rest(1 To 2 * UBound(t), 1 To ncol)
  For j = 1 To ncol: rest(1, j) = t(1, j): Next
  n = 1
  For i = 2 To UBound(t)
    n = n + 1
    x = t(i - 1, 23): y = t(i, 23)
    If Left(x, 1) = "=" Then x = Evaluate(x)
    If Left(y, 1) = "=" Then y = Evaluate(y)
    If x <> "" And y <> "" And x <> y Then n = n + 1
    For j = 1 To ncol
      rest(n, j) = t(i, j)
  Next j, i
  .[A1].Resize(n, ncol) = rest
End With
End Sub
A+
 
Dernière édition:

job75

XLDnaute Barbatruc
Re : Comment insérer une ligne vide à chaque changement de valeur

Re,

Voyez ce que donne cette macro sur votre fichier :

Code:
Sub InsererLignes()
Dim t, ncol%, rest(), j%, i&, n&, x$, y$
With ActiveSheet
  t = .Range("A1:A2", .UsedRange).FormulaR1C1
  ncol = UBound(t, 2)
  If ncol < 23 Then Exit Sub 'sécurité
  ReDim rest(1 To 2 * UBound(t), 1 To ncol)
  For j = 1 To ncol: rest(1, j) = t(1, j): Next
  n = 1
  For i = 2 To UBound(t)
    n = n + 1
    x = Trim(t(i - 1, 3) & " " & t(i - 1, 5) & " " & t(i - 1, 23))
    y = Trim(t(i, 3) & " " & t(i, 5) & " " & t(i, 23))
    If x <> "" And y <> "" And x <> y Then n = n + 1
    For j = 1 To ncol
      rest(n, j) = t(i, j)
  Next j, i
  .Columns(23).NumberFormat = "dd/mm/yy"
  .[A1].Resize(n, ncol) = rest
End With
End Sub
Elle est très rapide même sur un très grand tableau.

Bien sûr il ne faut pas de couleurs dans le tableau car elles sont ignorées.

Edit : j'ai remplacé au début .Formula par .FormulaR1C1 (en cas de formules dans les autres colonnes).

A+
 
Dernière édition:

Statistiques des forums

Discussions
312 778
Messages
2 092 039
Membres
105 162
dernier inscrit
djikon