VBA Excel compter nbre valeur différente

[Résolu/Fermé]
Signaler
Messages postés
23
Date d'inscription
dimanche 1 avril 2007
Statut
Membre
Dernière intervention
20 mai 2008
-
 Fred -
Bonjour,
Je cherche un code VBA qui me permettrait de compter le nombre de valeur différente dans une colonne.
Exemple : Colonne A
Valeur :
A2 : 10,
A3 : 20,
A4 : 10,
A5 : 15,
A6 : 20
Résultat en A1 : 3 (valeurs différentes)
Merci de votre aide
Cordialement
linette44

5 réponses

Messages postés
24182
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
19 septembre 2021
6 886
Bonsoir,

Un code VBA absolument ? Sinon une autre solution par formule:
en B2: =1/NB.SI($A$2:$A$6;A2) à recopier vers le bas
en A1: =SOMME(B2:B6) => 3

ou bien seulement en A1: {=SOMME(1/NB.SI(A2:A6;A2:A6))} à valider par SHIFT+Ctrl+Entrée

eric
9
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 42674 internautes nous ont dit merci ce mois-ci

Salut Eriicc,

Je voulais te demander comment tu as fait pour sortir la formule pour compter des valeurs différentes dans un excel!!

Tu m'as vraiment impressionné!

Si ça ne te dérange pas, pourrais tu m'expliquer la formule...

Je ne comprend pas ce que fait la formule 1/NB.SI(MA PLAGE:MA PLAGE), ainsi que la SOMME en terme de matrice...

Je te remercie d'avance.

Bonne journée.
Messages postés
24182
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
19 septembre 2021
6 886 > Curieux
Bonjour,

il s'agit plus d'une astuce mathématique qu'une astuce excel.
Le but est que si une entrée est présente x fois elle compte pour x fois moins, ce que fait 1/x.
Par exemple si entrée présente 2 fois (donné par le nb.si()) chaque entrée aura un poids de 1/2 (somme=1), 3 fois => 1/3 (somme=1), etc. Soit 1 pour la somme de chaque entrée différente.
Il ne reste plus qu'à faire la somme des 1/x pour avoir le nombre d'entrées.

D'où la formule :
=SOMME(1/NB.SI(A2:A6;A2:A6))
qu'il faut valider en matriciel car certaines fonctions excel ne sont pas matricielles par défaut.

C'est éclairci ?
eric
>
Messages postés
24182
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
19 septembre 2021

C'est bien clair...

Je te remercie pour ta réponse, continue comme ça!


Bonne journée,

Cordialement.
BIen joué l'astuce :D
Messages postés
24182
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
19 septembre 2021
6 886
Re,

Déjà pour la dernière solution il ne faut pas saisie les { }, excel les rajoute si tu fais bien le shift+ctrl+enter.

Reste sur la 1ère à ce moment là et remplace par:
=SI(A2="";"";1/NB.SI($A$2:$A$30;A2))

eric
Messages postés
2
Date d'inscription
vendredi 28 septembre 2007
Statut
Membre
Dernière intervention
1 novembre 2007
1
Bonjour linette44,
Voici une solution possibe:
- Tu crée un tableau dans lequel tu mets les valeurs de ta colonne
- Tu classe les éléments de ce tableau par ordre croissant
- Tu met un compteur qui parcourt le tableau et qui s'incrémente à chaque fois qu'il trouve deux cases successives de valeurs différentes.

Voici le code correspondant:

Sub nombreValeurs()

'Tu crée un tableau où tu va mettre les valeurs de ta colonne
Dim monTableau(5) As String 'tu mets la taille de ton tableau
Dim i, j, n As Integer
Dim myRange As Range
Dim R As Range
i = 0
j = 0
k = 0
n = 1
Set myRange = Range("A2:A6")

For Each R In myRange
    If R.Value <> "" Then '(non vides)
        monTableau(k) = R.Value
        k = k + 1
    End If
Next R

' Tri croissant du tableau
Dim str As String
For i = 0 To UBound(monTableau) - 2
    For j = i + 1 To UBound(monTableau) - 1
        If monTableau(i) > monTableau(j) Then
            str = monTableau(i)
            monTableau(i) = monTableau(j)
            monTableau(j) = str
        End If
    Next j
Next i

'Calcul de n, le nombre de valeurs 
For i = 0 To UBound(monTableau) - 2
    If monTableau(i) <> monTableau(i + 1) Then
       n = n + 1
    End If
Next i

ActiveSheet.Range("A1") = n
End Sub
Bonsoir,
Merci pour tes réponses.
Le fait d'être obligé de créer un tableau avec le code VBA ne m'arrange pas vraiment.
Je vais donc plutôt partir sur les formules.
J'ai testé la 1ère solution avec une formule en B2 et 1 en A1. Cela fonctionne.
Le problème c'est que les données dans la colonne A peuvent varier, de A1 à A30 par exemple. Quand je tire la formule de B2 jusqu'à B30, j'ai un #DIV/0! pour les cellules non renseignées en A et quand je demande la somme en A1, j'ai un #DIV/0! également. Peut-on empêcher ce genre de chose ?

J'ai voulu tester la dernière solution A1: {=SOMME(1/NB.SI(A2:A6;A2:A6))} à valider par SHIFT+Ctrl+Entrée mais je ne dois pas savoir faire. J'ai saisi la formule ci-dessus après la saisie j'ai appuyé sur SHIFT+Ctrl+Entrée en même temps et rien. Peux-tu me dire pourquoi une parenthèse devant la formule et crois-tu que je peux intégrer la validation dans un code VBA ?

Cordialement
linette44
Bonjour,
Merci beaucoup eriiic, la formule convient parfaitement
Cordialement
linette44