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

macro pour regrouper des lignes

9 réponses
Avatar
marchepied
Bonjour,
j'ai une base Excel dont le nombre d'enregistrement qui varie chaque
jours (venant d'un AS400). cette base contient en colonne H, un le
chiffre 1 ou 2. un nombre indetermin=E9 de 1 est suivi par un nombre
ind=E9termin=E9 de 2. voir exemple ci-dessous.
j'aimerai que tout les 2 soit regroup=E9s par petit groupe (lignes
cach=E9s)
quand on ouvre la base, on voit que les lignes o=F9 il y a le chifrre 1.
(les lignes avec 2 sont cach=E9es, mais avec le petit + sur la gauche.
et que l'on puisse faire apparaitre chaque petit groupe de 2
ind=E9pendement des autres groupes de 2.
en faite, un petit groupe de 2 appartient au 1 supp=E9rieur.
meci pour votre aide.

colonne H
1
1
2
2
2
1
2
2
2
2
1
1
1
1
1
2
2

je voudrai:
colonne H
1
+ 1
+ 1
1
1
1
1
+ 1

9 réponses

Avatar
Daniel.C
Bonjour.
Le problème est que dans une suite :
1
2
2
2
1
2
2
si tu fais un premier groupement avec :
1
2
2
2
tu obtiens :
+1
1
2
2
Ce qui est ce que tu souhaites, mais si tu procèdes au secong
groupement,
tu obtiens un seul regroupement :
+1
Il faut au moins deux 1 pour obtenir des groupes séparés.
Cordialement.
Daniel

Bonjour,
j'ai une base Excel dont le nombre d'enregistrement qui varie chaque
jours (venant d'un AS400). cette base contient en colonne H, un le
chiffre 1 ou 2. un nombre indeterminé de 1 est suivi par un nombre
indéterminé de 2. voir exemple ci-dessous.
j'aimerai que tout les 2 soit regroupés par petit groupe (lignes
cachés)
quand on ouvre la base, on voit que les lignes où il y a le chifrre 1.
(les lignes avec 2 sont cachées, mais avec le petit + sur la gauche.
et que l'on puisse faire apparaitre chaque petit groupe de 2
indépendement des autres groupes de 2.
en faite, un petit groupe de 2 appartient au 1 suppérieur.
meci pour votre aide.

colonne H
1
1
2
2
2
1
2
2
2
2
1
1
1
1
1
2
2

je voudrai:
colonne H
1
+ 1
+ 1
1
1
1
1
+ 1


Avatar
Daniel.C
A ceci près,, tu peux utiliser :

Sub test()
Dim c As Range, Res As Range
For Each c In Range([H1], [H65000].End(xlUp))
var = c.Address
If c = 1 And c.Offset(1) = 2 Then
Set Res = c
ElseIf c = 2 And (c.Offset(1) = 1 Or _
c.Offset = "") Then
Range(Res, c).Rows.Group
Range(Res.Offset(1), c).EntireRow.Hidden = True
End If
Next c
End Sub

Cordialement.
Daniel

Bonjour.
Le problème est que dans une suite :
1
2
2
2
1
2
2
si tu fais un premier groupement avec :
1
2
2
2
tu obtiens :
+1
1
2
2
Ce qui est ce que tu souhaites, mais si tu procèdes au secong groupement,
tu obtiens un seul regroupement :
+1
Il faut au moins deux 1 pour obtenir des groupes séparés.
Cordialement.
Daniel

Bonjour,
j'ai une base Excel dont le nombre d'enregistrement qui varie chaque
jours (venant d'un AS400). cette base contient en colonne H, un le
chiffre 1 ou 2. un nombre indeterminé de 1 est suivi par un nombre
indéterminé de 2. voir exemple ci-dessous.
j'aimerai que tout les 2 soit regroupés par petit groupe (lignes
cachés)
quand on ouvre la base, on voit que les lignes où il y a le chifrre 1.
(les lignes avec 2 sont cachées, mais avec le petit + sur la gauche.
et que l'on puisse faire apparaitre chaque petit groupe de 2
indépendement des autres groupes de 2.
en faite, un petit groupe de 2 appartient au 1 suppérieur.
meci pour votre aide.

colonne H
1
1
2
2
2
1
2
2
2
2
1
1
1
1
1
2
2

je voudrai:
colonne H
1
+ 1
+ 1
1
1
1
1
+ 1




Avatar
Transocéan
bonjour,
Comme dit daniel il y a un décalage mais en sautant les lignes contenant 1
de référence qui devient visible c'est possible
--
Faut-il travailler pour manger ? ou manger pour travailler ?

"Daniel.C" wrote:

Bonjour.
Le problème est que dans une suite :
1
2
2
2
1
2
2
si tu fais un premier groupement avec :
1
2
2
2
tu obtiens :
+1
1
2
2
Ce qui est ce que tu souhaites, mais si tu procèdes au secong
groupement,
tu obtiens un seul regroupement :
+1
Il faut au moins deux 1 pour obtenir des groupes séparés.
Cordialement.
Daniel

> Bonjour,
> j'ai une base Excel dont le nombre d'enregistrement qui varie chaque
> jours (venant d'un AS400). cette base contient en colonne H, un le
> chiffre 1 ou 2. un nombre indeterminé de 1 est suivi par un nombre
> indéterminé de 2. voir exemple ci-dessous.
> j'aimerai que tout les 2 soit regroupés par petit groupe (lignes
> cachés)
> quand on ouvre la base, on voit que les lignes où il y a le chifrre 1.
> (les lignes avec 2 sont cachées, mais avec le petit + sur la gauche.
> et que l'on puisse faire apparaitre chaque petit groupe de 2
> indépendement des autres groupes de 2.
> en faite, un petit groupe de 2 appartient au 1 suppérieur.
> meci pour votre aide.
>
> colonne H
> 1
> 1
> 2
> 2
> 2
> 1
> 2
> 2
> 2
> 2
> 1
> 1
> 1
> 1
> 1
> 2
> 2
>
> je voudrai:
> colonne H
> 1
> + 1
> + 1
> 1
> 1
> 1
> 1
> + 1





Avatar
FdeCourt
Salut,

Voilà une macro qui peux faire le boulot (7 secondes pour 65535
lignes, et en considérant que toutes les lignes sont renseignées, sans
erreur....) :

Sub Grouper_II()
Dim plage As String
Dim monRange
monRange = [Feuil1!H1:H65536]
With Feuil1
.Cells.ClearOutline
For x = 1 To UBound(monRange) - 1
Application.StatusBar = x
If monRange(x, 1) = 2 And plage = "" Then
plage = x
ElseIf monRange(x, 1) = 2 And monRange(x + 1, 1) <= 1 Then
plage = plage & ":" & x
.Rows(plage).Group
plage = ""
End If
Next
End With
End Sub

Cordialement,

F.
Avatar
marchepied
On 5 fév, 14:43, FdeCourt wrote:
Salut,

Voilà une macro qui peux faire le boulot  (7 secondes pour 65535
lignes, et en considérant que toutes les lignes sont renseignées, san s
erreur....) :

Sub Grouper_II()
    Dim plage As String
    Dim monRange
    monRange = [Feuil1!H1:H65536]
    With Feuil1
        .Cells.ClearOutline
        For x = 1 To UBound(monRange) - 1
        Application.StatusBar = x
            If monRange(x, 1) = 2 And plage = "" Then
                plage = x
            ElseIf monRange(x, 1) = 2 And monRange(x + 1, 1 ) <= 1 Then
                plage = plage & ":" & x
                .Rows(plage).Group
                plage = ""
            End If
        Next
    End With
End Sub

Cordialement,

F.



merci pour vos réponses.
la solution de FdeCourt fonctionne, sauf dans un cas, quand il faut
faire un groupe de une seule ligne 2.
Comme Daniel C. l'a remarqué, sa solution fonctionne sauf quand il y a
une seule ligne 1.
bon, tant pis, si c'est trop dure, je mettrais un filtre classique.
merci
Avatar
FdeCourt
Hello,

Il ne faut pas désespérer ;)

Avec celle là :

Sub Grouper_II()
Dim plage As String
Dim monRange
monRange = [Feuil1!H1:H36]
With Feuil1
.Cells.ClearOutline
For x = 2 To UBound(monRange) - 1
If monRange(x, 1) <> "" Then
If monRange(x, 1) = 2 And monRange(x - 1, 1) <= 1 Then
plage = x
If monRange(x, 1) = 2 And plage = "" Then
plage = x
ElseIf monRange(x, 1) = 2 And monRange(x + 1, 1) <= 1 Then
plage = plage & ":" & x
.Rows(plage).Group
plage = ""
End If
End If
Next
End With
End Sub

Cordialement,

F.
Avatar
marchepied
On 5 fév, 17:59, FdeCourt wrote:
Hello,

Il ne faut pas désespérer ;)

Avec celle là :

Sub Grouper_II()
    Dim plage As String
    Dim monRange
    monRange = [Feuil1!H1:H36]
    With Feuil1
        .Cells.ClearOutline
        For x = 2 To UBound(monRange) - 1
        If monRange(x, 1) <> "" Then
            If monRange(x, 1) = 2 And monRange(x - 1, 1) < = 1 Then
plage = x
            If monRange(x, 1) = 2 And plage = "" Then
                plage = x
            ElseIf monRange(x, 1) = 2 And monRange(x + 1, 1 ) <= 1 Then
                plage = plage & ":" & x
                .Rows(plage).Group
                plage = ""
            End If
        End If
        Next
    End With
End Sub

Cordialement,

F.



Bonsoir FdeCourt,
la nouvelle macro fonctionne bien, mais seulement dans le cas où il y
a une seule ligne 2.
je suppose que je dois combiner tes 2 macros ?
Marchepied
Avatar
FdeCourt
Alors encore quelques modifications :

Sub Grouper_II()
Dim plage As String
Dim monRange
monRange = [Feuil1!H1:H36]
With Feuil1
.Cells.ClearOutline
For x = 2 To UBound(monRange) - 1
If monRange(x, 1) <> "" Then
If x = 35 Then
Debug.Print "er"
End If
If monRange(x, 1) = 2 And monRange(x - 1, 1) <= 1 Then
plage = x

If monRange(x, 1) = 2 And plage = "" Then plage = x
If monRange(x, 1) = 2 And monRange(x + 1, 1) = 2 And x =
UBound(monRange) - 1 Then
plage = plage & ":" & x + 1
ElseIf monRange(x, 1) = 2 And monRange(x + 1, 1) <= 1 Or x
= UBound(monRange) - 1 Then
plage = plage & ":" & x
End If
If plage <> "" Then .Rows(plage).Group: plage = ""
End If
Next
End With
End Sub

Je l'ai testé sur la séquence suivante, et tout était correct (à
remettre en ligne bien sur !):
1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,2,1,2,2,1,2,2,1,1,2,1,1,2,1,1,2,1,1,2,1 ,1,1,2,1,1,1,2,1,1,1,2,1,1,1,1,2,1,1,1,1,2,1,1,2,2,1,1,2,2,1,1,2,2,1,1,1,2, 2,1,1,1,2,2,1,1,1,2,2,1,1,1,2,2,1,1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,1,1,2,2,2,1 ,1,1,1,2,2,2,1,2,2,2,2,1,2,2,2,2,1,2,2,2,2,1,2,2,2,2,1,1,2,2,2,2,1,1,2,2,2, 2,1,1,2,2,2,2,1,1,2,2,2,2,1,1,1,2,2,2,2,1,1,1,2,2,2,2

Cordialement,

F.
Avatar
marchepied
On 5 fév, 19:42, FdeCourt wrote:
Alors encore quelques modifications :

Sub Grouper_II()
    Dim plage As String
    Dim monRange
    monRange = [Feuil1!H1:H36]
    With Feuil1
        .Cells.ClearOutline
        For x = 2 To UBound(monRange) - 1
        If monRange(x, 1) <> "" Then
            If x = 35 Then
            Debug.Print "er"
            End If
            If monRange(x, 1) = 2 And monRange(x - 1, 1) < = 1 Then
plage = x

            If monRange(x, 1) = 2 And plage = "" Then pla ge = x
            If monRange(x, 1) = 2 And monRange(x + 1, 1) = 2 And x =
UBound(monRange) - 1 Then
                 plage = plage & ":" & x + 1
            ElseIf monRange(x, 1) = 2 And monRange(x + 1, 1 ) <= 1 Or x
= UBound(monRange) - 1 Then
                plage = plage & ":" & x
            End If
            If plage <> "" Then .Rows(plage).Group: plage = ""
        End If
        Next
    End With
End Sub

Je l'ai testé sur la séquence suivante, et tout était correct (à
remettre en ligne bien sur !):
1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,2,1,2,2,1,2,2,1,1,2,1,1,2,1,1,2,1,1,2 ,1­,1,1,2,1,1,1,2,1,1,1,2,1,1,1,1,2,1,1,1,1,2,1,1,2,2,1,1,2,2,1,1,2,2,1,1 ,1,2,­2,1,1,1,2,2,1,1,1,2,2,1,1,1,2,2,1,1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,1,1 ,2,2,2,1­,1,1,1,2,2,2,1,2,2,2,2,1,2,2,2,2,1,2,2,2,2,1,2,2,2,2,1,1,2,2,2,2 ,1,1,2,2,2,­2,1,1,2,2,2,2,1,1,2,2,2,2,1,1,1,2,2,2,2,1,1,1,2,2,2,2

Cordialement,

F.



Bonjour,
merci beaucoup FdeCourt. la dernière macro est beaucoup mieux. mais
il y a un cas où cas ne fonctionne pas. dans le cas où il y a une
suite de plusieurs 2 (ex: 5, 10 etc...) la macro groupe seulement le
premier 2.
si c'est pas trop demandé merci de votre aide.
marchepied