Microsoft 365 Déplacement d'une ligne à droite et en haut

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Bonjour,

Je n'arrive pas a élaborer un code qui me permettrai de déplacer une ligne (vers la droite de mon tableau et vers le début ) avec une date à vide (par la clé 2) et ainsi de suite si je trouve une autre clé 2 avec la date à vide.
En fait, je fais une boucle sur la valeur de clé 2 (colonne 5)
VB:
Num_ligne = 11
While Sheets("CALCUL").Cells(Num_ligne, 5) <> Sheets("CALCUL").Cells(Num_ligne + 1, 5)



Num_ligne = Num_ligne + 1
Wend

Pourriez-vous me préciser les fonctions VBA qui sont les plus efficaces pour ce genre de déplacement ?

Merci !

1669226507024.png
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Anne_Marie,
Vous pouviez autant mettre un fichier test qu'une image, cela aurait évité de se le retaper.
En PJ une solution parmi d'autre avec :
VB:
Sub Essai()
With Sheets("CALCUL")
    Fin = Range("A65500").End(xlUp).Row
    For L = 2 To Fin
        If .Cells(L, 5) <> .Cells(L + 1, 5) Then
            DL = 1 + .Range("H65500").End(xlUp).Row                                 ' Calcul de la ligne de stockage
            .Range("H" & DL & ":K" & DL) = .Range("C" & L + 1 & ":F" & L + 1).Value ' Copier Coller valeurs
        End If
    Next L
End With
End Sub
 

Pièces jointes

  • Classeur1.xlsm
    16.4 KB · Affichages: 2

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Bonsoir Anne_Marie,
Vous pouviez autant mettre un fichier test qu'une image, cela aurait évité de se le retaper.
En PJ une solution parmi d'autre avec :
VB:
Sub Essai()
With Sheets("CALCUL")
    Fin = Range("A65500").End(xlUp).Row
    For L = 2 To Fin
        If .Cells(L, 5) <> .Cells(L + 1, 5) Then
            DL = 1 + .Range("H65500").End(xlUp).Row                                 ' Calcul de la ligne de stockage
            .Range("H" & DL & ":K" & DL) = .Range("C" & L + 1 & ":F" & L + 1).Value ' Copier Coller valeurs
        End If
    Next L
End With
End Sub
Merci beaucoup Sylvanu !
Pourriez-vous m'expliquer ces lignes , s'il vous plaît :
Fin = Range("A65500").End(xlUp).Row : pourquoi vous avez choisi Range("A65500") ?
.Range("H65500").End(xlUp).Row : pourquoi vous avez choisi .Range("H65500") ?
.Range("H" & DL & ":K" & DL) : pourquoi il y a des &DL ?
 

TooFatBoy

XLDnaute Barbatruc
Bonjour,

Le camarade Sylvanu ne semblant pas être présent, je me permet de répondre en attendant sa réponse.

Fin = Range("A65500").End(xlUp).Row : pourquoi vous avez choisi Range("A65500") ?
.Range("H65500").End(xlUp).Row : pourquoi vous avez choisi .Range("H65500") ?
.Range("H" & DL & ":K" & DL) : pourquoi il y a des &DL ?
Autrefois (avant Excel 2007) une feuille Excel était limitée à 65 536 lignes, donc souvent programmeurs utilisaient 65000 ou 65500 pour spécifier de partir du bas de la feuille.

Depuis Excel 2007 la limite est de 1 048 576 lignes, peut-être que demain ce sera encore plus.
Donc pour être sûr de partir de la dernière ligne de la feuille, tu peux utiliser Rows.Count (nombre de lignes de la feuille).

Fin = Range("A" & Rows.Count).End(xlUp).Row
- on part de la dernière cellule de la colonne A de la feuille (Range("A" & Rows.Count)),
- on remonte dans la colonne jusqu'à rencontrer une cellule non vide (End(xlUp)),
- on récupère le numéro de la ligne par rapport à la feuille (.row),
- on l'affecte à la variable Fin (Fin=).

C'est le même principe pour la variable DL qui récupère le numéro de la ligne de la première cellule non vide rencontrée en partant du bas de la feuille et en remontant, dans la colonne H.
Cela doit correspondre à la dernière cellule non vide de la colonne H.
Tu remarqueras qu'ici on ajoute 1, pour avoir le numéro de la ligne suivante, ce qu'on appelle souvent (un peu à tord) "la première ligne vide".

Dans .Range("H" & DL), le & servant à concaténer des chaînes de caractères et Excel remplaçant DL par sa valeur, si DL vaut 32 c'est comme si on avait écrit .Range("H32").
 
Dernière édition:

VBA_dev_Anne_Marie

XLDnaute Occasionnel
Bonjour,

Le camarade Sylvanu ne semblant pas être présent, je me permet de répondre en attendant sa réponse.


Autrefois (avant Excel 2007) une feuille Excel était limitée à 65 536 lignes, donc souvent programmeurs utilisaient 65000 ou 65500 pour spécifier de partir du bas de la feuille.

Depuis Excel 2007 la limite est de 1 048 576 lignes, peut-être que demain ce sera encore plus.
Donc pour être sûr de partir de la dernière ligne de la feuille, tu peux utiliser Rows.Count (nombre de lignes de la feuille).

Fin = Range("A" & Rows.Count).End(xlUp).Row
- on part de la dernière cellule de la colonne A de la feuille (Range("A" & Rows.Count)),
- on remonte dans la colonne jusqu'à rencontrer une cellule non vide (End(xlUp)),
- on récupère le numéro de la ligne par rapport à la feuille (.row),
- on l'affecte à la variable Fin (Fin=).

C'est le même principe pour la variable DL qui récupère le numéro de la ligne de la première cellule non vide rencontrée en partant du bas de la feuille et en remontant, dans la colonne H.
Cela doit correspondre à la dernière cellule non vide de la colonne H.
Tu remarqueras qu'ici on ajoute 1, pour avoir le numéro de la ligne suivante, ce qu'on appelle souvent (un peu à tord) "la première ligne vide".

Dans .Range("H" & DL), le & servant à concaténer des chaînes de caractères et Excel remplaçant DL par sa valeur, si DL vaut 32 c'est comme si on avait écrit .Range("H32").
Merci beaucoup TooFatBoy !
 

Discussions similaires

Statistiques des forums

Discussions
315 097
Messages
2 116 186
Membres
112 679
dernier inscrit
Yupanki