1) Copiez le code dans un module standard '************ Sub PMO_TriGroupCompt() Dim R As Range Dim bool As Boolean Dim var Dim var2 Dim i& Dim j& Dim n& Dim S As Worksheet Dim V() Dim T&() Dim T2() Set R = Range(Selection.Address) If R.Rows.Count = 1 Or R.Columns.Count > 1 Then Exit Sub var = R For i& = 1 To UBound(var, 1) If Not IsEmpty(var(i&, 1)) Then bool = True Exit For End If Next i& If Not bool Then Exit Sub Set S = Sheets.Add Set R = Range(Cells(1, 1), Cells(UBound(var, 1), 1)) R = var R.Sort key1:=[a1], order1:=xlAscending Set R = R.Resize(R.Rows.Count + 1, 1) var2 = R n& = 1 For i& = 1 To UBound(var, 1) If i& = UBound(var2, 1) Then Exit For If var2(i&, 1) <> (var2(i& + 1, 1)) Then j& = j& + 1 ReDim Preserve V(1 To j&) V(j&) = var2(i&, 1) ReDim Preserve T&(1 To j&) T&(j&) = n& n& = 0 End If n& = n& + 1 Next i& ReDim T2(1 To UBound(V) + 1, 1 To 2) T2(1, 1) = "Valeurs" T2(1, 2) = "Effectifs" For i& = 1 To UBound(V) T2(i& + 1, 1) = V(i&) T2(i& + 1, 2) = T&(i&) Next i& Range(Cells(1, 1), Cells(UBound(var, 1), 1)) = var Range(Cells(1, 3), Cells(UBound(T2, 1), 4)) = T2 End Sub '************
2) Cette macro ne fonctionne qu'avec une sélection sur une SEULE colonne. Supposons vos données en A3:A227. Sélectionnez cette plage et lancez la macro PMO_TriGroupCompt
3) Une nouvelle feuille apparaît avec en colonne A les données d'origine en colonne C les valeurs en ordre croissant en colonne D le nombre total de chaque valeur Si des cellules de la plage sélectionnée sont vides, elles ne sont pas comptabilisées.
Cordialement. -- PMO Patrick Morange
Bonjour à tous,
Je souhaiterais calculer automatiquement des effectifs sur une série de valeurs et les classer par ordre croissant
Exemple :
Sur cette plage de valeurs : 2 3 4 5 4 3 2 4 etc.
Résultat souhaité
Valeurs effectifs 2 2 3 2 4 3 5 1 etc.
Merci
Bonjour,
Une piste avec le code ci-dessous
1) Copiez le code dans un module standard
'************
Sub PMO_TriGroupCompt()
Dim R As Range
Dim bool As Boolean
Dim var
Dim var2
Dim i&
Dim j&
Dim n&
Dim S As Worksheet
Dim V()
Dim T&()
Dim T2()
Set R = Range(Selection.Address)
If R.Rows.Count = 1 Or R.Columns.Count > 1 Then Exit Sub
var = R
For i& = 1 To UBound(var, 1)
If Not IsEmpty(var(i&, 1)) Then
bool = True
Exit For
End If
Next i&
If Not bool Then Exit Sub
Set S = Sheets.Add
Set R = Range(Cells(1, 1), Cells(UBound(var, 1), 1))
R = var
R.Sort key1:=[a1], order1:=xlAscending
Set R = R.Resize(R.Rows.Count + 1, 1)
var2 = R
n& = 1
For i& = 1 To UBound(var, 1)
If i& = UBound(var2, 1) Then Exit For
If var2(i&, 1) <> (var2(i& + 1, 1)) Then
j& = j& + 1
ReDim Preserve V(1 To j&)
V(j&) = var2(i&, 1)
ReDim Preserve T&(1 To j&)
T&(j&) = n&
n& = 0
End If
n& = n& + 1
Next i&
ReDim T2(1 To UBound(V) + 1, 1 To 2)
T2(1, 1) = "Valeurs"
T2(1, 2) = "Effectifs"
For i& = 1 To UBound(V)
T2(i& + 1, 1) = V(i&)
T2(i& + 1, 2) = T&(i&)
Next i&
Range(Cells(1, 1), Cells(UBound(var, 1), 1)) = var
Range(Cells(1, 3), Cells(UBound(T2, 1), 4)) = T2
End Sub
'************
2) Cette macro ne fonctionne qu'avec une sélection sur une
SEULE colonne.
Supposons vos données en A3:A227.
Sélectionnez cette plage et lancez la macro PMO_TriGroupCompt
3) Une nouvelle feuille apparaît avec
en colonne A les données d'origine
en colonne C les valeurs en ordre croissant
en colonne D le nombre total de chaque valeur
Si des cellules de la plage sélectionnée sont vides, elles ne sont
pas comptabilisées.
Cordialement.
--
PMO
Patrick Morange
Bonjour à tous,
Je souhaiterais calculer automatiquement des effectifs sur une série de
valeurs et les classer par ordre croissant
1) Copiez le code dans un module standard '************ Sub PMO_TriGroupCompt() Dim R As Range Dim bool As Boolean Dim var Dim var2 Dim i& Dim j& Dim n& Dim S As Worksheet Dim V() Dim T&() Dim T2() Set R = Range(Selection.Address) If R.Rows.Count = 1 Or R.Columns.Count > 1 Then Exit Sub var = R For i& = 1 To UBound(var, 1) If Not IsEmpty(var(i&, 1)) Then bool = True Exit For End If Next i& If Not bool Then Exit Sub Set S = Sheets.Add Set R = Range(Cells(1, 1), Cells(UBound(var, 1), 1)) R = var R.Sort key1:=[a1], order1:=xlAscending Set R = R.Resize(R.Rows.Count + 1, 1) var2 = R n& = 1 For i& = 1 To UBound(var, 1) If i& = UBound(var2, 1) Then Exit For If var2(i&, 1) <> (var2(i& + 1, 1)) Then j& = j& + 1 ReDim Preserve V(1 To j&) V(j&) = var2(i&, 1) ReDim Preserve T&(1 To j&) T&(j&) = n& n& = 0 End If n& = n& + 1 Next i& ReDim T2(1 To UBound(V) + 1, 1 To 2) T2(1, 1) = "Valeurs" T2(1, 2) = "Effectifs" For i& = 1 To UBound(V) T2(i& + 1, 1) = V(i&) T2(i& + 1, 2) = T&(i&) Next i& Range(Cells(1, 1), Cells(UBound(var, 1), 1)) = var Range(Cells(1, 3), Cells(UBound(T2, 1), 4)) = T2 End Sub '************
2) Cette macro ne fonctionne qu'avec une sélection sur une SEULE colonne. Supposons vos données en A3:A227. Sélectionnez cette plage et lancez la macro PMO_TriGroupCompt
3) Une nouvelle feuille apparaît avec en colonne A les données d'origine en colonne C les valeurs en ordre croissant en colonne D le nombre total de chaque valeur Si des cellules de la plage sélectionnée sont vides, elles ne sont pas comptabilisées.
Cordialement. -- PMO Patrick Morange
Bonjour à tous,
Je souhaiterais calculer automatiquement des effectifs sur une série de valeurs et les classer par ordre croissant
Exemple :
Sur cette plage de valeurs : 2 3 4 5 4 3 2 4 etc.
Résultat souhaité
Valeurs effectifs 2 2 3 2 4 3 5 1 etc.
Merci
Did
Merci, à vous la première méthode fonctionne =NB.SI($A$1:$A$8;E1) ' E1 contient 2
pas la seconde, =FREQUENCE(A1:A8;E8:E12) ' E8:E12 contient 2,3,4,5,6
(pas su faire marcher) et pas testé la 3ème
Quoi qu'il en soit il faut passer par une première étape de tri par ordre croissant puis virer les doublons Pratiquement on a aussi vite fait de le faire à la main, non ?
cordialement
"JB" a écrit dans le message de news:
Bonjour,
http://cjoint.com/?mvrTTGtRfj
A1:A8 est le champ qui contient les valeurs de départ:
Merci, à vous
la première méthode fonctionne =NB.SI($A$1:$A$8;E1) ' E1
contient 2
pas la seconde, =FREQUENCE(A1:A8;E8:E12) ' E8:E12 contient 2,3,4,5,6
(pas su faire marcher) et pas testé la 3ème
Quoi qu'il en soit il faut passer par une première étape de tri par ordre
croissant puis virer les doublons
Pratiquement on a aussi vite fait de le faire à la main, non ?
cordialement
"JB" <boisgontier@hotmail.com> a écrit dans le message de news:
1135183781.446809.148800@o13g2000cwo.googlegroups.com...
Bonjour,
http://cjoint.com/?mvrTTGtRfj
A1:A8 est le champ qui contient les valeurs de départ:
Merci, à vous la première méthode fonctionne =NB.SI($A$1:$A$8;E1) ' E1 contient 2
pas la seconde, =FREQUENCE(A1:A8;E8:E12) ' E8:E12 contient 2,3,4,5,6
(pas su faire marcher) et pas testé la 3ème
Quoi qu'il en soit il faut passer par une première étape de tri par ordre croissant puis virer les doublons Pratiquement on a aussi vite fait de le faire à la main, non ?
cordialement
"JB" a écrit dans le message de news:
Bonjour,
http://cjoint.com/?mvrTTGtRfj
A1:A8 est le champ qui contient les valeurs de départ: