VBA Excel compter nbre valeur différente

Résolu/Fermé
linette44 Messages postés 23 Date d'inscription dimanche 1 avril 2007 Statut Membre Dernière intervention 20 mai 2008 - 31 oct. 2007 à 15:23
 Fred - 6 août 2014 à 09:10
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

eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 212
1 nov. 2007 à 00:45
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
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.
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 212 > Curieux
16 mars 2009 à 11:06
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
0
Curieux > eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023
16 mars 2009 à 15:19
C'est bien clair...

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


Bonne journée,

Cordialement.
0
BIen joué l'astuce :D
0
eriiic Messages postés 24569 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 28 décembre 2023 7 212
1 nov. 2007 à 22:01
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
4
aminea Messages postés 2 Date d'inscription vendredi 28 septembre 2007 Statut Membre Dernière intervention 1 novembre 2007 1
31 oct. 2007 à 23:57
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
1
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour,
Merci beaucoup eriiic, la formule convient parfaitement
Cordialement
linette44
0