Décaler une plage de cellules vers le bas

Signaler
Messages postés
9
Date d'inscription
mercredi 23 juillet 2008
Statut
Membre
Dernière intervention
10 septembre 2008
-
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
-
Bonjour,

j'ai un tableau dans lequel il y a des n° comptes clients en colonne A et F
exemple
col A      col F
141         141
141         142
142         142
142         143

je veux avoir le même nombres de lignes en colonne A et F pour ensuite pourvoir faire des sous-totaux
donc j'ai écris une macro qui dit par exemple : si A1<F1 alors décaler plage F1 à M1 d'une ligne vers le bas puis passer à la cellule A2 etc
Malheureusement quand la condition est vraie elle décale toutes les plages suivantes vers la bas comme elle ne passait jamais à la ligne suivante

Pouvez-vous l'aider ?

12 réponses

Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
1
Salut,
test un truc de ce genre
Sub forumtest()
    i = 1
    While Range("A" + Trim(Val(i))).Value <> ""
        If (Range("A" + Trim(Val(i))).Value < Range("F" + Trim(Val(i))).Value) Then
            EndRange = Range(Range("F" + Trim(Val(i)) + ":" + "M" + Trim(Val(i))), Range("F" + Trim(Val(i)) + ":" + "M" + Trim(Val(i))).End(xlDown)).Address(ColumnAbsolute:=False)
            Range(EndRange).Copy
            ActiveSheet.Paste Destination:=Range("F" + Trim(Val(i + 1)))
            Range("F" + Trim(Val(i)) + ":" + "M" + Trim(Val(i))).ClearContents
        End If
        i = i + 1
    Wend
End Sub

youpi :)
Messages postés
9
Date d'inscription
mercredi 23 juillet 2008
Statut
Membre
Dernière intervention
10 septembre 2008

Merci Youpiyoyo ça marche

Serait-ce abuser que de demander en plus de la requête déjà faite :
en revanche,  si A1>F1 alors décaler la plage de cellules A1 à D1 d'une ligne vers le bas puis passer à la cellule A2
Messages postés
9
Date d'inscription
mercredi 23 juillet 2008
Statut
Membre
Dernière intervention
10 septembre 2008

j'ai finalement adapté l'algorithme de Youpiyoyo pour résoudre mon pb

i=2
While Range("A" & i).Value <> ""

If (Range("A" & i).Value < Range("F" & i).Value) then
   EndRange = Range(Range("F" & i & ":" & "M" & i), Range("F" & i & ":" & "M" & i).End(xlDown)).address(ColumnAbsolute:=False)
   Range(EndRange).Copy
   ActiveSheet.Paste Destination:=Range("F" & (i+1))
   Range("F" & i & ":" & i).Clearcontents

ElseIf (Range("A" & i).Value > Range("F" & i).Value) then
   EndRange = Range(Range("A" & i & ":" & "E" & i), Range("A" & i & ":" & "E" & i).End(xlDown)).Address(ColumnAbsolute:=False)
   Range(EndRange).Copy
   ActiveSheet.Paste Destination:=Range("A" & (i+1))
   Range("A" & i & ":" & i).CLearContents
End If
Wend

Bien que la macro fasse exactement ce que je veux, un bog apparaît à la fin avec l'erreur '1004' : impossible de coller les infos car les zones Copier et de collage sont de forme et de taille différentes.
Comment y remédier ?





 
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
1
Salut,

J'aimerai revenir sur mon bout de code, le problème dans excel quand tu codes sur vba c'est les cellules vides., et c'est particulièrement le cas pour .End
tu as tellement de façon de faire ce que tu veux faire, qu'il faut que tu choisisses la meilleure selon toi en fonction de ta feuille excel.
Moi j'aime bien calculer en premier les address de la region du tableau.
Par exemple: ActiveCell.CurrentRegion.Address(False, False, xlA1) sachant que ton activecell tu peux le definir. Avec ca tu connais la taille de ton tableau.
Bon voila c'etait une remarque en passant, maitenant ton code.

le probleme avec ce que tu veux faire c'est que justement tu risques d'avoir des cellules vides dans ta colonne A, et donc cela peux merdouiller.
J'ai quand même un peu de mal a visualiser ton tableau, enfin bref. voila un bout de code qui je penses permettra d'avancer, adapte le a ton besoin et peut etre pense au currentregion

Sub forumsample()
    Dim SplitRange() As String, fin As String
    i = 1
    While Range("A" + Trim(Val(i))).Value <> ""
        If (Range("A" + Trim(Val(i))).Value < Range("F" + Trim(Val(i))).Value) Then
            EndRange = Range(Range("F" + Trim(Val(i)) + ":" + "M" + Trim(Val(i))), Range("F" + Trim(Val(i)) + ":" + "M" + Trim(Val(i))).End(xlDown)).Address(ColumnAbsolute:=False)
            Range(EndRange).Copy
            ActiveSheet.Paste Destination:=Range("F" + Trim(Val(i + 1)))
            Range("F" + Trim(Val(i)) + ":" + "M" + Trim(Val(i))).ClearContents
        ElseIf (Range("A" + Trim(Val(i))).Value > Range("F" + Trim(Val(i))).Value) Then
            SplitRange = Split(Range("A65536").End(xlUp).Address(ColumnAbsolute:=False), "$")
            fin = SplitRange(UBound(SplitRange))
            Range("A" + Trim(Val(i)) + ":E" + fin).Copy
            ActiveSheet.Paste Destination:=Range("A" + Trim(Val(i + 1)))
            Range("A" + Trim(Val(i)) + ":E" + fin).ClearContents
        End If
        i = i + 1
    Wend
End Sub

@+
youpi :)
Messages postés
9
Date d'inscription
mercredi 23 juillet 2008
Statut
Membre
Dernière intervention
10 septembre 2008

Merci, mais avec cet algorithme les colonnes A à E sont devenues vides !
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
1
c'est difficile de travailler sans connaitre le fichier en même temps. s'il y a rien de confidentiel envoi le moi par mail.
@+

youpi :)
Messages postés
9
Date d'inscription
mercredi 23 juillet 2008
Statut
Membre
Dernière intervention
10 septembre 2008

comment est-ce que je peux envoyer un fichier joint ?
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
1
je t'ai envoyé mon mail par message perso
@+
youpi :)
Messages postés
9
Date d'inscription
mercredi 23 juillet 2008
Statut
Membre
Dernière intervention
10 septembre 2008

Je t'ai envoyé le fichier ce matin

A +
Emmabl
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
1
Salut,

j'ai regardé ton fichier, voici ma proposition:

   i = 2

   SplitRange = Split(Range("A1").End(xlDown).Address(ColumnAbsolute:=False), "$")
   finrange = SplitRange(UBound(SplitRange))
   finrange = Val(finrange)
   While i <> finrange
        If (Range("A" & i).Value < Range("F" & i).Value) Then
           EndRange = Range(Range("F" & i & ":" & "M" & i), Range("F" & i & ":" & "M" & i).End(xlDown)).Address(ColumnAbsolute:=False)
            Range(EndRange).Copy
            ActiveSheet.Paste Destination:=Range("F" & (i + 1))
            Range("F" & i & ":" & "M" & i).ClearContents
        ElseIf (Range("A" & i).Value > Range("F" & i).Value) Then
            SplitRange = Split(Range("A65536").End(xlUp).Address(ColumnAbsolute:=False), "$")
            fin = SplitRange(UBound(SplitRange))
            Range("A" + Trim(Val(i)) + ":E" + fin).Select
            Range("A" + Trim(Val(i)) + ":E" + fin).Copy
            ActiveSheet.Paste Destination:=Range("A" + Trim(Val(i + 1)))
            Range("A" + Trim(Val(i)) + ":E" + Trim(Val(i))).ClearContents
        End If
        i = i + 1
      
   Wend
Je calcule d'abord le nombre de lignes à traiter au total.
Ce code fonctionne, le problème qu'il y avait dans l'ancien code c'est que la boucle ne s'arrêtait pas, parce que la cellule était jamais a "" car la condition if descendait toujours ta ligne car vide est bien inférieur a range F. c'est un peu ce que je t'avais évoqué dans le 5ème post de ce forum:"le probleme avec ce que tu veux faire c'est que justement tu risques
d'avoir des cellules vides dans ta colonne A, et donc cela peux
merdouiller."
donc voila
@+
youpi :)
Messages postés
9
Date d'inscription
mercredi 23 juillet 2008
Statut
Membre
Dernière intervention
10 septembre 2008

Super cela marche parfaitement.
Maleureusement, je ne maitrise pas vba et je n'arrive pas à adapter ta macro à de nouvelles colonnes avec le même type d'infos à classer et à comparer avec les cellules A:A

Mais je ne désespère pas, je continue à chercher
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
1
bah écoute si tu as un problème recréé un autre post sur le forum, et il y aura toujours quelqu'un pour te répondre. essaye d'apprendre à partir de ce code, sachant que vba est perfectible, surtout a ne pas oublier, il ne compile pas vraiment le code, en plus il est plus flexible ce qui est bien et nul car quand tu as un évenement qui n'est pas penser ca plante... ce qui est déjà beaucoup mieu géré en vb.net.
@+
youpi :)