OVH Cloud OVH Cloud

Macro défi !

12 réponses
Avatar
Franck
Bonjour,

Je fais appel aux cerveaux chevronn=E9s du MPFE

Je voudrais concevoir une macro ex=E9cutant la tache=20
suivante.

Balayer ligne par ligne les valeurs des colonnes J, K, L=20
de ma feuille.
D=E8s qu'une valeur (des trois colonnes) diff=E8re de celles=20
de la ligne pr=E9c=E9dente, il faut ins=E9rer une ligne au=20
dessus de la ligne diff=E9rente.
En cellule P de la ligne ins=E9r=E9e il faut faire la somme=20
des valeurs en O du pav=E9 pr=E9c=E9dent (entre deux insertions).

Est-ce clair ?

Est ce que quelqu'un a une id=E9e du code ?

Merci d'avance

Franck

10 réponses

1 2
Avatar
Franck
Je t'apportes ma réponse,

Je ne vois pas comment faire, fut ce par l'enregistreur de
macro.

J'ai déjà fait 7 macros différentes de traitement de
données de ce fichier dont le traitement est urgent, je ne
vois pas le code pour cette 8ème macro. Je préfères que
quelqu'un me dégrossisse (j'aime pas mâcher comme terme)
le travail en me donnant la structure générale de la macro
(à moi de la réadapter).

Je ne suis pas un pro comme toi, pour moi, ce code n'est
pas simple.

Merci de ta compréhension

Franck
-----Message d'origine-----
Bonjour,

Oui c'est très clair.
Oui, je connais le code.

Mais je vais profiter de ta question pour donner ici un
avis tout à fait

personnel qui ne concerne pas que toi.

A la place de demander à d'autres de faire un truc aussi
simple, pourquoi ne

pas essayer de le faire par toi-même en t'aidant de
l'enregistreur de macros

et de l'aide, puis de venir ici pour poser des questions
limitées et

précises lorsque tu rencontres une difficulté?

Cela t'apporterais la satisfaction de la découverte et le
plaisir de

l'apprentissage constructif . Les connaissances acquises
le serait de façon

durable et le plaisir de t'aider des cerveaux chevronnés
serait décuplé de

te voir faire un minimum d'effort au lieu d'attendre que
d'autres te machent

le boulot.

Ceci étant, je le rappelle, un avis tout à fait personnel
et heureusement

pour toi, pas partagé de tous ;-)


Paul V.

Franck wrote:
Bonjour,

Je fais appel aux cerveaux chevronnés du MPFE

Je voudrais concevoir une macro exécutant la tache
suivante.

Balayer ligne par ligne les valeurs des colonnes J, K, L
de ma feuille.
Dès qu'une valeur (des trois colonnes) diffère de celles
de la ligne précédente, il faut insérer une ligne au
dessus de la ligne différente.
En cellule P de la ligne insérée il faut faire la somme
des valeurs en O du pavé précédent (entre deux
insertions).



Est-ce clair ?

Est ce que quelqu'un a une idée du code ?

Merci d'avance

Franck



.




Avatar
-=lolol=-
Salut Franck,

Pour les grandes lignes, voilà comment je ferais :

- définir la plage sur laquelle tu veux faire tes tests
set MaPlage=intersect(activesheet.usedrange;[J:L])
(y a surement mieux à faire)

- boucler sur chacune des cellules de ta plage
For each MaCellule in MaPlage
'les tests, j'ai pas bien compris
if MaCellule<> MaCellule.offset(-1,0) then
'inserer une ligne en se basant sur MaCellule.row
'En cellule P de la ligne insérée il faut faire la somme
'des valeurs en O du pavé précédent (entre deux insertions).
'Est-ce clair ?
'=> euf non, désolé
next MaCellule

reste bien certain que la macro ne fonctionne pas dans cet état ! mais je
pense que c'est sur un truc comme ça que je partirais si je devais matter
ton problème.

Espérant t'avoir aidé
@+lolo
Avatar
Michel Gaboly
Bonjour,

Je ne suis qu'en partie d'accord avec toi.

Il est clair que la découverte par soi-même est plus instructive. Cependant,
l'enregistreur de macros ne permet pas de construire une boucle, ce qui est
nécessaire ici.

D'autre part, le traitement n'est pas aussi simple que cela : il y a l'habituelle
difficulté des suppressions/insertions de lignes dans une boucle : selon qu'une
ligne a été supprimé (ou ajoutée) lors d'un passage dans la boucle, la ligne à
traiter lors du passage suivant n'est pas la même que s'il n'y avait pas eu de
suppression (ou insertion). Pour résoudre cela, en cas de suppression, on com-
mence classiquement par la dernière ligne.

Ici le cas est + compliqué, car l'insertion se fait au-dessus de la zone examinée.

Il est probable que pour une forte proportion des gens qui utilisent VBA de façon
occasionnelle, il s'agit d'une procédure relativement difficile.

C'est peut-être le cas pour Franck, puisqu'il parle de défi.

Enfin, le forum s'adresse aussi à des débutants, y compris des débutants qui veu-
lent appliquer la technique que tu préconises, essayer eux-mêmes. La demande de
Franck me paraît un excellent exercice pour eux. ;-))

Voici une macro qui devrait te convenir, même si comme dis Paul V., tu peux aussi
explorer les possibilités offertes par le menu "Données".

Sub SousTotaux()
Dim c As Range, Ref As Range, b As Boolean, i As Long, j As Long
b = False
Set Ref = Range("J2")
Do
Set c = Range("J2").Offset(i)
j = j + 1
If c <> c.Offset(-1) Or c.Offset(, 1) <> c.Offset(-1, 1) Or c.Offset(, 2) <> c.Offset(-1, 2) Then

If b Then
c.EntireRow.Insert
i = i + 1
c.Offset(-1, 6).FormulaR1C1 = "=SUM(R[-1]C[-1]:R[" & -j & "]C[-1])"
j = 0
Else
b = True
End If
Else
' j = j + 1
End If
i = i + 1
Loop Until IsEmpty(Ref.Offset(i))
c.Offset(1, 6).FormulaR1C1 = "=SUM(R[-1]C[-1]:R[" & -(j + 1) & "]C[-1])"
End Sub



Bonjour,

Oui c'est très clair.
Oui, je connais le code.

Mais je vais profiter de ta question pour donner ici un avis tout à fait
personnel qui ne concerne pas que toi.

A la place de demander à d'autres de faire un truc aussi simple, pourquoi ne
pas essayer de le faire par toi-même en t'aidant de l'enregistreur de macros
et de l'aide, puis de venir ici pour poser des questions limitées et
précises lorsque tu rencontres une difficulté?

Cela t'apporterais la satisfaction de la découverte et le plaisir de
l'apprentissage constructif . Les connaissances acquises le serait de façon
durable et le plaisir de t'aider des cerveaux chevronnés serait décuplé de
te voir faire un minimum d'effort au lieu d'attendre que d'autres te machent
le boulot.

Ceci étant, je le rappelle, un avis tout à fait personnel et heureusement
pour toi, pas partagé de tous ;-)

Paul V.

Franck wrote:
Bonjour,

Je fais appel aux cerveaux chevronnés du MPFE

Je voudrais concevoir une macro exécutant la tache
suivante.

Balayer ligne par ligne les valeurs des colonnes J, K, L
de ma feuille.
Dès qu'une valeur (des trois colonnes) diffère de celles
de la ligne précédente, il faut insérer une ligne au
dessus de la ligne différente.
En cellule P de la ligne insérée il faut faire la somme
des valeurs en O du pavé précédent (entre deux insertions).

Est-ce clair ?

Est ce que quelqu'un a une idée du code ?

Merci d'avance

Franck



--
Cordialement,

Michel Gaboly
http://www.gaboly.com


Avatar
Dédé
Heuuu je dirais qu'une seule chose :

www.excelabo.net !!!!! ;-))

Plus pour un débutant, il va pas trouver aussi facilement !! ;-)))

Salutations
Dédé


--
Pour répondre, enlever le NOSPAM
"Michel Gaboly" a écrit dans le message de
news:
Bonjour,

Je ne suis qu'en partie d'accord avec toi.

Il est clair que la découverte par soi-même est plus instructive.
Cependant,

l'enregistreur de macros ne permet pas de construire une boucle, ce qui
est

nécessaire ici.

D'autre part, le traitement n'est pas aussi simple que cela : il y a
l'habituelle

difficulté des suppressions/insertions de lignes dans une boucle : selon
qu'une

ligne a été supprimé (ou ajoutée) lors d'un passage dans la boucle, la
ligne à

traiter lors du passage suivant n'est pas la même que s'il n'y avait pas
eu de

suppression (ou insertion). Pour résoudre cela, en cas de suppression, on
com-

mence classiquement par la dernière ligne.

Ici le cas est + compliqué, car l'insertion se fait au-dessus de la zone
examinée.


Il est probable que pour une forte proportion des gens qui utilisent VBA
de façon

occasionnelle, il s'agit d'une procédure relativement difficile.

C'est peut-être le cas pour Franck, puisqu'il parle de défi.

Enfin, le forum s'adresse aussi à des débutants, y compris des débutants
qui veu-

lent appliquer la technique que tu préconises, essayer eux-mêmes. La
demande de

Franck me paraît un excellent exercice pour eux. ;-))

Voici une macro qui devrait te convenir, même si comme dis Paul V., tu
peux aussi

explorer les possibilités offertes par le menu "Données".

Sub SousTotaux()
Dim c As Range, Ref As Range, b As Boolean, i As Long, j As Long
b = False
Set Ref = Range("J2")
Do
Set c = Range("J2").Offset(i)
j = j + 1
If c <> c.Offset(-1) Or c.Offset(, 1) <> c.Offset(-1, 1)
Or c.Offset(, 2) <> c.Offset(-1, 2) Then


If b Then
c.EntireRow.Insert
i = i + 1
c.Offset(-1, 6).FormulaR1C1 "=SUM(R[-1]C[-1]:R[" & -j & "]C[-1])"
j = 0
Else
b = True
End If
Else
' j = j + 1
End If
i = i + 1
Loop Until IsEmpty(Ref.Offset(i))
c.Offset(1, 6).FormulaR1C1 = "=SUM(R[-1]C[-1]:R[" & -(j + 1) &
"]C[-1])"

End Sub



Bonjour,

Oui c'est très clair.
Oui, je connais le code.

Mais je vais profiter de ta question pour donner ici un avis tout à fait
personnel qui ne concerne pas que toi.

A la place de demander à d'autres de faire un truc aussi simple,
pourquoi ne


pas essayer de le faire par toi-même en t'aidant de l'enregistreur de
macros


et de l'aide, puis de venir ici pour poser des questions limitées et
précises lorsque tu rencontres une difficulté?

Cela t'apporterais la satisfaction de la découverte et le plaisir de
l'apprentissage constructif . Les connaissances acquises le serait de
façon


durable et le plaisir de t'aider des cerveaux chevronnés serait décuplé
de


te voir faire un minimum d'effort au lieu d'attendre que d'autres te
machent


le boulot.

Ceci étant, je le rappelle, un avis tout à fait personnel et
heureusement


pour toi, pas partagé de tous ;-)

Paul V.

Franck wrote:
Bonjour,

Je fais appel aux cerveaux chevronnés du MPFE

Je voudrais concevoir une macro exécutant la tache
suivante.

Balayer ligne par ligne les valeurs des colonnes J, K, L
de ma feuille.
Dès qu'une valeur (des trois colonnes) diffère de celles
de la ligne précédente, il faut insérer une ligne au
dessus de la ligne différente.
En cellule P de la ligne insérée il faut faire la somme
des valeurs en O du pavé précédent (entre deux insertions).

Est-ce clair ?

Est ce que quelqu'un a une idée du code ?

Merci d'avance

Franck



--
Cordialement,

Michel Gaboly
http://www.gaboly.com






Avatar
Paul V.
Bonjour,

J'avais précisé que c'était un avis personnel ;-) ce qui impliquait
fatalement que ce n'était pas l'avis de tous.
Je ne vais donc pas polémiquer sur ce sujet qui revient régulièrement à
savoir jusqu'ou va l'aide et ou commence l'exploitation de la gentillesse.
Je ne voudrais que préciser quelques points.

Michel Gaboly wrote:
....................
Il est clair que la découverte par soi-même est plus instructive.
Cependant,
l'enregistreur de macros ne permet pas de construire une boucle, ce
qui est
nécessaire ici.
................

Faut lire ce que j'ai écrit, l'enregistreur de macro et l'aide en ligne
permettent sans aucunes difficultés de créer des boucles. Il y a même plein
d'exemples récupérables dans l'aide.

D'autre part, le traitement n'est pas aussi simple que cela
C'est pour donner de la valeur à la réponse que tu trouves que c'est pas si

simple. Je trouve cela élémentaire pour ma part, des problèmes similaires
ont déjà été résolus de multiples fois sur ce forum et rien qu'excellabo
présente tous les éléments qui mis ensemble résolvent ce petit problème.

: il y a
l'habituelle
difficulté des suppressions/insertions de lignes dans une boucle :
On ne parle pas de suppression ce qui rend la difficulté que tu soulignes

inexistante.

....................
Ici le cas est + compliqué, car l'insertion se fait au-dessus de la
zone examinée.

Je ne vois pas pourquoi c'est + compliqué.


Il est probable que pour une forte proportion des gens qui utilisent
VBA de façon
occasionnelle, il s'agit d'une procédure relativement difficile.

C'est peut-être le cas pour Franck, puisqu'il parle de défi.

Mon opinion est que l'on recourt bien trop souvent au VBA parce que l'on ne

connait pas les bases essentielles du logiciel et que de ce fait, donner une
solution en VBA n'est sûrement pas aider la personne intéressée.

Dans le cas qui nous occupe, la solution simple, rapide et efficace consiste
à utiliser sous totaux. Pas besoin de VBA.

Donner des lignes de code à un débutant (je ne parle pas de Frank, je ne le
connais pas) et résoudre son problème à sa place, me parait une aberration.
Aider quelqu'un qui se démène et rencontre un problème ponctuel réel est
bien plus stimulant

A+

Paul V

Avatar
Modeste
;-)))
Ah ! Paul,
tu as encore oublié de remettre la souriette !

car aussi bien ta solution que celle de Michel sont tout
aussi didactiques l'une que l'autre et ont de quoi
satisfaire, les esprits chagrins ;-)))

nb:
les pseudos : je ricane ???, jerry Gaule et Hilse Maäre
sont déja pris....
;-)))
@+
-----Message d'origine-----
Bonjour,

J'avais précisé que c'était un avis personnel ;-) ce qui
impliquait

fatalement que ce n'était pas l'avis de tous.
Je ne vais donc pas polémiquer sur ce sujet qui revient
régulièrement à

savoir jusqu'ou va l'aide et ou commence l'exploitation
de la gentillesse.

Je ne voudrais que préciser quelques points.

Michel Gaboly wrote:
.....................
Il est clair que la découverte par soi-même est plus
instructive.


Cependant,
l'enregistreur de macros ne permet pas de construire
une boucle, ce


qui est
nécessaire ici.
.................

Faut lire ce que j'ai écrit, l'enregistreur de macro et
l'aide en ligne

permettent sans aucunes difficultés de créer des boucles.
Il y a même plein

d'exemples récupérables dans l'aide.

D'autre part, le traitement n'est pas aussi simple que
cela


C'est pour donner de la valeur à la réponse que tu
trouves que c'est pas si

simple. Je trouve cela élémentaire pour ma part, des
problèmes similaires

ont déjà été résolus de multiples fois sur ce forum et
rien qu'excellabo

présente tous les éléments qui mis ensemble résolvent ce
petit problème.


: il y a
l'habituelle
difficulté des suppressions/insertions de lignes dans
une boucle :


On ne parle pas de suppression ce qui rend la difficulté
que tu soulignes

inexistante.

.....................
Ici le cas est + compliqué, car l'insertion se fait au-
dessus de la


zone examinée.

Je ne vois pas pourquoi c'est + compliqué.


Il est probable que pour une forte proportion des gens
qui utilisent


VBA de façon
occasionnelle, il s'agit d'une procédure relativement
difficile.



C'est peut-être le cas pour Franck, puisqu'il parle de
défi.



Mon opinion est que l'on recourt bien trop souvent au VBA

parce que l'on ne

connait pas les bases essentielles du logiciel et que de
ce fait, donner une

solution en VBA n'est sûrement pas aider la personne
intéressée.


Dans le cas qui nous occupe, la solution simple, rapide
et efficace consiste

à utiliser sous totaux. Pas besoin de VBA.

Donner des lignes de code à un débutant (je ne parle pas
de Frank, je ne le

connais pas) et résoudre son problème à sa place, me
parait une aberration.

Aider quelqu'un qui se démène et rencontre un problème
ponctuel réel est

bien plus stimulant

A+

Paul V


.




Avatar
Michel Gaboly
Re,

Bien sûr que Données Sous-Totaux peut être utilisé, mais c'est moins
souple :

- Les sous-totaux apparaissent dans la même colonne que les valeurs
totalisées, alors que Franck veut afficher en colonne "P" les sous-totaux
des valeurs en colonne "O", ce qui est nettement plus lisible, car cela
fait apparaître une cellule vide entre chaque groupe de valeurs de la
colonne "O".

- On n'a pas le choix du libellé correspondant au sous-total, ce qu'une
macro peut bien sûr gérer.

- Le menu "Données" s'attend à ce que la base comporte des intitulés
en haut de chaque colonne, ce qui n'est pas toujours le cas.

L'aide VBA peut rendre de grands services quand on en a l'habitude,
mais bien souvent les débutants ont beaucoup de mal à l'utiliser.

Quant à la simplicité de la macro, c'est strictement équivalent aux
suppressions de lignes : si on examine successivement les lignes N,
N +1, N + 2..., après une insertion il faut passer non de N à N + 1
mais à N + 2, sous peine de tester la ligne insérée (vide en J, K et L)
avec celle qui la précède.

Essaye donc d'écrire la macro, tu verras qu'il est nécessaire de gérer
cela.

Ceci dit, je ne ne prétend nullement qu'il s'agit de quelque chose de
très compliqué, juste assez pour poser des problèmes à n'importe
quel programmeur occasionnel.

Les seuls points sur lesquels je partage ton avis, sont :

- Il s'agit d'un problème classique. La première macro que j'ai
faite pour cela, c'était en 1986, avec la version 1.0 d'Excel ;
il s'agissait d'indiquer le détail des comptes regroupés pour un bilan
comptable.

- Il est clair qu'il vaut mieux bien connaître Excel, plutôt que de
chercher à réinventer la roue en VBA ;-))


Mais comme tu le dis, les avis personnels sont divers.



Bonjour,

J'avais précisé que c'était un avis personnel ;-) ce qui impliquait
fatalement que ce n'était pas l'avis de tous.
Je ne vais donc pas polémiquer sur ce sujet qui revient régulièrement à
savoir jusqu'ou va l'aide et ou commence l'exploitation de la gentillesse.
Je ne voudrais que préciser quelques points.

Michel Gaboly wrote:
....................
Il est clair que la découverte par soi-même est plus instructive.
Cependant,
l'enregistreur de macros ne permet pas de construire une boucle, ce
qui est
nécessaire ici.
................

Faut lire ce que j'ai écrit, l'enregistreur de macro et l'aide en ligne
permettent sans aucunes difficultés de créer des boucles. Il y a même plein
d'exemples récupérables dans l'aide.

D'autre part, le traitement n'est pas aussi simple que cela
C'est pour donner de la valeur à la réponse que tu trouves que c'est pas si

simple. Je trouve cela élémentaire pour ma part, des problèmes similaires
ont déjà été résolus de multiples fois sur ce forum et rien qu'excellabo
présente tous les éléments qui mis ensemble résolvent ce petit problème.

: il y a
l'habituelle
difficulté des suppressions/insertions de lignes dans une boucle :
On ne parle pas de suppression ce qui rend la difficulté que tu soulignes

inexistante.

....................
Ici le cas est + compliqué, car l'insertion se fait au-dessus de la
zone examinée.

Je ne vois pas pourquoi c'est + compliqué.


Il est probable que pour une forte proportion des gens qui utilisent
VBA de façon
occasionnelle, il s'agit d'une procédure relativement difficile.

C'est peut-être le cas pour Franck, puisqu'il parle de défi.

Mon opinion est que l'on recourt bien trop souvent au VBA parce que l'on ne

connait pas les bases essentielles du logiciel et que de ce fait, donner une
solution en VBA n'est sûrement pas aider la personne intéressée.

Dans le cas qui nous occupe, la solution simple, rapide et efficace consiste
à utiliser sous totaux. Pas besoin de VBA.

Donner des lignes de code à un débutant (je ne parle pas de Frank, je ne le
connais pas) et résoudre son problème à sa place, me parait une aberration.
Aider quelqu'un qui se démène et rencontre un problème ponctuel réel est
bien plus stimulant

A+

Paul V


--
Cordialement,

Michel Gaboly
http://www.gaboly.com


Avatar
Paul V.
Salut Modeste,

J'ai déjà dis que je n'aime pas trop les souriettes. J'en mets quand j'ecris
quelque chose de drôle et que j'ai peur que mon lecteur ne comprenne pas mon
mauvais humour. Pas quand j'écris une vacherie ;-) , cela risquerait d'en
adoucir l'effet ;-)

Juste pour pinailler, balancer des lignes de codes incompréhensibles pour le
profane pour qu'il n'ait plus qu'à faire du copier-coller, je vois pas ou
est le coté didactique.

A+

Paul V

Modeste wrote:
;-)))
Ah ! Paul,
tu as encore oublié de remettre la souriette !

car aussi bien ta solution que celle de Michel sont tout
aussi didactiques l'une que l'autre et ont de quoi
satisfaire, les esprits chagrins ;-)))

nb:
les pseudos : je ricane ???, jerry Gaule et Hilse Maäre
sont déja pris....
;-)))
@+
-----Message d'origine-----
Bonjour,

J'avais précisé que c'était un avis personnel ;-) ce qui impliquait
fatalement que ce n'était pas l'avis de tous.
Je ne vais donc pas polémiquer sur ce sujet qui revient
régulièrement à savoir jusqu'ou va l'aide et ou commence
l'exploitation de la gentillesse. Je ne voudrais que préciser
quelques points.

Michel Gaboly wrote:
.....................
Il est clair que la découverte par soi-même est plus instructive.
Cependant,
l'enregistreur de macros ne permet pas de construire une boucle, ce
qui est
nécessaire ici.
.................

Faut lire ce que j'ai écrit, l'enregistreur de macro et l'aide en
ligne permettent sans aucunes difficultés de créer des boucles. Il y
a même plein d'exemples récupérables dans l'aide.

D'autre part, le traitement n'est pas aussi simple que
cela


C'est pour donner de la valeur à la réponse que tu trouves que c'est
pas si simple. Je trouve cela élémentaire pour ma part, des
problèmes similaires ont déjà été résolus de multiples fois sur ce
forum et rien qu'excellabo présente tous les éléments qui mis
ensemble résolvent ce petit problème.

il y a
l'habituelle

difficulté des suppressions/insertions de lignes dans
une boucle :


On ne parle pas de suppression ce qui rend la difficulté que tu
soulignes inexistante.

.....................
Ici le cas est + compliqué, car l'insertion se fait au- dessus de la
zone examinée.

Je ne vois pas pourquoi c'est + compliqué.


Il est probable que pour une forte proportion des gens qui utilisent
VBA de façon
occasionnelle, il s'agit d'une procédure relativement difficile.

C'est peut-être le cas pour Franck, puisqu'il parle de défi.

Mon opinion est que l'on recourt bien trop souvent au VBA parce que

l'on ne connait pas les bases essentielles du logiciel et que de ce
fait, donner une solution en VBA n'est sûrement pas aider la
personne intéressée.

Dans le cas qui nous occupe, la solution simple, rapide et efficace
consiste à utiliser sous totaux. Pas besoin de VBA.

Donner des lignes de code à un débutant (je ne parle pas de Frank,
je ne le connais pas) et résoudre son problème à sa place, me parait
une aberration. Aider quelqu'un qui se démène et rencontre un
problème ponctuel réel est bien plus stimulant

A+

Paul V


.






Avatar
Paul V.
Re Michel,

J'aime avoir le dernier mot donc je reviens ;-)

Michel Gaboly wrote:
Re,

Bien sûr que Données Sous-Totaux peut être utilisé, mais c'est moins
souple :

Ah bon. C'est fait en trente seconde et le code en plusieurs minutes (pour

certains, bien plus pour un débutant)

- Les sous-totaux apparaissent dans la même colonne que les valeurs
totalisées, alors que Franck veut afficher en colonne "P" les
sous-totaux des valeurs en colonne "O", ce qui est nettement plus
lisible, car cela fait apparaître une cellule vide entre chaque
groupe de valeurs de la colonne "O".



Jamais entendu parler d'insérer? ;-)

- On n'a pas le choix du libellé correspondant au sous-total, ce
qu'une macro peut bien sûr gérer.


Jamais entendu parler de changer le contenu d'une cellule? ;-)

- Le menu "Données" s'attend à ce que la base comporte des intitulés
en haut de chaque colonne, ce qui n'est pas toujours le cas.

Tu marques un point, mettre des titres à ses colonnes, c'est pas donné à

tout le monde. ;-)

L'aide VBA peut rendre de grands services quand on en a l'habitude,
mais bien souvent les débutants ont beaucoup de mal à l'utiliser.



Uniquement ceux qui renoncent trop vite.

Quant à la simplicité de la macro, c'est strictement équivalent aux
suppressions de lignes : si on examine successivement les lignes N,
N +1, N + 2..., après une insertion il faut passer non de N à N + 1
mais à N + 2, sous peine de tester la ligne insérée (vide en J, K et
L) avec celle qui la précède.

Essaye donc d'écrire la macro, tu verras qu'il est nécessaire de gérer
cela.

Je dois pas écrire du code pour comprendre cela mais je ne vois toujours pas

ou est le problème. Il me semble normùal que si on insère quelque chose, que
l'on en tienne compte pour la suite.

Ceci dit, je ne ne prétend nullement qu'il s'agit de quelque chose de
très compliqué, juste assez pour poser des problèmes à n'importe
quel programmeur occasionnel.

OK je suis d'accord

Les seuls points sur lesquels je partage ton avis, sont :

- Il s'agit d'un problème classique. La première macro que j'ai
faite pour cela, c'était en 1986, avec la version 1.0 d'Excel ;
il s'agissait d'indiquer le détail des comptes regroupés pour un bilan
comptable.

Pas mal mais j'ai acheté mon premier mac en 85 pour avoir Excel. Pour

remplacer multiplan que j'aimais pas trop. En 86, j'avais la version 2.0, si
je ne me trompe. ;-) C'était le pied par rapport au boulot sur les grosses
bécanes.

- Il est clair qu'il vaut mieux bien connaître Excel, plutôt que de
chercher à réinventer la roue en VBA ;-))


Mais comme tu le dis, les avis personnels sont divers.

Allez hop, match nul, balle au centre et bon boulot.


A+

Paul V

Avatar
Michel Gaboly
Re,

Le principal est que tu sois satisfait ;-))

Cela faisait quelque temps que je n'avais eu à participer à
une polémique ici, mais je m'en passe très bien ;-)))



Je ne pensais faire couler autant d'encre informatique
avec mon problème.

Je dirais de façon générale, que j'ai appris VB en
autodidacte, que je lis beaucoup ce forum, excelabo et
autres sites dédiés au VB.

En général, j'essaies vraiment de développer par moi même
mes macros, mais celle-là, j'avoues que je ne savais pas
du tout comment la prendre.

La macro proposée par Michel me convient tout à fait, elle
fait ce que j'attendais, à moi de la peaufiner pour
l'adapter à 100 % à mon fichier.

Merci à tous.

Franck

-----Message d'origine-----
Bonjour,

Je ne suis qu'en partie d'accord avec toi.

Il est clair que la découverte par soi-même est plus
instructive. Cependant,

l'enregistreur de macros ne permet pas de construire une
boucle, ce qui est

nécessaire ici.

D'autre part, le traitement n'est pas aussi simple que
cela : il y a l'habituelle

difficulté des suppressions/insertions de lignes dans une
boucle : selon qu'une

ligne a été supprimé (ou ajoutée) lors d'un passage dans
la boucle, la ligne à

traiter lors du passage suivant n'est pas la même que
s'il n'y avait pas eu de

suppression (ou insertion). Pour résoudre cela, en cas de
suppression, on com-

mence classiquement par la dernière ligne.

Ici le cas est + compliqué, car l'insertion se fait au-
dessus de la zone examinée.


Il est probable que pour une forte proportion des gens
qui utilisent VBA de façon

occasionnelle, il s'agit d'une procédure relativement
difficile.


C'est peut-être le cas pour Franck, puisqu'il parle de
défi.


Enfin, le forum s'adresse aussi à des débutants, y
compris des débutants qui veu-

lent appliquer la technique que tu préconises, essayer
eux-mêmes. La demande de

Franck me paraît un excellent exercice pour eux. ;-))

Voici une macro qui devrait te convenir, même si comme
dis Paul V., tu peux aussi

explorer les possibilités offertes par le menu "Données".

Sub SousTotaux()
Dim c As Range, Ref As Range, b As Boolean, i As Long, j
As Long

b = False
Set Ref = Range("J2")
Do
Set c = Range("J2").Offset(i)
j = j + 1
If c <> c.Offset(-1) Or c.Offset(, 1) <>
c.Offset(-1, 1) Or c.Offset(, 2) <> c.Offset(-1, 2) Then


If b Then
c.EntireRow.Insert
i = i + 1
c.Offset(-1, 6).FormulaR1C1
= "=SUM(R[-1]C[-1]:R[" & -j & "]C[-1])"

j = 0
Else
b = True
End If
Else
' j = j + 1
End If
i = i + 1
Loop Until IsEmpty(Ref.Offset(i))
c.Offset(1, 6).FormulaR1C1 = "=SUM(R[-1]C[-1]:R[" & -
(j + 1) & "]C[-1])"

End Sub



Bonjour,

Oui c'est très clair.
Oui, je connais le code.

Mais je vais profiter de ta question pour donner ici un
avis tout à fait


personnel qui ne concerne pas que toi.

A la place de demander à d'autres de faire un truc
aussi simple, pourquoi ne


pas essayer de le faire par toi-même en t'aidant de
l'enregistreur de macros


et de l'aide, puis de venir ici pour poser des
questions limitées et


précises lorsque tu rencontres une difficulté?

Cela t'apporterais la satisfaction de la découverte et
le plaisir de


l'apprentissage constructif . Les connaissances
acquises le serait de façon


durable et le plaisir de t'aider des cerveaux
chevronnés serait décuplé de


te voir faire un minimum d'effort au lieu d'attendre
que d'autres te machent


le boulot.

Ceci étant, je le rappelle, un avis tout à fait
personnel et heureusement


pour toi, pas partagé de tous ;-)

Paul V.

Franck wrote:
Bonjour,

Je fais appel aux cerveaux chevronnés du MPFE

Je voudrais concevoir une macro exécutant la tache
suivante.

Balayer ligne par ligne les valeurs des colonnes J,
K, L



de ma feuille.
Dès qu'une valeur (des trois colonnes) diffère de
celles



de la ligne précédente, il faut insérer une ligne au
dessus de la ligne différente.
En cellule P de la ligne insérée il faut faire la
somme



des valeurs en O du pavé précédent (entre deux
insertions).




Est-ce clair ?

Est ce que quelqu'un a une idée du code ?

Merci d'avance

Franck



--
Cordialement,

Michel Gaboly
http://www.gaboly.com


.




--
Cordialement,

Michel Gaboly
http://www.gaboly.com




1 2