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)"
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
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 !