VBA Excel compter nbre valeur différente

Résolu
linette44 Messages postés 23 Statut Membre -  
 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
Configuration: Windows XP
Firefox 2.0.0.8

5 réponses

  1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
    1. Curieux
       
      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
      1. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281 > 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
        0
      2. Curieux > eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention  
         
        C'est bien clair...

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


        Bonne journée,

        Cordialement.
        0
    2. Fred
       
      BIen joué l'astuce :D
      0
  2. eriiic Messages postés 24581 Date d'inscription   Statut Contributeur Dernière intervention   7 281
     
    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
  3. aminea Messages postés 2 Statut Membre 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
    
    1
  4. linette44
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

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