Décaler une plage de cellules vers le bas

emmabl Messages postés 9 Date d'inscription mercredi 23 juillet 2008 Statut Membre Dernière intervention 10 septembre 2008 - 24 juil. 2008 à 10:22
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010 - 28 juil. 2008 à 18:07
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

youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
24 juil. 2008 à 11:36
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 :)
0
emmabl Messages postés 9 Date d'inscription mercredi 23 juillet 2008 Statut Membre Dernière intervention 10 septembre 2008
24 juil. 2008 à 11:54
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
0
emmabl Messages postés 9 Date d'inscription mercredi 23 juillet 2008 Statut Membre Dernière intervention 10 septembre 2008
24 juil. 2008 à 17:13
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 ?





 
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
25 juil. 2008 à 09:53
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 :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
emmabl Messages postés 9 Date d'inscription mercredi 23 juillet 2008 Statut Membre Dernière intervention 10 septembre 2008
25 juil. 2008 à 10:10
Merci, mais avec cet algorithme les colonnes A à E sont devenues vides !
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
25 juil. 2008 à 11:12
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 :)
0
emmabl Messages postés 9 Date d'inscription mercredi 23 juillet 2008 Statut Membre Dernière intervention 10 septembre 2008
25 juil. 2008 à 16:31
comment est-ce que je peux envoyer un fichier joint ?
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
26 juil. 2008 à 12:25
je t'ai envoyé mon mail par message perso
@+
youpi :)
0
emmabl Messages postés 9 Date d'inscription mercredi 23 juillet 2008 Statut Membre Dernière intervention 10 septembre 2008
28 juil. 2008 à 11:32
Je t'ai envoyé le fichier ce matin

A +
Emmabl
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
28 juil. 2008 à 12:06
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 :)
0
emmabl Messages postés 9 Date d'inscription mercredi 23 juillet 2008 Statut Membre Dernière intervention 10 septembre 2008
28 juil. 2008 à 16:43
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
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
28 juil. 2008 à 18:07
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 :)
0
Rejoignez-nous