Denombrement des cellules dont le contenu se repete

Bonsoir

j'ai bricolé un petit code qui marche tres bien pour trouver des repetitions de valeurs dans une meme colonne en utilisant la notion de tableau , celui ci marche tres bien dans le cas ou un et un seul element d'une cellule se repete plusieurs fois , par contre si plusieurs elements se repetent cela ne marche pas .ca marche par exemple avec la liste suivante :

a

g

z

t

v

a

a

ici le code va me dire que j'ai trois "a" donc tout va bien

par contre si j'ai

a

g

z

t

g

a

a

avec 3 "a" et 2"g" ca coince , comment faire au niveau de mon code pour corriger cet aleas , Merci pour toute réponse

Option Base 1
Sub recherche_valeurs_repetitives()
Dim tablo() As Variant
Dim i, j, n As Integer

ReDim tablo(1 To Range("A65536").End(xlUp).Row)
 For i = 1 To Range("A65536").End(xlUp).Row
   tablo(i) = Cells(i, 1).Value
 Next

 For i = 1 To Range("A65536").End(xlUp).Row
   For j = 1 To Range("A65536").End(xlUp).Row
     If tablo(i) = tablo(j) And i <> j And i > j And tablo(i) <> "" And tablo(j) <> "" Then
        n = n + 1
       End If
   Next
 Next
MsgBox "il y a" & " " & (Sqr(1 + 8 * n) + 1) / 2 & " " & "nombres identiques"
End Sub

Hello,

Une piste

Tu peux par exemple, récupérer la fonction Excel SOMME.SI dans V.B.A. ou te passer de calculer sur V.B.A., tout faire sur Excel et d'afficher un message seulement sur un événement de changement de valeur. Voir ma P.J.

Dans V.B.A. en adressage R1C1, ça donne :

Range("H2").FormulaR1C1 = "=SUMIFS(R2C2:R8C2,R2C1:R8C1,R[-1]C)"

10somme-si.xlsm (10.82 Ko)

Bonjour,

Pour le "fun", un comptage entièrement VBA...

Sub recherche_valeurs_repetitives()
    Dim tablo(), tabr, i%, j%, n%, msg$
    n = Range("A65536").End(xlUp).Row
    ReDim tablo(n)
    For i = 1 To n
        tablo(i) = Cells(i, 1).Value
    Next i
    For i = 1 To n - 1
        For j = i + 1 To n
            If tablo(j) < tablo(i) Then
                tablo(0) = tablo(i)
                tablo(i) = tablo(j)
                tablo(j) = tablo(0)
            End If
        Next j
    Next i
    j = 1
    For i = 2 To n
        If tablo(i) = tablo(i - 1) Then
            j = j + 1
        Else
            If j > 1 Then tabr = tabr & tablo(i - 1) & ";" & j & ";"
            j = 1
        End If
    Next i
    If j > 1 Then tabr = tabr & tablo(i - 1) & ";" & j & ";"
    If tabr <> "" Then
        tabr = Left(tabr, Len(tabr) - 1)
        tabr = Split(tabr, ";")
        msg = "La liste comporte les valeurs suivantes répétées :"
        For i = 0 To UBound(tabr) Step 2
            msg = msg & Chr(10) & tabr(i) & ", " & tabr(i + 1) & " fois"
        Next i
        msg = msg & "."
    Else
        msg = "La liste ne comporte aucune valeur répétée."
    End If
    MsgBox msg, vbInformation, "Recherche de valeurs répétées"
End Sub

Remarques : je me suis quelque peu écarté de ton code pour des raisons diverses, et d'abord parce que j'ai un peu de mal à supporter (et surtout à lire) le code non indenté ou mal indenté, et puis parce que sur un certain nombre de points, je préfère mon style (même si je peux parfois être admiratif devant certaines façon de coder différentes, voire très différentes, de la mienne).

Mais au delà de questions de style, quelques points méritent d'être soulevés :

  • déclarations de variables : le type de chaque variable doit être déclaré individuellement ; toute variable dont le type n'apparaît pas à la suite [As (type) ou caractère de déclaration de type] est de type Variant.
  • Option Base 1 : je ne l'utilise jamais, cela évite des erreurs ultérieures... l'option base par défaut est 0 ; tu n'avais de toute façon pas besoin de cette option en déclarant l'indice minimal lors du dimensionnement. Partir de 0 est une habitude qui se prend vite et le cas échéant, avoir un élément 0 qu'on n'utilise pas n'est guère gênant. Par ailleurs, j'ai pris l'habitude de me servir de cet élément 0 comme variable de switch lors d'un tri du tableau...

Dans le cas d'une telle recherche, le tri permet de regrouper les valeurs identiques à la suite. Il n'y a plus qu'à les compter.

Cordialement

Ferrand

Merci pour cette grande réponse MFerrand , bien que je sois loin de pouvoir coder de la même façon que vous ,ce que vous avez fait est pas mal du tout , cependant j'aimerai comprendre l'utilisation des variables suivantes dans votre déclaration "i%, j%, n%, msg$"

le symbole % signifie quoi ?

Merci


(Merci egalement à Waard pour sa reponse que je vais exploiter aussi )

C'est ce qu'on appelle caractère de déclaration de type.

i% est équivalent à i As Integer, msg$ à msg As String. Il y en a quelques autres : & pour As Long, ! pour As Single, # pour As Double. Cela raccourcit, surtout quand il y en a beaucoup à déclarer à la file.

Cordialement

Merci infiniment pour vos réponses ! une bonne journée à vous

Rechercher des sujets similaires à "denombrement contenu repete"