OVH Cloud OVH Cloud

Opérations sur les plages?

5 réponses
Avatar
JM
Bonjours à tous,
Je n'arrive pas à obtenir des opérations sur une plage de cellules. Par
exemple, j'aimerais connaitre le maximum, le minimum, le nb de valeur ainsi
que la somme d'une plage. Cette dernière n'est tout simplement qu'une
portion de colonne.

Avec Excel pas de pb. Mais j'aimerais pouvoir le faire en VBA. J'ai aussi
pensé aux TCD mais comme je ne suis pas très à l'aise (lisez pas à l'aise
pan toutte), donc je m'abstient.

Mon fichier a l'air de ce qui suit:
Nom Prénom Date Prix
A B 050502 1.00
A B 050503 2.00
A B 050504 2.50
C D 050502 1.50
C D 050503 2.50
etc

J'aimerais obtenir ce qui suit:
Nom Prénom Début Fin PrixTotal
A B 050502 050504 5.50
C D 050502 050503 4.00

Merci d'avance pour tous vos éclaircissements

Jean-Marc

5 réponses

Avatar
ChrisV
Bonjour JM,

Avec les plages nommées suivantes (selon les données de ton exemple)
A1:A6 (noM), C1:C6 (dtE), D1:D6 (prX) et A1:B6 (nPr)

Sub zaza()
Application.ScreenUpdating = False
Set wsRes = ActiveWorkbook.Worksheets.Add(, ActiveSheet)
With wsRes
.Name = "Conso"
.[c1:E1] = [{"Début","Fin","Prix Total"}]
End With
[nPr].AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=[A1], Unique:=True
[C2].FormulaArray = "=MIN(IF(noM=RC[-2],dtE))"
[D2].FormulaArray = "=MAX(IF(noM=RC[-3],dtE))"
[E2].FormulaArray = "=SUM(IF(noM=RC[-4],prX))"
[C2:E2].AutoFill Destination:=Range("C2:E" & [A65536].End(xlUp).Row)
Set wsRes = Nothing
End Sub


ChrisV


"JM" a écrit dans le message de news:
RIMme.6967$
Bonjours à tous,
Je n'arrive pas à obtenir des opérations sur une plage de cellules. Par
exemple, j'aimerais connaitre le maximum, le minimum, le nb de valeur
ainsi que la somme d'une plage. Cette dernière n'est tout simplement
qu'une portion de colonne.

Avec Excel pas de pb. Mais j'aimerais pouvoir le faire en VBA. J'ai
aussi pensé aux TCD mais comme je ne suis pas très à l'aise (lisez pas à
l'aise pan toutte), donc je m'abstient.

Mon fichier a l'air de ce qui suit:
Nom Prénom Date Prix
A B 050502 1.00
A B 050503 2.00
A B 050504 2.50
C D 050502 1.50
C D 050503 2.50
etc

J'aimerais obtenir ce qui suit:
Nom Prénom Début Fin PrixTotal
A B 050502 050504 5.50
C D 050502 050503 4.00

Merci d'avance pour tous vos éclaircissements

Jean-Marc



Avatar
JM
Merci ChrisV pour ta réponse!

Je la trouve fantastique. J'y apprends un tas de cossin dont je n'avais nul
soupçon.

Bon, elle ne fonctionne pas correctement mais il y a là beaucoup de matière
à explorer et quelques petits (je l'espere) ajustements pour obtenir le
produit fini dont j'ai besoin.

Entre autre chose, 1)le prix est indiqué dans un format étrange comme si
c'était une date;2)les dates minimum et maximum de chaque personne ne sont
pas là mais plutot la date de naissance de la premiere personne tout
partout.

Je triture un peu ton truc pour voir si je peux me débrouiller sinon je vous
relance.
Merci beaucoup

Jean-Marc

"ChrisV" a écrit dans le message de news:

Bonjour JM,

Avec les plages nommées suivantes (selon les données de ton exemple)
A1:A6 (noM), C1:C6 (dtE), D1:D6 (prX) et A1:B6 (nPr)

Sub zaza()
Application.ScreenUpdating = False
Set wsRes = ActiveWorkbook.Worksheets.Add(, ActiveSheet)
With wsRes
.Name = "Conso"
.[c1:E1] = [{"Début","Fin","Prix Total"}]
End With
[nPr].AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=[A1], Unique:=True
[C2].FormulaArray = "=MIN(IF(noM=RC[-2],dtE))"
[D2].FormulaArray = "=MAX(IF(noM=RC[-3],dtE))"
[E2].FormulaArray = "=SUM(IF(noM=RC[-4],prX))"
[C2:E2].AutoFill Destination:=Range("C2:E" & [A65536].End(xlUp).Row)
Set wsRes = Nothing
End Sub


ChrisV


"JM" a écrit dans le message de news:
RIMme.6967$
Bonjours à tous,
Je n'arrive pas à obtenir des opérations sur une plage de cellules. Par
exemple, j'aimerais connaitre le maximum, le minimum, le nb de valeur
ainsi que la somme d'une plage. Cette dernière n'est tout simplement
qu'une portion de colonne.

Avec Excel pas de pb. Mais j'aimerais pouvoir le faire en VBA. J'ai
aussi pensé aux TCD mais comme je ne suis pas très à l'aise (lisez pas à
l'aise pan toutte), donc je m'abstient.

Mon fichier a l'air de ce qui suit:
Nom Prénom Date Prix
A B 050502 1.00
A B 050503 2.00
A B 050504 2.50
C D 050502 1.50
C D 050503 2.50
etc

J'aimerais obtenir ce qui suit:
Nom Prénom Début Fin PrixTotal
A B 050502 050504 5.50
C D 050502 050503 4.00

Merci d'avance pour tous vos éclaircissements

Jean-Marc







Avatar
ChrisV
Bonjour JM,

La proc. s'appuie sur les données de ton exemple initiale et renvoie chez
moi les résultats escomptés...
Le "décalage" du résultat attendu des formules est probablement dû à
l'organisation de tes données qui doit être en définitive quelque peu
différente (par ex. la date de naissance dont tu ne parlais pas lors de ton
précédent post...).
D'autre part, les dates sont formatées chez moi, sous la forme jj/mm/aa.

N'hésite pas à relancer en cas de problème d'adaptation...
Si les données ne sont pas confidentielles, tu peux m'envoyer directement en
bal perso un extrait de ton fichier.


ChrisV


"JM" a écrit dans le message de news:
Ty%me.8510$
Merci ChrisV pour ta réponse!

Je la trouve fantastique. J'y apprends un tas de cossin dont je n'avais
nul soupçon.

Bon, elle ne fonctionne pas correctement mais il y a là beaucoup de
matière à explorer et quelques petits (je l'espere) ajustements pour
obtenir le produit fini dont j'ai besoin.

Entre autre chose, 1)le prix est indiqué dans un format étrange comme si
c'était une date;2)les dates minimum et maximum de chaque personne ne sont
pas là mais plutot la date de naissance de la premiere personne tout
partout.

Je triture un peu ton truc pour voir si je peux me débrouiller sinon je
vous relance.
Merci beaucoup

Jean-Marc

"ChrisV" a écrit dans le message de news:

Bonjour JM,

Avec les plages nommées suivantes (selon les données de ton exemple)
A1:A6 (noM), C1:C6 (dtE), D1:D6 (prX) et A1:B6 (nPr)

Sub zaza()
Application.ScreenUpdating = False
Set wsRes = ActiveWorkbook.Worksheets.Add(, ActiveSheet)
With wsRes
.Name = "Conso"
.[c1:E1] = [{"Début","Fin","Prix Total"}]
End With
[nPr].AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=[A1], Unique:=True
[C2].FormulaArray = "=MIN(IF(noM=RC[-2],dtE))"
[D2].FormulaArray = "=MAX(IF(noM=RC[-3],dtE))"
[E2].FormulaArray = "=SUM(IF(noM=RC[-4],prX))"
[C2:E2].AutoFill Destination:=Range("C2:E" & [A65536].End(xlUp).Row)
Set wsRes = Nothing
End Sub


ChrisV


"JM" a écrit dans le message de news:
RIMme.6967$
Bonjours à tous,
Je n'arrive pas à obtenir des opérations sur une plage de cellules. Par
exemple, j'aimerais connaitre le maximum, le minimum, le nb de valeur
ainsi que la somme d'une plage. Cette dernière n'est tout simplement
qu'une portion de colonne.

Avec Excel pas de pb. Mais j'aimerais pouvoir le faire en VBA. J'ai
aussi pensé aux TCD mais comme je ne suis pas très à l'aise (lisez pas à
l'aise pan toutte), donc je m'abstient.

Mon fichier a l'air de ce qui suit:
Nom Prénom Date Prix
A B 050502 1.00
A B 050503 2.00
A B 050504 2.50
C D 050502 1.50
C D 050503 2.50
etc

J'aimerais obtenir ce qui suit:
Nom Prénom Début Fin PrixTotal
A B 050502 050504 5.50
C D 050502 050503 4.00

Merci d'avance pour tous vos éclaircissements

Jean-Marc











Avatar
JM
Bonjour ChrisV
J'ai beau tenter de triturer un tantinet, pouff. Ca ne tient pas! Voici le
code maintenant traffiqué que tu m'as si gentiment envoyé. Plus bas, tu
trouveras copie conforme de mon fichier d'essai Excel et aussi ce que
j'aimerais obtenir comme produit final. Merci pour ta patience.
rem basÞrniere cellule active
Dim oNom, oDate, oPrx, oNP, wres
Set oNom = Range("A1:A" & bas)
Set oDate = Range("D1:D" & bas)
Set oPrx = Range("E1:E" & bas)
Set oNP = Range("A1:C" & bas)

Application.ScreenUpdating = False
Set wsRes = ActiveWorkbook.Worksheets.Add(, ActiveSheet)
With wsRes
.Name = "État de compte"
.[A1:G1] = [{"Nom","Prénom","Naissance","Début","Fin","Nombre","Prix
Total"}]
End With
[oNP].AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=[A2], Unique:=True
[D2].FormulaArray = "=MIN(IF(onoM=RC[-3],odate))"
[E2].FormulaArray = "=MAX(IF(onoM=RC[-4],odate))"
[F2].FormulaArray = "=NB(IF(onoM=RC[-5],odate))"
[G2].FormulaArray = "=SUM(IF(onoM=RC[-6],prX))"
[D2:G2].AutoFill Destination:=Range("D2:G" & [A65536].End(xlUp).Row)
Set wsRes = Nothing
**************************************************************
Fichier d'essai

A B C D E
a b 501221 050521 1.00$
a b 501221 050522 2.00$
a b 501221 050523 3.00$
d e 510122 050522 2.50$
d e 510122 050529 2.50$
e f 520325 050501 1.00$
e f 520325 050502 1.00$
e f 520325 050503 1.00$
e f 520325 050504 1.00$

Voici ce que j'aimerais obtenir
Nom Pre DDN Deb Fin Nbre Prx
a b 501221 050521 050523 3 6.00$
d e 510122 050522 050529 2 5.00$
e f 520325 050501 050504 4 4.00$
_____
9
15.00$

Merci beaucoup
Jean-Marc





"ChrisV" a écrit dans le message de news:
%23I$
Bonjour JM,

La proc. s'appuie sur les données de ton exemple initiale et renvoie chez
moi les résultats escomptés...
Le "décalage" du résultat attendu des formules est probablement dû à
l'organisation de tes données qui doit être en définitive quelque peu
différente (par ex. la date de naissance dont tu ne parlais pas lors de
ton précédent post...).
D'autre part, les dates sont formatées chez moi, sous la forme jj/mm/aa.

N'hésite pas à relancer en cas de problème d'adaptation...
Si les données ne sont pas confidentielles, tu peux m'envoyer directement
en bal perso un extrait de ton fichier.


ChrisV


"JM" a écrit dans le message de news:
Ty%me.8510$
Merci ChrisV pour ta réponse!

Je la trouve fantastique. J'y apprends un tas de cossin dont je n'avais
nul soupçon.

Bon, elle ne fonctionne pas correctement mais il y a là beaucoup de
matière à explorer et quelques petits (je l'espere) ajustements pour
obtenir le produit fini dont j'ai besoin.

Entre autre chose, 1)le prix est indiqué dans un format étrange comme si
c'était une date;2)les dates minimum et maximum de chaque personne ne
sont pas là mais plutot la date de naissance de la premiere personne tout
partout.

Je triture un peu ton truc pour voir si je peux me débrouiller sinon je
vous relance.
Merci beaucoup

Jean-Marc

"ChrisV" a écrit dans le message de news:

Bonjour JM,

Avec les plages nommées suivantes (selon les données de ton exemple)
A1:A6 (noM), C1:C6 (dtE), D1:D6 (prX) et A1:B6 (nPr)

Sub zaza()
Application.ScreenUpdating = False
Set wsRes = ActiveWorkbook.Worksheets.Add(, ActiveSheet)
With wsRes
.Name = "Conso"
.[c1:E1] = [{"Début","Fin","Prix Total"}]
End With
[nPr].AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=[A1], Unique:=True
[C2].FormulaArray = "=MIN(IF(noM=RC[-2],dtE))"
[D2].FormulaArray = "=MAX(IF(noM=RC[-3],dtE))"
[E2].FormulaArray = "=SUM(IF(noM=RC[-4],prX))"
[C2:E2].AutoFill Destination:=Range("C2:E" & [A65536].End(xlUp).Row)
Set wsRes = Nothing
End Sub


ChrisV


"JM" a écrit dans le message de news:
RIMme.6967$
Bonjours à tous,
Je n'arrive pas à obtenir des opérations sur une plage de cellules.
Par exemple, j'aimerais connaitre le maximum, le minimum, le nb de
valeur ainsi que la somme d'une plage. Cette dernière n'est tout
simplement qu'une portion de colonne.

Avec Excel pas de pb. Mais j'aimerais pouvoir le faire en VBA. J'ai
aussi pensé aux TCD mais comme je ne suis pas très à l'aise (lisez pas
à l'aise pan toutte), donc je m'abstient.

Mon fichier a l'air de ce qui suit:
Nom Prénom Date Prix
A B 050502 1.00
A B 050503 2.00
A B 050504 2.50
C D 050502 1.50
C D 050503 2.50
etc

J'aimerais obtenir ce qui suit:
Nom Prénom Début Fin PrixTotal
A B 050502 050504 5.50
C D 050502 050503 4.00

Merci d'avance pour tous vos éclaircissements

Jean-Marc















Avatar
ChrisV
Re...

Selon les nouvelles données de ton "fichier essai"...

Sub zaza()
Dim derL As Long
Dim aSh As String
Application.ScreenUpdating = False
aSh = ActiveSheet.Name
[1:1].Insert
[A1:C1] = [{"Nom","Pre","DDN"}]
dL = [A1].End(xlDown).Row
Range("A1:C" & dL).Name = "Zn"
Range("D1:D" & dL).Name = "dtE"
Range("E1:E" & dL).Name = "prX"
Range("A1:A" & dL).Name = "noM"
Set wsRes = ActiveWorkbook.Worksheets.Add(, ActiveSheet)
[Zn].AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=[A1], Unique:=True
With wsRes
.Name = "État de compte"
.[D1:G1] = [{"Deb","Fin","Nbre","Prx"}]
End With
derL = [A65536].End(xlUp).Row
[D2].FormulaArray = "=MIN(IF(noM=RC[-3],dtE))"
[E2].FormulaArray = "=MAX(IF(noM=RC[-4],dtE))"
[F2].FormulaR1C1 = "=COUNTIF(noM,""=""&RC[-5])"
[G2].FormulaArray = "=SUM(IF(noM=RC[-6],prX))"
[D2:G2].AutoFill Destination:=Range("D2:G" & derL)
Range("F" & 1 + derL & ":G" & 1 + derL) _
.FormulaR1C1 = "=SUM(R[-3]C:R[-1]C)"
With Sheets(aSh)
.Rows(1).Delete
.Select
End With
inF = MsgBox("Traitement effectué...!", vbExclamation, _
"Création de l'état de compte...")
Set wsRes = Nothing
End Sub


ChrisV


"JM" a écrit dans le message de news:
osqne.9228$
Bonjour ChrisV
J'ai beau tenter de triturer un tantinet, pouff. Ca ne tient pas! Voici le
code maintenant traffiqué que tu m'as si gentiment envoyé. Plus bas, tu
trouveras copie conforme de mon fichier d'essai Excel et aussi ce que
j'aimerais obtenir comme produit final. Merci pour ta patience.
rem basÞrniere cellule active
Dim oNom, oDate, oPrx, oNP, wres
Set oNom = Range("A1:A" & bas)
Set oDate = Range("D1:D" & bas)
Set oPrx = Range("E1:E" & bas)
Set oNP = Range("A1:C" & bas)

Application.ScreenUpdating = False
Set wsRes = ActiveWorkbook.Worksheets.Add(, ActiveSheet)
With wsRes
.Name = "État de compte"
.[A1:G1] =
[{"Nom","Prénom","Naissance","Début","Fin","Nombre","Prix Total"}]
End With
[oNP].AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=[A2], Unique:=True
[D2].FormulaArray = "=MIN(IF(onoM=RC[-3],odate))"
[E2].FormulaArray = "=MAX(IF(onoM=RC[-4],odate))"
[F2].FormulaArray = "=NB(IF(onoM=RC[-5],odate))"
[G2].FormulaArray = "=SUM(IF(onoM=RC[-6],prX))"
[D2:G2].AutoFill Destination:=Range("D2:G" & [A65536].End(xlUp).Row)
Set wsRes = Nothing
**************************************************************
Fichier d'essai

A B C D E
a b 501221 050521 1.00$
a b 501221 050522 2.00$
a b 501221 050523 3.00$
d e 510122 050522 2.50$
d e 510122 050529 2.50$
e f 520325 050501 1.00$
e f 520325 050502 1.00$
e f 520325 050503 1.00$
e f 520325 050504 1.00$

Voici ce que j'aimerais obtenir
Nom Pre DDN Deb Fin Nbre Prx
a b 501221 050521 050523 3 6.00$
d e 510122 050522 050529 2 5.00$
e f 520325 050501 050504 4 4.00$

_____
9 15.00$

Merci beaucoup
Jean-Marc