XL 2016 VBA : trouver doublons, triplons, quadruplons, etc...

Phillip

XLDnaute Occasionnel
Bonjour,

je ne trouve pas sur le net ce qui peut correspondre à mon besoin.

J'ai une série de variables (Une vingtaine) calculée dans une macro, et je voudrais savoir s'il y en a une (ou plusieurs!) qui apparait 5 fois (et laquelle !), 4 fois et lesquelles, 3 fois, 2 fois....

la formule Nb.si compte bien les occurences dans une plage, mais il faut déjà savoir ce que l'on cherche, et je veux de toutes façons l'intégrer dans ma macro.

J'ai tenté un array comme dans le code suivant, mais il ne trouve pas la deuxième occurence, et comment faire pour plus de 20 ou 30 variables ?
VB:
Sub nbsi()

VarA = A
VarB = B
VarC = C
VarD = D
VarE = A


Mon_Tableau = Array(0,VarA, VarB, VarC, VarD, VarE)
For i = LBound(Mon_Tableau) To UBound(Mon_Tableau)
    If i = A Then
    totalA = totalA + 1
    End If
Next i

End Sub

J'ai fixé VarA, VarB, etc...dans le code exemple pour simplifier, mais dans mon code réel je ne connais pas à l'avance leur valeur, puisque ce sont des....variables !

Des idées ?

Merci

Cordialement

Phillip
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Phillip,
"i" est un indice numérique, dans votre macro il va de 1 à 5, donc i=A ne se vérifiera jamais.
Donc je pense que vous devez faire : If Mon_Tableau(i)=A
Enuite VarA=A signifie que A est une variable, ce qui n'est pas le cas je pense, donc il faut écrire VarA="A" pour affecter la valeur "A" à la variable VarA, et donc ensuite If Mon_Tableau(i)="A".
Si j'ai bien compris votre idée.
 

Phillip

XLDnaute Occasionnel
Bonjour,

Merci encore de t'être penché sur mes élucubrations VBesques !

Je suis toujours sur mon méga code...Mes variables ne vaudront jamais "A" ou "B", je ne sais pas à l'avance ce qu'elles vaudront...(des nombres probablement), donc je ne peux pas dire VarA="A" ou VarA="22" !

Ensuite, je voudrait que ce bout de code recherche dans mon array (si c'est l'array la solution ?), si la valeur de VarA est présente plus d'une fois, combien de fois, et mettre quelque part (dans une variable), "VarA est présent 3 fois " par exemple....Pareil pour les autres Varx...Il faudrait même que je sache si j'ai plusieurs Varx présents 3 fois (ou 2 ou 5, ou 4...)...Pas simple....

Cordialement

Phillip
 

vgendron

XLDnaute Barbatruc
Hello à tous

déjà.. je pense qu'il y a un pb de langage..
confusion entre le nom de la variable et son contenu...
dans un code VBA: il est impossible d'avoir DEUX (ou plus) Variable avec le MEME nom
sinon bug
par contre.. plusieurs variables peuvent avoir le MEME contenu.

Ensuite, pour clarifier le besoin, il serait bon que tu postes un fichier exemple avec quelques éléments pour qu'on comprenne ce que tu veux compter.. parce que s'il s'agit juste d'avoir la fonction "Nb.si" en vba, il suffit de traduire CountIf..
 

Phillip

XLDnaute Occasionnel
Bonjour,

Difficile de poster un fichier exemple, vu que mon fichier se remplit avec la macro...Je vais essayer d'écrire un code en Français pour expliquer ce que je veux....

VB:
Sub explication()

'Précédemment, La macro se déroule et me sort une vingtaine de variables, qu'on peut appeller Var1 à Var20

'Parmi ces Var1 à 20, plusieurs de leurs valeurs peuvent être en doublon, triplon, quadruplon, très rarement en quintuplon, rarissime en sextuplon...

'par exemple, valeurs au hasard : Var1=20, Var2=45, Var3=45, Var4=20, Var5=45, Var6=78, Var7=89, var8=89...
'Ici j'ai donc la VALEUR 20 deux fois, 45 trois fois, 78 une fois, 89 deux fois...

'Si j'ai une VALEUR de variable en x fois (x allant de 2 à 6), alors
j 'identifie les VARIABLES et je mets dans une autre variable (ou cellule) doublon="var1 et Var4",doublon = "var7 et Var8" triplon="var2 et var3 et Var5"

'etc....


End Sub

A part un array, je n'ai pas d'idée, et pas d'idée comment le coder...

merci

Cordialement
 

vgendron

XLDnaute Barbatruc
une idée avec un dictionnaire..je te laisse chercher les syntaxes exactes
les clés sont les valeurs (10 20 45..) et la valeur de la clé: le nombre d'occurence recherchée..

for each NomVar in array(Var1, Var2, Var3....) 'pour chaque variable
if mondico.exists(valeur) then 'si la valeur existe déjà dans le dictionnaire
Mondico(valeur)=MonDico(Valeur+1) 'tu incrémentes son occurence
else
mondico.add valeur,1 'sinon tu créés l'entrée dans le dico avec 1 pour valeur initiale (puisque c'est la première fois)
end if
 

vgendron

XLDnaute Barbatruc
Bon.. il va vraiment falloir un fichier exemple.. sinon on ne va pas s'en sortir..

tes Variables "VarA, VarB, VarC...;"
il y en a combien ? est ce que tu les définis dans le code VBA en dur (DONC tu sais combien il y en a, et tu connais leur NOM
ou est ce que tu les définis de manière dynamique (je sais que c'est possible.. mais ne sais pas comment) ==> Donc tu ne sais pas, à l'avance, combien il y en a: et leur nom non plus..
 

Phillip

XLDnaute Occasionnel
Compliqué de donner un fichier exemple simple qui reflète la réalité. Je fais tout un tas d'opérations Sur une entrée dans un fichier qui me sort des variables...

En effet, je définis en dur le nom des variables, je sais combien il y en a et comment elles s'appellent, ça ne change jamais. Ce qui change, c'est leur valeur en fonction de l'entrée de mon fichier...

Je peux en revanche donner mon fichier original en MP ?
 

Phillip

XLDnaute Occasionnel
C'est exactement ce que je veux ! J'aurais préféré ne pas aller chercher mes valeurs dans mon tableau excel avec le code
VB:
For i = 0 To 4
    Mon_Tableau(i) = Range("B" & i + 2)
Next i
Mais plutôt dynamiquement dans les valeurs des variables dans la macro, mais je vais essayer de m'adapter et reviendrai vers vous si ça ne marche pas avec mon fichier original !

Merci Encore !

Cordialement
 

Rhysand

XLDnaute Junior
Bon après-midi à tous,

un exemple de savoir combien d'occurrences de données existent dans un tableau ou dans une sélection

est requis reference : “Microsoft Scripting Runtime”

dans mon exemple les résultats seront écrits sur la feuille dans l'intervalle (P: Q)

VB:
Option Explicit

Public Sub countNumberOfOcurrences(searchData As Range, showOcurrences As Range)

Dim xdic As New Scripting.Dictionary
Dim rng As Range
Dim xStr As Variant

For Each rng In searchData
    If rng <> "" Then
        If xdic.Exists(rng.Value) Then
            xdic(rng.Value) = xdic(rng.Value) + 1
        Else
            xdic.Add rng.Value, 1
        End If
    End If
Next rng

showOcurrences = "Valeur recherchée"
showOcurrences.Interior.Color = &HE0E0E0
showOcurrences.Offset(, 1) = "Nombre total d'occurrences"
showOcurrences.Offset(, 1).Interior.Color = &HE0E0E0
Set rng = showOcurrences.Offset(1)

For Each xStr In xdic.Keys
    rng = xStr
    rng.Offset(, 1) = xdic(xStr)
    Set rng = rng.Offset(1)
Next

ActiveSheet.Columns("P:Q").AutoFit

If Not rng Is Nothing Then Set rng = Nothing

End Sub

Private Sub CommandButton2_Click()

Application.ThisWorkbook.Worksheets("Feuille1").Activate

Dim myTable As ListObject
Set myTable = ActiveSheet.ListObjects("Tabela1")

' dans le cas d'une table
countNumberOfOcurrences myTable.DataBodyRange, Application.ThisWorkbook.Worksheets("Feuille1").Range("P1")

' en cas de sélection
'countNumberOfOcurrences Application.ThisWorkbook.Worksheets("Feuille1").Range("A5:M25"), Application.ThisWorkbook.Worksheets("Feuille1").Range("P1")

If Not myTable Is Nothing Then Set myTable = Nothing

End Sub
 

Statistiques des forums

Discussions
311 723
Messages
2 081 932
Membres
101 844
dernier inscrit
pktla