Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

macro pour grouper des lignes

21 réponses
Avatar
jiffey
Bonjour à tous,




J'ai un pb que n'arrive vraiment pas à résoudre le pb :

J'ai une macro qui me donne un tableau de type http://cjoint.com/?hfs4Z8JSww



Je souhaiterais grouper les lignes limitées par les agences comme me le
donne (en partie) la macro du fichier enregistrée Ctrl + l :

---------------------------------------------------------
Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group

Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group


Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group

Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group



ActiveSheet.Outline.ShowLevels RowLevels:=1

----------------------------------------------------


Problème : je ne sais pas comment répéter l'opération jusqu'au bout (dans
cet exemple, jusq'au groupement des lignes 6 à 8).

Quelqu'un aurait-il la solution s'il vous plaît ?

Merci beaucoup d'avance !!!

Salutations,



Jiffey

10 réponses

1 2 3
Avatar
FFO
Salut jiffey

Je te propose ce code en partant du principe que l'identification des
agences sont en colonne B et commence à partir de la ligne 5 :

Range("B65535").End(xlUp).Select
Do While ActiveCell.Row > Range("B5").Row
Range(ActiveCell.Offset(-1, 0), ActiveCell.End(xlUp).Offset(1,
0)).EntireRow.Select
Selection.Rows.Group
ActiveCell.Offset(0, 1).End(xlUp).Select
Loop

Celà devrait convenir

Dis moi !!!



Bonjour à tous,




J'ai un pb que n'arrive vraiment pas à résoudre le pb :

J'ai une macro qui me donne un tableau de type http://cjoint.com/?hfs4Z8JSww



Je souhaiterais grouper les lignes limitées par les agences comme me le
donne (en partie) la macro du fichier enregistrée Ctrl + l :

---------------------------------------------------------
Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group

Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group


Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group

Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group



ActiveSheet.Outline.ShowLevels RowLevels:=1

----------------------------------------------------


Problème : je ne sais pas comment répéter l'opération jusqu'au bout (dans
cet exemple, jusq'au groupement des lignes 6 à 8).

Quelqu'un aurait-il la solution s'il vous plaît ?

Merci beaucoup d'avance !!!

Salutations,



Jiffey


Avatar
jiffey
C'est mortel !! Merci beaucoup FFO !!!! Par contre, j'essaie de grouper en
plus les AC (colonne C) et là ca se corse .....

J'essaie de trouver, mais j'ai peur de devoir redemander de l'aide...

Merci encore !!!!

Jiffey




Salut jiffey

Je te propose ce code en partant du principe que l'identification des
agences sont en colonne B et commence à partir de la ligne 5 :

Range("B65535").End(xlUp).Select
Do While ActiveCell.Row > Range("B5").Row
Range(ActiveCell.Offset(-1, 0), ActiveCell.End(xlUp).Offset(1,
0)).EntireRow.Select
Selection.Rows.Group
ActiveCell.Offset(0, 1).End(xlUp).Select
Loop

Celà devrait convenir

Dis moi !!!



Bonjour à tous,




J'ai un pb que n'arrive vraiment pas à résoudre le pb :

J'ai une macro qui me donne un tableau de type http://cjoint.com/?hfs4Z8JSww



Je souhaiterais grouper les lignes limitées par les agences comme me le
donne (en partie) la macro du fichier enregistrée Ctrl + l :

---------------------------------------------------------
Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group

Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group


Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group

Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group



ActiveSheet.Outline.ShowLevels RowLevels:=1

----------------------------------------------------


Problème : je ne sais pas comment répéter l'opération jusqu'au bout (dans
cet exemple, jusq'au groupement des lignes 6 à 8).

Quelqu'un aurait-il la solution s'il vous plaît ?

Merci beaucoup d'avance !!!

Salutations,



Jiffey




Avatar
FFO
Rebonjour à toi

Effectivement un peu plus hard !!!!
Mais ma tenacité aidant :

Range("B65535").End(xlUp).Select
Do While ActiveCell.Row > Range("C5").Row
Range(ActiveCell.Offset(-1, 1), ActiveCell.Offset(0, 1).End(xlUp).Offset(1,
0)).EntireRow.Select
Selection.Rows.Group
If ActiveCell.Offset(-2, 1) = "" Then
ActiveCell.Offset(0, 2).End(xlUp).Offset(0, -1).Select
Else
ActiveCell.Offset(0, 1).End(xlUp).Select
End If
Loop

Attention comme pour mon premier code le point de repère de départ est
"Total général en bas de colonne B
Ce repère doit obligatoirement être présent pour un bon fonctionnement

Je pense que tu devrais être satisfait

Dis moi !!!



C'est mortel !! Merci beaucoup FFO !!!! Par contre, j'essaie de grouper en
plus les AC (colonne C) et là ca se corse .....

J'essaie de trouver, mais j'ai peur de devoir redemander de l'aide...

Merci encore !!!!

Jiffey




Salut jiffey

Je te propose ce code en partant du principe que l'identification des
agences sont en colonne B et commence à partir de la ligne 5 :

Range("B65535").End(xlUp).Select
Do While ActiveCell.Row > Range("B5").Row
Range(ActiveCell.Offset(-1, 0), ActiveCell.End(xlUp).Offset(1,
0)).EntireRow.Select
Selection.Rows.Group
ActiveCell.Offset(0, 1).End(xlUp).Select
Loop

Celà devrait convenir

Dis moi !!!



Bonjour à tous,




J'ai un pb que n'arrive vraiment pas à résoudre le pb :

J'ai une macro qui me donne un tableau de type http://cjoint.com/?hfs4Z8JSww



Je souhaiterais grouper les lignes limitées par les agences comme me le
donne (en partie) la macro du fichier enregistrée Ctrl + l :

---------------------------------------------------------
Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group

Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group


Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group

Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group



ActiveSheet.Outline.ShowLevels RowLevels:=1

----------------------------------------------------


Problème : je ne sais pas comment répéter l'opération jusqu'au bout (dans
cet exemple, jusq'au groupement des lignes 6 à 8).

Quelqu'un aurait-il la solution s'il vous plaît ?

Merci beaucoup d'avance !!!

Salutations,



Jiffey






Avatar
jiffey
Alors, là je dis : MERCI MERCI MERCI !!!!!!!!!!!!!!!!!!!!!

Je me penche sur la formule, question de la comprednre qd m... Mais en tous,
c'est fantastique !!!!!!!!!!!

Merci encore FFO !!

A+

Jiffey !!!


Rebonjour à toi

Effectivement un peu plus hard !!!!
Mais ma tenacité aidant :

Range("B65535").End(xlUp).Select
Do While ActiveCell.Row > Range("C5").Row
Range(ActiveCell.Offset(-1, 1), ActiveCell.Offset(0, 1).End(xlUp).Offset(1,
0)).EntireRow.Select
Selection.Rows.Group
If ActiveCell.Offset(-2, 1) = "" Then
ActiveCell.Offset(0, 2).End(xlUp).Offset(0, -1).Select
Else
ActiveCell.Offset(0, 1).End(xlUp).Select
End If
Loop

Attention comme pour mon premier code le point de repère de départ est
"Total général en bas de colonne B
Ce repère doit obligatoirement être présent pour un bon fonctionnement

Je pense que tu devrais être satisfait

Dis moi !!!



C'est mortel !! Merci beaucoup FFO !!!! Par contre, j'essaie de grouper en
plus les AC (colonne C) et là ca se corse .....

J'essaie de trouver, mais j'ai peur de devoir redemander de l'aide...

Merci encore !!!!

Jiffey




Salut jiffey

Je te propose ce code en partant du principe que l'identification des
agences sont en colonne B et commence à partir de la ligne 5 :

Range("B65535").End(xlUp).Select
Do While ActiveCell.Row > Range("B5").Row
Range(ActiveCell.Offset(-1, 0), ActiveCell.End(xlUp).Offset(1,
0)).EntireRow.Select
Selection.Rows.Group
ActiveCell.Offset(0, 1).End(xlUp).Select
Loop

Celà devrait convenir

Dis moi !!!



Bonjour à tous,




J'ai un pb que n'arrive vraiment pas à résoudre le pb :

J'ai une macro qui me donne un tableau de type http://cjoint.com/?hfs4Z8JSww



Je souhaiterais grouper les lignes limitées par les agences comme me le
donne (en partie) la macro du fichier enregistrée Ctrl + l :

---------------------------------------------------------
Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group

Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group


Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group

Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group



ActiveSheet.Outline.ShowLevels RowLevels:=1

----------------------------------------------------


Problème : je ne sais pas comment répéter l'opération jusqu'au bout (dans
cet exemple, jusq'au groupement des lignes 6 à 8).

Quelqu'un aurait-il la solution s'il vous plaît ?

Merci beaucoup d'avance !!!

Salutations,



Jiffey








Avatar
jiffey
Re, FFO,

Je me permets de te re-solliciter (en espérant ne pas abuser...) :

j'ai un autre tableau (ex : http://cjoint.com/?hgngTvnbUq ) avec lequel je
souhaiterais faire la même chose.

Pb, c'est un tableau qui est le résultat d'une macro (avec des recherchev,
etc.) et je crains qu'il ne soit rempli de "scories" (j'avais entendu ce
terme sur ce forum par JB). En tous cas, comme tu peux le vérifier, cela ne
marche pas (essai avec la colonne D)


Sais-tu comment "nettoyer le fichier" et faire en sorte que la formule
fonctionne ?

Merci d'avance.

Slts

Jiffey


Rebonjour à toi

Effectivement un peu plus hard !!!!
Mais ma tenacité aidant :

Range("B65535").End(xlUp).Select
Do While ActiveCell.Row > Range("C5").Row
Range(ActiveCell.Offset(-1, 1), ActiveCell.Offset(0, 1).End(xlUp).Offset(1,
0)).EntireRow.Select
Selection.Rows.Group
If ActiveCell.Offset(-2, 1) = "" Then
ActiveCell.Offset(0, 2).End(xlUp).Offset(0, -1).Select
Else
ActiveCell.Offset(0, 1).End(xlUp).Select
End If
Loop

Attention comme pour mon premier code le point de repère de départ est
"Total général en bas de colonne B
Ce repère doit obligatoirement être présent pour un bon fonctionnement

Je pense que tu devrais être satisfait

Dis moi !!!



C'est mortel !! Merci beaucoup FFO !!!! Par contre, j'essaie de grouper en
plus les AC (colonne C) et là ca se corse .....

J'essaie de trouver, mais j'ai peur de devoir redemander de l'aide...

Merci encore !!!!

Jiffey




Salut jiffey

Je te propose ce code en partant du principe que l'identification des
agences sont en colonne B et commence à partir de la ligne 5 :

Range("B65535").End(xlUp).Select
Do While ActiveCell.Row > Range("B5").Row
Range(ActiveCell.Offset(-1, 0), ActiveCell.End(xlUp).Offset(1,
0)).EntireRow.Select
Selection.Rows.Group
ActiveCell.Offset(0, 1).End(xlUp).Select
Loop

Celà devrait convenir

Dis moi !!!



Bonjour à tous,




J'ai un pb que n'arrive vraiment pas à résoudre le pb :

J'ai une macro qui me donne un tableau de type http://cjoint.com/?hfs4Z8JSww



Je souhaiterais grouper les lignes limitées par les agences comme me le
donne (en partie) la macro du fichier enregistrée Ctrl + l :

---------------------------------------------------------
Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group

Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group


Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group

Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group



ActiveSheet.Outline.ShowLevels RowLevels:=1

----------------------------------------------------


Problème : je ne sais pas comment répéter l'opération jusqu'au bout (dans
cet exemple, jusq'au groupement des lignes 6 à 8).

Quelqu'un aurait-il la solution s'il vous plaît ?

Merci beaucoup d'avance !!!

Salutations,



Jiffey








Avatar
FFO
Rebonjour à toi
Rassures toi tu n'abuses pas trop content de pouvoir t'aider

Pour t'expliquer un peu la démarche de mon code
Si je prends le dernier que je t'ai transmis :

1° je positionne la cellule active (la derniére du tableau "Total général")

Range("B65535").End(xlUp).Select

Range colonne B à partir de la cellule ligne 65535 et remonté j'usquà la
première cellule de cette même colonne Pleine par la commande End(xlup)

2° Instauration d'une boucle qui s'opèrera tant qu'une condition est remplie

Do While ActiveCell.Row > Range("C5").Row

Ligne de la cellule active > à la la ligne de cellule C5

3° Les instructions de la boucle :
3-A Sélection de la plage

Range(ActiveCell.Offset(-1, 1), ActiveCell.Offset(0, 1).End(xlUp).Offset(1,
0)).EntireRow.Select

De la cellule active positionnée précédemment mais décalée de 1 ligne vers
le haut et de 1 colonne vers la droite (Activecell.Offset(-1,1)) jusqu'à
cellule Active même ligne mais décalée d'une colonne vers la droite et
remontée vers la première cellule pleine et décalée d'une ligne vers le bas
même colonne (ActiveCell.Offset(0, 1).End(xlUp).Offset(1, 0)) avec les lignes
entières (EntireRow)

3-B Le regroupement des lignes

Selection.Rows.Group

3-C Nouvelle position de la cellule active

If ActiveCell.Offset(-2, 1) = "" Then
ActiveCell.Offset(0, 2).End(xlUp).Offset(0, -1).Select
Else
ActiveCell.Offset(0, 1).End(xlUp).Select
End If

Sachant que lors d'une sélection d'une plage la cellule active est toujours
la première cellule de la plage (ici une cellule de la colonne A en fonction
de la dernière plage sélectionnée)

Analyse de la colonne B (présence ou non d'une Agence qui suit la dernière
sélection)

If ActiveCell.Offset(-2, 1) = "" Then

Si la cellule active déplacée de 2 lignes vers le haut et d'une colonne vers
la droite = "" alors

ActiveCell.Offset(0, 2).End(xlUp).Offset(0, -1).Select

la cellule active est déplacée même ligne 2 colonnes sur la droite et
première cellule pleine vers le haut (Nouvel AC) et décalée d'1 colonne vers
la gauche (en colonne B point de départ de la boucle)
Sinon

ActiveCell.Offset(0, 1).End(xlUp).Select

La cellule active est décalée d'une colonne vers la droite (Nouvelle Agence
en colonne B point de départ de la boucle)

et la boucle recommence

Fort de ces explications tu dois comprendre aisémment que ce code qui
convenait à ton tableau précédent ne peut compte tenu de sa présentation
différente convenir à celui là

Je te propose pour ce nouveau en lieu et place celui-ci :

Range("B65535").End(xlUp).Offset(0, 2).Select
Do While ActiveCell.Row > Range("B5").Row
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group
ActiveCell.Offset(-2, 3).Select
Loop


Qui conviendra pour ce nouveau cas mais pas pour les cas précédents

Attention ce nouveau tableau porte des données non compréhensible par excel
(ils viennent d'une autre source)

Colonne par colonne avant d'utiliser ce nouveau code fait ceci :
Sélectionnes chacune d'elles puis Données/Convertir puis 3 fois Suivant et
terminer

Exécutes ensuite ce nouveau code

Pour ta compréhension dans la fenêtre de ton script installes différents
points d'arret en regard des lignes d'instruction (à gauche d'une ligne un
click de souris sur le bandeau gris) et éxécute le code
A chaque point il s'arrètera
Regardes dans ton document l'état d'avencement du processe et tu comprendras
mieux le cheminement puis appuis sur F5 pour poursuivre l'éxécution

Tu pourras à loisir si tu as tout bien compris adapter le code à d'autre
tableau

Pour supprimer les points d'arret il suffit de recliquer sur le bandeau gris
aux mêmes endroits

Espérant ne pas t'avoir noyer dans toutes ces explications

Et surtout de t'avoir aidé

Dis moi !!!!



Re, FFO,

Je me permets de te re-solliciter (en espérant ne pas abuser...) :

j'ai un autre tableau (ex : http://cjoint.com/?hgngTvnbUq ) avec lequel je
souhaiterais faire la même chose.

Pb, c'est un tableau qui est le résultat d'une macro (avec des recherchev,
etc.) et je crains qu'il ne soit rempli de "scories" (j'avais entendu ce
terme sur ce forum par JB). En tous cas, comme tu peux le vérifier, cela ne
marche pas (essai avec la colonne D)


Sais-tu comment "nettoyer le fichier" et faire en sorte que la formule
fonctionne ?

Merci d'avance.

Slts

Jiffey


Rebonjour à toi

Effectivement un peu plus hard !!!!
Mais ma tenacité aidant :

Range("B65535").End(xlUp).Select
Do While ActiveCell.Row > Range("C5").Row
Range(ActiveCell.Offset(-1, 1), ActiveCell.Offset(0, 1).End(xlUp).Offset(1,
0)).EntireRow.Select
Selection.Rows.Group
If ActiveCell.Offset(-2, 1) = "" Then
ActiveCell.Offset(0, 2).End(xlUp).Offset(0, -1).Select
Else
ActiveCell.Offset(0, 1).End(xlUp).Select
End If
Loop

Attention comme pour mon premier code le point de repère de départ est
"Total général en bas de colonne B
Ce repère doit obligatoirement être présent pour un bon fonctionnement

Je pense que tu devrais être satisfait

Dis moi !!!



C'est mortel !! Merci beaucoup FFO !!!! Par contre, j'essaie de grouper en
plus les AC (colonne C) et là ca se corse .....

J'essaie de trouver, mais j'ai peur de devoir redemander de l'aide...

Merci encore !!!!

Jiffey




Salut jiffey

Je te propose ce code en partant du principe que l'identification des
agences sont en colonne B et commence à partir de la ligne 5 :

Range("B65535").End(xlUp).Select
Do While ActiveCell.Row > Range("B5").Row
Range(ActiveCell.Offset(-1, 0), ActiveCell.End(xlUp).Offset(1,
0)).EntireRow.Select
Selection.Rows.Group
ActiveCell.Offset(0, 1).End(xlUp).Select
Loop

Celà devrait convenir

Dis moi !!!



Bonjour à tous,




J'ai un pb que n'arrive vraiment pas à résoudre le pb :

J'ai une macro qui me donne un tableau de type http://cjoint.com/?hfs4Z8JSww



Je souhaiterais grouper les lignes limitées par les agences comme me le
donne (en partie) la macro du fichier enregistrée Ctrl + l :

---------------------------------------------------------
Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group

Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group


Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group

Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group



ActiveSheet.Outline.ShowLevels RowLevels:=1

----------------------------------------------------


Problème : je ne sais pas comment répéter l'opération jusqu'au bout (dans
cet exemple, jusq'au groupement des lignes 6 à 8).

Quelqu'un aurait-il la solution s'il vous plaît ?

Merci beaucoup d'avance !!!

Salutations,



Jiffey










Avatar
jiffey
Oh c'est excellent FFO !!! Merci encore !!!!

La conversion a bien résolu le pb.

Sinon, tu as vu j'avais presque trouvé la formule ;-D (je m'étais juste
trompé dans la dernière ligne : "ActiveCell.Offset(0, 3).Select" au lieu de
"ActiveCell.Offset(-2, 3).Select" )

Merci en tous cas pour toutes tes explications détaillées étape par étape.
C'est génial !!


Je bosse un peu tout seul sur le groupement par DO2 (j'espère trouver cette
fois-ci...).


Une question par curiosité toutefois : comment peut-on convertir toutes les
colonnes sans les faire une par une :

j'ai ca comme macro :



Columns("B:B").Select
Selection.TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:úlse,
Tab:=True, _
Semicolon:úlse, Comma:úlse, Space:úlse, Other:úlse,
FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True


Columns("C:C").Select
Selection.TextToColumns Destination:=Range("C1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:úlse,
Tab:=True, _
Semicolon:úlse, Comma:úlse, Space:úlse, Other:úlse,
FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True

etc.

Ne peut-on pas là aussi écrire la formule pour une variable et la faire
répéter jusqu'à la colonne souhaitée ?


ex : for i= B to G
Columns("i:i").Select
Selection.TextToColumns Destination:=Range("i1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:úlse,
Tab:=True, _
Semicolon:úlse, Comma:úlse, Space:úlse, Other:úlse,
FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True


Qqch comme ça ?



Merci encore

Slts

Jiffey



Rebonjour à toi
Rassures toi tu n'abuses pas trop content de pouvoir t'aider

Pour t'expliquer un peu la démarche de mon code
Si je prends le dernier que je t'ai transmis :

1° je positionne la cellule active (la derniére du tableau "Total général")

Range("B65535").End(xlUp).Select

Range colonne B à partir de la cellule ligne 65535 et remonté j'usquà la
première cellule de cette même colonne Pleine par la commande End(xlup)

2° Instauration d'une boucle qui s'opèrera tant qu'une condition est remplie

Do While ActiveCell.Row > Range("C5").Row

Ligne de la cellule active > à la la ligne de cellule C5

3° Les instructions de la boucle :
3-A Sélection de la plage

Range(ActiveCell.Offset(-1, 1), ActiveCell.Offset(0, 1).End(xlUp).Offset(1,
0)).EntireRow.Select

De la cellule active positionnée précédemment mais décalée de 1 ligne vers
le haut et de 1 colonne vers la droite (Activecell.Offset(-1,1)) jusqu'à
cellule Active même ligne mais décalée d'une colonne vers la droite et
remontée vers la première cellule pleine et décalée d'une ligne vers le bas
même colonne (ActiveCell.Offset(0, 1).End(xlUp).Offset(1, 0)) avec les lignes
entières (EntireRow)

3-B Le regroupement des lignes

Selection.Rows.Group

3-C Nouvelle position de la cellule active

If ActiveCell.Offset(-2, 1) = "" Then
ActiveCell.Offset(0, 2).End(xlUp).Offset(0, -1).Select
Else
ActiveCell.Offset(0, 1).End(xlUp).Select
End If

Sachant que lors d'une sélection d'une plage la cellule active est toujours
la première cellule de la plage (ici une cellule de la colonne A en fonction
de la dernière plage sélectionnée)

Analyse de la colonne B (présence ou non d'une Agence qui suit la dernière
sélection)

If ActiveCell.Offset(-2, 1) = "" Then

Si la cellule active déplacée de 2 lignes vers le haut et d'une colonne vers
la droite = "" alors

ActiveCell.Offset(0, 2).End(xlUp).Offset(0, -1).Select

la cellule active est déplacée même ligne 2 colonnes sur la droite et
première cellule pleine vers le haut (Nouvel AC) et décalée d'1 colonne vers
la gauche (en colonne B point de départ de la boucle)
Sinon

ActiveCell.Offset(0, 1).End(xlUp).Select

La cellule active est décalée d'une colonne vers la droite (Nouvelle Agence
en colonne B point de départ de la boucle)

et la boucle recommence

Fort de ces explications tu dois comprendre aisémment que ce code qui
convenait à ton tableau précédent ne peut compte tenu de sa présentation
différente convenir à celui là

Je te propose pour ce nouveau en lieu et place celui-ci :

Range("B65535").End(xlUp).Offset(0, 2).Select
Do While ActiveCell.Row > Range("B5").Row
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group
ActiveCell.Offset(-2, 3).Select
Loop


Qui conviendra pour ce nouveau cas mais pas pour les cas précédents

Attention ce nouveau tableau porte des données non compréhensible par excel
(ils viennent d'une autre source)

Colonne par colonne avant d'utiliser ce nouveau code fait ceci :
Sélectionnes chacune d'elles puis Données/Convertir puis 3 fois Suivant et
terminer

Exécutes ensuite ce nouveau code

Pour ta compréhension dans la fenêtre de ton script installes différents
points d'arret en regard des lignes d'instruction (à gauche d'une ligne un
click de souris sur le bandeau gris) et éxécute le code
A chaque point il s'arrètera
Regardes dans ton document l'état d'avencement du processe et tu comprendras
mieux le cheminement puis appuis sur F5 pour poursuivre l'éxécution

Tu pourras à loisir si tu as tout bien compris adapter le code à d'autre
tableau

Pour supprimer les points d'arret il suffit de recliquer sur le bandeau gris
aux mêmes endroits

Espérant ne pas t'avoir noyer dans toutes ces explications

Et surtout de t'avoir aidé

Dis moi !!!!



Re, FFO,

Je me permets de te re-solliciter (en espérant ne pas abuser...) :

j'ai un autre tableau (ex : http://cjoint.com/?hgngTvnbUq ) avec lequel je
souhaiterais faire la même chose.

Pb, c'est un tableau qui est le résultat d'une macro (avec des recherchev,
etc.) et je crains qu'il ne soit rempli de "scories" (j'avais entendu ce
terme sur ce forum par JB). En tous cas, comme tu peux le vérifier, cela ne
marche pas (essai avec la colonne D)


Sais-tu comment "nettoyer le fichier" et faire en sorte que la formule
fonctionne ?

Merci d'avance.

Slts

Jiffey


Rebonjour à toi

Effectivement un peu plus hard !!!!
Mais ma tenacité aidant :

Range("B65535").End(xlUp).Select
Do While ActiveCell.Row > Range("C5").Row
Range(ActiveCell.Offset(-1, 1), ActiveCell.Offset(0, 1).End(xlUp).Offset(1,
0)).EntireRow.Select
Selection.Rows.Group
If ActiveCell.Offset(-2, 1) = "" Then
ActiveCell.Offset(0, 2).End(xlUp).Offset(0, -1).Select
Else
ActiveCell.Offset(0, 1).End(xlUp).Select
End If
Loop

Attention comme pour mon premier code le point de repère de départ est
"Total général en bas de colonne B
Ce repère doit obligatoirement être présent pour un bon fonctionnement

Je pense que tu devrais être satisfait

Dis moi !!!



C'est mortel !! Merci beaucoup FFO !!!! Par contre, j'essaie de grouper en
plus les AC (colonne C) et là ca se corse .....

J'essaie de trouver, mais j'ai peur de devoir redemander de l'aide...

Merci encore !!!!

Jiffey




Salut jiffey

Je te propose ce code en partant du principe que l'identification des
agences sont en colonne B et commence à partir de la ligne 5 :

Range("B65535").End(xlUp).Select
Do While ActiveCell.Row > Range("B5").Row
Range(ActiveCell.Offset(-1, 0), ActiveCell.End(xlUp).Offset(1,
0)).EntireRow.Select
Selection.Rows.Group
ActiveCell.Offset(0, 1).End(xlUp).Select
Loop

Celà devrait convenir

Dis moi !!!



Bonjour à tous,




J'ai un pb que n'arrive vraiment pas à résoudre le pb :

J'ai une macro qui me donne un tableau de type http://cjoint.com/?hfs4Z8JSww



Je souhaiterais grouper les lignes limitées par les agences comme me le
donne (en partie) la macro du fichier enregistrée Ctrl + l :

---------------------------------------------------------
Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group

Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group


Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group

Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group



ActiveSheet.Outline.ShowLevels RowLevels:=1

----------------------------------------------------


Problème : je ne sais pas comment répéter l'opération jusqu'au bout (dans
cet exemple, jusq'au groupement des lignes 6 à 8).

Quelqu'un aurait-il la solution s'il vous plaît ?

Merci beaucoup d'avance !!!

Salutations,



Jiffey












Avatar
jiffey
FFO,

J'ai écrit cette macro :


Columns("B:B").Select
Selection.TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:úlse,
Tab:=True, _
Semicolon:úlse, Comma:úlse, Space:úlse, Other:úlse,
FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True


Columns("C:C").Select
Selection.TextToColumns Destination:=Range("C1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:úlse,
Tab:=True, _
Semicolon:úlse, Comma:úlse, Space:úlse, Other:úlse,
FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True


Columns("D:D").Select
Selection.TextToColumns Destination:=Range("D1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:úlse,
Tab:=True, _
Semicolon:úlse, Comma:úlse, Space:úlse, Other:úlse,
FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True


Columns("E:E").Select
Selection.TextToColumns Destination:=Range("E1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:úlse,
Tab:=True, _
Semicolon:úlse, Comma:úlse, Space:úlse, Other:úlse,
FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True


Columns("F:F").Select
Selection.TextToColumns Destination:=Range("F1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:úlse,
Tab:=True, _
Semicolon:úlse, Comma:úlse, Space:úlse, Other:úlse,
FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True



Range("B65535").End(xlUp).Offset(0, 2).Select
Do While ActiveCell.Row > Range("B5").Row
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group
ActiveCell.Offset(-2, 3).Select
Loop




Range("B65535").End(xlUp).Offset(0, 3).Select
Do While ActiveCell.Row > Range("B6").Row
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group
If ActiveCell.Offset(-2, 3) = "" Then
ActiveCell.Offset(-2, 4).Select
Else
ActiveCell.Offset(-3, 4).Select
End If
Loop


Ca marche ... presque, hélas. En fait dans la colonne DO2, lorsque les cases
pleines se suivent, saute des lignes (logique). J'ai essayé avec une double
condition, mais le pb, c'est que 3 "DO2" peuvent se suivre, voire plus.

Bref, je n'y arrive pas. :-(( Mes connaissances sont trop faibles pour
résoudre ce pb.

En espérant que tu pourras m'aider...

Slts

Jiffey





Oh c'est excellent FFO !!! Merci encore !!!!

La conversion a bien résolu le pb.

Sinon, tu as vu j'avais presque trouvé la formule ;-D (je m'étais juste
trompé dans la dernière ligne : "ActiveCell.Offset(0, 3).Select" au lieu de
"ActiveCell.Offset(-2, 3).Select" )

Merci en tous cas pour toutes tes explications détaillées étape par étape.
C'est génial !!


Je bosse un peu tout seul sur le groupement par DO2 (j'espère trouver cette
fois-ci...).


Une question par curiosité toutefois : comment peut-on convertir toutes les
colonnes sans les faire une par une :

j'ai ca comme macro :



Columns("B:B").Select
Selection.TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:úlse,
Tab:=True, _
Semicolon:úlse, Comma:úlse, Space:úlse, Other:úlse,
FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True


Columns("C:C").Select
Selection.TextToColumns Destination:=Range("C1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:úlse,
Tab:=True, _
Semicolon:úlse, Comma:úlse, Space:úlse, Other:úlse,
FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True

etc.

Ne peut-on pas là aussi écrire la formule pour une variable et la faire
répéter jusqu'à la colonne souhaitée ?


ex : for i= B to G
Columns("i:i").Select
Selection.TextToColumns Destination:=Range("i1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:úlse,
Tab:=True, _
Semicolon:úlse, Comma:úlse, Space:úlse, Other:úlse,
FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True


Qqch comme ça ?



Merci encore

Slts

Jiffey



Rebonjour à toi
Rassures toi tu n'abuses pas trop content de pouvoir t'aider

Pour t'expliquer un peu la démarche de mon code
Si je prends le dernier que je t'ai transmis :

1° je positionne la cellule active (la derniére du tableau "Total général")

Range("B65535").End(xlUp).Select

Range colonne B à partir de la cellule ligne 65535 et remonté j'usquà la
première cellule de cette même colonne Pleine par la commande End(xlup)

2° Instauration d'une boucle qui s'opèrera tant qu'une condition est remplie

Do While ActiveCell.Row > Range("C5").Row

Ligne de la cellule active > à la la ligne de cellule C5

3° Les instructions de la boucle :
3-A Sélection de la plage

Range(ActiveCell.Offset(-1, 1), ActiveCell.Offset(0, 1).End(xlUp).Offset(1,
0)).EntireRow.Select

De la cellule active positionnée précédemment mais décalée de 1 ligne vers
le haut et de 1 colonne vers la droite (Activecell.Offset(-1,1)) jusqu'à
cellule Active même ligne mais décalée d'une colonne vers la droite et
remontée vers la première cellule pleine et décalée d'une ligne vers le bas
même colonne (ActiveCell.Offset(0, 1).End(xlUp).Offset(1, 0)) avec les lignes
entières (EntireRow)

3-B Le regroupement des lignes

Selection.Rows.Group

3-C Nouvelle position de la cellule active

If ActiveCell.Offset(-2, 1) = "" Then
ActiveCell.Offset(0, 2).End(xlUp).Offset(0, -1).Select
Else
ActiveCell.Offset(0, 1).End(xlUp).Select
End If

Sachant que lors d'une sélection d'une plage la cellule active est toujours
la première cellule de la plage (ici une cellule de la colonne A en fonction
de la dernière plage sélectionnée)

Analyse de la colonne B (présence ou non d'une Agence qui suit la dernière
sélection)

If ActiveCell.Offset(-2, 1) = "" Then

Si la cellule active déplacée de 2 lignes vers le haut et d'une colonne vers
la droite = "" alors

ActiveCell.Offset(0, 2).End(xlUp).Offset(0, -1).Select

la cellule active est déplacée même ligne 2 colonnes sur la droite et
première cellule pleine vers le haut (Nouvel AC) et décalée d'1 colonne vers
la gauche (en colonne B point de départ de la boucle)
Sinon

ActiveCell.Offset(0, 1).End(xlUp).Select

La cellule active est décalée d'une colonne vers la droite (Nouvelle Agence
en colonne B point de départ de la boucle)

et la boucle recommence

Fort de ces explications tu dois comprendre aisémment que ce code qui
convenait à ton tableau précédent ne peut compte tenu de sa présentation
différente convenir à celui là

Je te propose pour ce nouveau en lieu et place celui-ci :

Range("B65535").End(xlUp).Offset(0, 2).Select
Do While ActiveCell.Row > Range("B5").Row
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group
ActiveCell.Offset(-2, 3).Select
Loop


Qui conviendra pour ce nouveau cas mais pas pour les cas précédents

Attention ce nouveau tableau porte des données non compréhensible par excel
(ils viennent d'une autre source)

Colonne par colonne avant d'utiliser ce nouveau code fait ceci :
Sélectionnes chacune d'elles puis Données/Convertir puis 3 fois Suivant et
terminer

Exécutes ensuite ce nouveau code

Pour ta compréhension dans la fenêtre de ton script installes différents
points d'arret en regard des lignes d'instruction (à gauche d'une ligne un
click de souris sur le bandeau gris) et éxécute le code
A chaque point il s'arrètera
Regardes dans ton document l'état d'avencement du processe et tu comprendras
mieux le cheminement puis appuis sur F5 pour poursuivre l'éxécution

Tu pourras à loisir si tu as tout bien compris adapter le code à d'autre
tableau

Pour supprimer les points d'arret il suffit de recliquer sur le bandeau gris
aux mêmes endroits

Espérant ne pas t'avoir noyer dans toutes ces explications

Et surtout de t'avoir aidé

Dis moi !!!!



Re, FFO,

Je me permets de te re-solliciter (en espérant ne pas abuser...) :

j'ai un autre tableau (ex : http://cjoint.com/?hgngTvnbUq ) avec lequel je
souhaiterais faire la même chose.

Pb, c'est un tableau qui est le résultat d'une macro (avec des recherchev,
etc.) et je crains qu'il ne soit rempli de "scories" (j'avais entendu ce
terme sur ce forum par JB). En tous cas, comme tu peux le vérifier, cela ne
marche pas (essai avec la colonne D)


Sais-tu comment "nettoyer le fichier" et faire en sorte que la formule
fonctionne ?

Merci d'avance.

Slts

Jiffey


Rebonjour à toi

Effectivement un peu plus hard !!!!
Mais ma tenacité aidant :

Range("B65535").End(xlUp).Select
Do While ActiveCell.Row > Range("C5").Row
Range(ActiveCell.Offset(-1, 1), ActiveCell.Offset(0, 1).End(xlUp).Offset(1,
0)).EntireRow.Select
Selection.Rows.Group
If ActiveCell.Offset(-2, 1) = "" Then
ActiveCell.Offset(0, 2).End(xlUp).Offset(0, -1).Select
Else
ActiveCell.Offset(0, 1).End(xlUp).Select
End If
Loop

Attention comme pour mon premier code le point de repère de départ est
"Total général en bas de colonne B
Ce repère doit obligatoirement être présent pour un bon fonctionnement

Je pense que tu devrais être satisfait

Dis moi !!!



C'est mortel !! Merci beaucoup FFO !!!! Par contre, j'essaie de grouper en
plus les AC (colonne C) et là ca se corse .....

J'essaie de trouver, mais j'ai peur de devoir redemander de l'aide...

Merci encore !!!!

Jiffey




Salut jiffey

Je te propose ce code en partant du principe que l'identification des
agences sont en colonne B et commence à partir de la ligne 5 :

Range("B65535").End(xlUp).Select
Do While ActiveCell.Row > Range("B5").Row
Range(ActiveCell.Offset(-1, 0), ActiveCell.End(xlUp).Offset(1,
0)).EntireRow.Select
Selection.Rows.Group
ActiveCell.Offset(0, 1).End(xlUp).Select
Loop

Celà devrait convenir

Dis moi !!!



Bonjour à tous,




J'ai un pb que n'arrive vraiment pas à résoudre le pb :

J'ai une macro qui me donne un tableau de type http://cjoint.com/?hfs4Z8JSww



Je souhaiterais grouper les lignes limitées par les agences comme me le
donne (en partie) la macro du fichier enregistrée Ctrl + l :

---------------------------------------------------------
Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group

Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group


Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select














Avatar
FFO
Rebonjours à toi

Je suis doublement satisfait par le fait que je réponde correctement à tes
attentes et réussisse à te rendre autonome ce qui est nettement préférable

Tu as de trés bonnes idées qui pêchent quelque peu d'imperfections mais
c'est le métier qui rentre
Courage courage tu es sur la bonne voie

Effectivement pour un processe à répéter de manière identique concernant des
variables successives sur une zone déterminées au lieu de répéter x fois la
même série de commandes pour traiter les x variables il vaut mieux utiliser
une boucle dans la panoplie suivante :

For Each
Next

For i = 1 to x

Do While
Loop

Etc....

Donc ici trés bonne idée d'utiliser :

for i= B to G

Mais là ou le bas blesse c'est que cette boucle doit être utilisée sous
cette syntaxe :

For i = 1 to 5 par exemple où la variable i est utilisée comme un compteur
portant la valeur de 1 à 5 pour cette exemple que la commande Next en fin de
boucle fera évoluer

Donc comment associer le fait qu'il faille des chiffres avec l'identication
des colonnes à traiter

La solution est de mettre ceci :

For i = Range("A1").Column To Range("D1").Column

Ou Range("A1").Column donne le numéro de la colonne de la cellule A1 et
idemme pour Range("D1").Column le numéro de la colonne de la cellule D1

ce qui équivaux à mettre

For i = 1 to 4

Tu peux choisir à ta guise une autre série de colonne

Puis donc il faut sélectionner la colonne à traiter en fonction du chiffre
représenté par la variable i

ta proposion est interessante :

Columns("i:i").Select

mais cette syntaxe pour cette instruction nécessite des lettres représentant
la colonne comme pour la colonne A ainsi :

Columns("A:A").select

Je me suis moi même poser la question : comment mettre cette sélection de
colonne avec le chiffre de celle-ci

et d'utiliser l'arme redoutable de l'aide Excel :

sélection de la commande (ici Columns) et F1

Et la réponse me fut apporter sur un plateau :

Columns(1).Select (pour la colonne A)

soit avec la variable i

Columns(i).Select

Dernière difficultée les lignes de commande de la conversion :

Selection.TextToColumns Destination:=Range("i1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:úlse,
Tab:=True, _
Semicolon:úlse, Comma:úlse, Space:úlse, Other:úlse,
FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True

Range("i1") souci souci !!!!
La syntaxe impose pour l'instruction Range de mettre dans la parenthèse la
colonne en lettre et la ligne en chiffre comme :

Range("A1")

Il y aurait la solution d'utiliser l'instruction Cells qui elle marche avec
uniquement la ligne et la colonne en chiffre comme

Cells(1,1) pour la cellule A1

Mais cette dernière n'arrive pas à cohabiter avec le reste des instructions
(Bug)

donc je me suis rabattu sur le fait qu'imperturbablement lors d'une
sélection d'une plage ici la colonne la cellule Active se trouve toujours sur
la première cellule de la plage donc la première cellule de la colonne et
donc de mettre au final :

Selection.TextToColumns Destination:¬tiveCell, DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:úlse, Tab:=True, _
Semicolon:úlse, Comma:úlse, Space:úlse, Other:úlse, FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True


Ce qui donne en résumé ce code globale :

For i = Range("A1").Column To Range("D1").Column
Columns(i).Select
Selection.TextToColumns Destination:¬tiveCell, DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:úlse, Tab:=True, _
Semicolon:úlse, Comma:úlse, Space:úlse, Other:úlse, FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True
Next

Celà fonctionne nickel chez moi

Je pense que pour toi celà devrait en être de même

J'espère que tu as tout compris pret à voler de tes propres ailes dans les
méandres du VBA d'Excel

Dis moi !!!!


Oh c'est excellent FFO !!! Merci encore !!!!

La conversion a bien résolu le pb.

Sinon, tu as vu j'avais presque trouvé la formule ;-D (je m'étais juste
trompé dans la dernière ligne : "ActiveCell.Offset(0, 3).Select" au lieu de
"ActiveCell.Offset(-2, 3).Select" )

Merci en tous cas pour toutes tes explications détaillées étape par étape.
C'est génial !!


Je bosse un peu tout seul sur le groupement par DO2 (j'espère trouver cette
fois-ci...).


Une question par curiosité toutefois : comment peut-on convertir toutes les
colonnes sans les faire une par une :

j'ai ca comme macro :



Columns("B:B").Select
Selection.TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:úlse,
Tab:=True, _
Semicolon:úlse, Comma:úlse, Space:úlse, Other:úlse,
FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True


Columns("C:C").Select
Selection.TextToColumns Destination:=Range("C1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:úlse,
Tab:=True, _
Semicolon:úlse, Comma:úlse, Space:úlse, Other:úlse,
FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True

etc.

Ne peut-on pas là aussi écrire la formule pour une variable et la faire
répéter jusqu'à la colonne souhaitée ?


ex : for i= B to G
Columns("i:i").Select
Selection.TextToColumns Destination:=Range("i1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:úlse,
Tab:=True, _
Semicolon:úlse, Comma:úlse, Space:úlse, Other:úlse,
FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True


Qqch comme ça ?



Merci encore

Slts

Jiffey



Rebonjour à toi
Rassures toi tu n'abuses pas trop content de pouvoir t'aider

Pour t'expliquer un peu la démarche de mon code
Si je prends le dernier que je t'ai transmis :

1° je positionne la cellule active (la derniére du tableau "Total général")

Range("B65535").End(xlUp).Select

Range colonne B à partir de la cellule ligne 65535 et remonté j'usquà la
première cellule de cette même colonne Pleine par la commande End(xlup)

2° Instauration d'une boucle qui s'opèrera tant qu'une condition est remplie

Do While ActiveCell.Row > Range("C5").Row

Ligne de la cellule active > à la la ligne de cellule C5

3° Les instructions de la boucle :
3-A Sélection de la plage

Range(ActiveCell.Offset(-1, 1), ActiveCell.Offset(0, 1).End(xlUp).Offset(1,
0)).EntireRow.Select

De la cellule active positionnée précédemment mais décalée de 1 ligne vers
le haut et de 1 colonne vers la droite (Activecell.Offset(-1,1)) jusqu'à
cellule Active même ligne mais décalée d'une colonne vers la droite et
remontée vers la première cellule pleine et décalée d'une ligne vers le bas
même colonne (ActiveCell.Offset(0, 1).End(xlUp).Offset(1, 0)) avec les lignes
entières (EntireRow)

3-B Le regroupement des lignes

Selection.Rows.Group

3-C Nouvelle position de la cellule active

If ActiveCell.Offset(-2, 1) = "" Then
ActiveCell.Offset(0, 2).End(xlUp).Offset(0, -1).Select
Else
ActiveCell.Offset(0, 1).End(xlUp).Select
End If

Sachant que lors d'une sélection d'une plage la cellule active est toujours
la première cellule de la plage (ici une cellule de la colonne A en fonction
de la dernière plage sélectionnée)

Analyse de la colonne B (présence ou non d'une Agence qui suit la dernière
sélection)

If ActiveCell.Offset(-2, 1) = "" Then

Si la cellule active déplacée de 2 lignes vers le haut et d'une colonne vers
la droite = "" alors

ActiveCell.Offset(0, 2).End(xlUp).Offset(0, -1).Select

la cellule active est déplacée même ligne 2 colonnes sur la droite et
première cellule pleine vers le haut (Nouvel AC) et décalée d'1 colonne vers
la gauche (en colonne B point de départ de la boucle)
Sinon

ActiveCell.Offset(0, 1).End(xlUp).Select

La cellule active est décalée d'une colonne vers la droite (Nouvelle Agence
en colonne B point de départ de la boucle)

et la boucle recommence

Fort de ces explications tu dois comprendre aisémment que ce code qui
convenait à ton tableau précédent ne peut compte tenu de sa présentation
différente convenir à celui là

Je te propose pour ce nouveau en lieu et place celui-ci :

Range("B65535").End(xlUp).Offset(0, 2).Select
Do While ActiveCell.Row > Range("B5").Row
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group
ActiveCell.Offset(-2, 3).Select
Loop


Qui conviendra pour ce nouveau cas mais pas pour les cas précédents

Attention ce nouveau tableau porte des données non compréhensible par excel
(ils viennent d'une autre source)

Colonne par colonne avant d'utiliser ce nouveau code fait ceci :
Sélectionnes chacune d'elles puis Données/Convertir puis 3 fois Suivant et
terminer

Exécutes ensuite ce nouveau code

Pour ta compréhension dans la fenêtre de ton script installes différents
points d'arret en regard des lignes d'instruction (à gauche d'une ligne un
click de souris sur le bandeau gris) et éxécute le code
A chaque point il s'arrètera
Regardes dans ton document l'état d'avencement du processe et tu comprendras
mieux le cheminement puis appuis sur F5 pour poursuivre l'éxécution

Tu pourras à loisir si tu as tout bien compris adapter le code à d'autre
tableau

Pour supprimer les points d'arret il suffit de recliquer sur le bandeau gris
aux mêmes endroits

Espérant ne pas t'avoir noyer dans toutes ces explications

Et surtout de t'avoir aidé

Dis moi !!!!



Re, FFO,

Je me permets de te re-solliciter (en espérant ne pas abuser...) :

j'ai un autre tableau (ex : http://cjoint.com/?hgngTvnbUq ) avec lequel je
souhaiterais faire la même chose.

Pb, c'est un tableau qui est le résultat d'une macro (avec des recherchev,
etc.) et je crains qu'il ne soit rempli de "scories" (j'avais entendu ce
terme sur ce forum par JB). En tous cas, comme tu peux le vérifier, cela ne
marche pas (essai avec la colonne D)


Sais-tu comment "nettoyer le fichier" et faire en sorte que la formule
fonctionne ?

Merci d'avance.

Slts

Jiffey


Rebonjour à toi

Effectivement un peu plus hard !!!!
Mais ma tenacité aidant :

Range("B65535").End(xlUp).Select
Do While ActiveCell.Row > Range("C5").Row
Range(ActiveCell.Offset(-1, 1), ActiveCell.Offset(0, 1).End(xlUp).Offset(1,
0)).EntireRow.Select
Selection.Rows.Group
If ActiveCell.Offset(-2, 1) = "" Then
ActiveCell.Offset(0, 2).End(xlUp).Offset(0, -1).Select
Else
ActiveCell.Offset(0, 1).End(xlUp).Select
End If
Loop

Attention comme pour mon premier code le point de repère de départ est
"Total général en bas de colonne B
Ce repère doit obligatoirement être présent pour un bon fonctionnement

Je pense que tu devrais être satisfait

Dis moi !!!



C'est mortel !! Merci beaucoup FFO !!!! Par contre, j'essaie de grouper en
plus les AC (colonne C) et là ca se corse .....

J'essaie de trouver, mais j'ai peur de devoir redemander de l'aide...

Merci encore !!!!

Jiffey




Salut jiffey

Je te propose ce code en partant du principe que l'identification des
agences sont en colonne B et commence à partir de la ligne 5 :

Range("B65535").End(xlUp).Select
Do While ActiveCell.Row > Range("B5").Row
Range(ActiveCell.Offset(-1, 0), ActiveCell.End(xlUp).Offset(1,
0)).EntireRow.Select
Selection.Rows.Group
ActiveCell.Offset(0, 1).End(xlUp).Select
Loop

Celà devrait convenir

Dis moi !!!



Bonjour à tous,




J'ai un pb que n'arrive vraiment pas à résoudre le pb :

J'ai une macro qui me donne un tableau de type http://cjoint.com/?hfs4Z8JSww



Je souhaiterais grouper les lignes limitées par les agences comme me le
donne (en partie) la macro du fichier enregistrée Ctrl + l :

---------------------------------------------------------
Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group

Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select
Selection.Rows.Group


Cells(10000, 4).End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
ActiveCell.End(xlUp).Offset(-1, 0).Select
Range(ActiveCell, ActiveCell.End(xlUp).Offset(1, 0)).EntireRow.Select














Avatar
AV
Salut FFO,

Je trouve que tes réponses (indépendamment de leur contenu....) sont faites sur
une tonalité qui manque quelque peu de modestie et...de prudence !

Tu as de trés bonnes idées qui pêchent quelque peu d'imperfections


Tu ne saurais mieux dire.....
Allons-y....

La solution est de mettre ceci :
For i = Range("A1").Column To Range("D1").Column


Cette syntaxe que tu présentes comme LA solution n'a aucun sens car, dans ce
contexte, Range("A1").Column est toujours =1 et Range("D1").Column est toujours
= 4
Remplacer une constante de 1 chiffre par une constante qui s'étale sur 18
caractères, je vois pas l'intérêt.

Puis donc il faut sélectionner la colonne à traiter en fonction du chiffre
représenté par la variable i


Absolument pas et cette remarque t'a déjà étét fait à plusieurs reprise par
d'autres : la sélection pour traitement est, dans l'immense majorité des cas,
totalement inutile, mais par contre, toujours nuisible à "l'efficacité" du code
!
Il s'agit, en général, d'instructions issues de l'enregistreur de macros.

Columns("i:i").Select
mais cette syntaxe pour cette instruction nécessite des lettres représentant
la colonne comme pour la colonne A ainsi :


Faux : il suffit d'utiliser l'index de colonne !
Ex. : Columns(9)

Il y aurait la solution d'utiliser l'instruction Cells qui elle marche avec
uniquement la ligne et la colonne en chiffre


Faux : l'instruction cells("A",i) est tout à fait valide !

Mais cette dernière n'arrive pas à cohabiter avec le reste des instructions
(Bug)


?????
Il n'y a aucune raison pour que ce type de syntaxe ne fonctionne pas :
.....Destination:Îlls(i, 1).....

donc je me suis rabattu sur le fait qu'imperturbablement lors d'une
sélection d'une plage ici la colonne la cellule Active se trouve toujours sur
la première cellule de la plage


FAUX !
C'est pas du tout "imperturbable" comme tu dis !
Sélection et cellule active c'est pas tout à fait pareil...
Exemple à exécuter et à méditer :

Columns(1).Select
Range("A4").Activate

Ce qui donne en résumé ce code globale :
For i = Range("A1").Column To Range("D1").Column
Columns(i).Select
Selection.TextToColumns Destination:¬tiveCell, DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:úlse, Tab:=True, _
Semicolon:úlse, Comma:úlse, Space:úlse, Other:úlse, FieldInfo _
:=Array(1, 1), TrailingMinusNumbers:=True
Next


Bofff..
Quand tu auras modifié le "i", supprimé les Select et viré tous les arguments
qui sont à False ..... ça va sacrément s'alléger...

J'espère que tu as tout compris pret à voler de tes propres ailes dans les
méandres du VBA d'Excel


Charité bien ordonnée.....

En résumé, mon cher FFO, autant ton empressement et ta disponibilité à
contribuer à la vie du forum sont louables, autant ton manque de prudence et le
ton péremptoire de tes affirmations sont parfois condamnables.
S'il est facile de se reposer sur le vieil adage "au royaume des aveugles les
borgnes sont rois", il est beaucoup plus judicieux de faire sien cette maxime
(dont je revendique la paternité et que, évidemment, je m'applique à moi-même) :
Ici comme ailleurs,
"On est toujours l'Einstein de quelqu'un et le cancre d'un autre"

AV

1 2 3