emmabl
Messages postés9Date d'inscriptionmercredi 23 juillet 2008StatutMembreDernière intervention10 septembre 2008
-
24 juil. 2008 à 10:22
youpiyoyo
Messages postés539Date d'inscriptionvendredi 6 juin 2003StatutMembreDernière intervention14 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
youpiyoyo
Messages postés539Date d'inscriptionvendredi 6 juin 2003StatutMembreDernière intervention14 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
emmabl
Messages postés9Date d'inscriptionmercredi 23 juillet 2008StatutMembreDernière intervention10 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
emmabl
Messages postés9Date d'inscriptionmercredi 23 juillet 2008StatutMembreDernière intervention10 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 ?
youpiyoyo
Messages postés539Date d'inscriptionvendredi 6 juin 2003StatutMembreDernière intervention14 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 :)
Vous n’avez pas trouvé la réponse que vous recherchez ?
youpiyoyo
Messages postés539Date d'inscriptionvendredi 6 juin 2003StatutMembreDernière intervention14 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 :)
emmabl
Messages postés9Date d'inscriptionmercredi 23 juillet 2008StatutMembreDernière intervention10 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
youpiyoyo
Messages postés539Date d'inscriptionvendredi 6 juin 2003StatutMembreDernière intervention14 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 :)