Recherche valeurs unique

galpha

XLDnaute Nouveau
Bonjour,

j'ai fait un macro qui va calculer le nombre de valeurs uniques selon plusieurs critères. Exemple:

Code:
Dim Zpn2ATraiterNonClot As New Collection

       If InStr(UCase(Cells(lignes, search("GRAPHE CLOT")).Value), UCase("Analyse")) Then
            If (Cells(lignes, search("Pose Materiel Majeur")).Value = "1") And ((UCase(Cells(lignes, search("ZPN2")).Value)) <> "C") Then
                Zpn2ATraiterNonClot.Add Cells(lignes, search("Graphe")).Value, CStr(Cells(lignes, search("Graphe")).Value)
                On Error Resume Next
            End If
        End If

Code:
Worksheets("Statistiques").Cells(3, 2).Value = Zpn2ATraiterNonClot.Count

La fonction search, c'est juste pour me retourner le numéro de colonne basé sur le titre de celle-ci. Lorsque la condition if est remplie, cela rejoute un numéro à une collection, car il y a plusieurs doublons dans la colonne et à la fin, ça compte le nombre de valeurs dans la collection (qui sont toutes uniques).

Le problème, c'est que je dois faire cela pour 8000 lignes, et il y a environ 10 collections avec des traitements différents à faire, donc le temps est condiérablement long. Ceci doit s'exécuter chaque fois que le fichier est enregistré par un utilisateur.

Est-ce que quelqu'un aurait une solution plus rapide pour faire le code démonstré ci-haut sans avec à faire des collections et compter le nombre de valeurs.

Merci!
 

Pierrot93

XLDnaute Barbatruc
Re : Recherche valeurs unique

Re,

je ne peux acceder à ce site, à cause de mon proxy, mais mets plutôt sur le forum un fichier exemple avec de fausses données pour que nous cernions mieux le problème. Pour joindre, un fichier inférieur à 50k, en .xls ou .zip, tu cliques sur le bouton un peu plus bas "Gerer les pièces jointes" = > parcourir => tu selectionnes ton fichier => et tu cliques sur "Uploader".

@+
 

galpha

XLDnaute Nouveau
Re : Recherche valeurs unique

Voici les fichiers, j'ai supprimé des données parce que le fichier était de 2MB.

C'est en sauvegardant le fichier N54 OTP.xls que la macro roule.
 

Pièces jointes

  • Macro.zip
    42.8 KB · Affichages: 33
  • N54 OTP.zip
    35.7 KB · Affichages: 40
  • Macro.zip
    42.8 KB · Affichages: 29
  • Macro.zip
    42.8 KB · Affichages: 28

Pierrot93

XLDnaute Barbatruc
Re : Recherche valeurs unique

Re

je n'ai pas tout compris, mais regarde le code ci dessous, alimente une collection par l'intermédiaire d'un tableau virtuel. Compte les valeurs uniques par colonnes. Exemple à adapter à ton fichier.

Attention comme tu utilises une barre de progression dans ton code cela allonge considérablement la vitesse d'execution.

Code:
Sub test()
Dim t(), i As Integer, j As Integer, x As New Collection
t = Range("A1").CurrentRegion
For i = LBound(t, 2) To UBound(t, 2)
    For j = LBound(t, 1) To UBound(t, 1)
        On Error Resume Next
        x.Add t(j, i), CStr(t(j, i))
    Next j
    On Error GoTo 0
    MsgBox x.Count
    Set x = Nothing
Next i
End Sub

si cela peut t aider...

bonne fin d'après midi
@+
 

galpha

XLDnaute Nouveau
Re : Recherche valeurs unique

Après avoir étudier un peu le cas, ta solution me semble bien correcte si je ne veux rempli que la collection.

Si je veux la rempli suivant 3 conditions de cellules sur une même ligne, je ne comprend pas comment je pourrais faire cela avec ton code.:confused:
 

Pierrot93

XLDnaute Barbatruc
Re : Recherche valeurs unique

Re Galpha

qu'entends tu avec 3 conditions de cellules ? pourrais tu être un peu plus explicite. Je pense que l'on peut mettre en amont des tests pour savoir si oui ou non la valeur de la cellule doit être rentrée dans la collection.

bonne soirée
@+
 

Pierrot93

XLDnaute Barbatruc
Re : Recherche valeurs unique

Re

un exemple avec condition :

Code:
Sub test()
Dim t(), i As Integer, j As Integer, x As New Collection
t = Range("A1").CurrentRegion
For i = LBound(t, 2) To UBound(t, 2)
    For j = LBound(t, 1) To UBound(t, 1)
        If t(j, 2) = 0 and t(j, 3) > 1000 And t(j, 4) < 500 Then
        On Error Resume Next
        x.Add t(j, i), CStr(t(j, i))
        End If
    Next j
    On Error GoTo 0
    MsgBox x.Count
    Set x = Nothing
Next i
End Sub

@+
 

galpha

XLDnaute Nouveau
Re : Recherche valeurs unique

Pour remplir une de mes collections, j'ai besoin de déterminer si la cellule sur la même colonne est égale à "C", que l'autre à côté soit égale à "1" et l'autre à "Clôturer".

D'après ce que je comprend de ton bout de code, tous les cellules sont remplies en mémoire puis ensuite les tests sont effectués dans l'array. Puis une collection est remplie.

Est-ce que agir d'une telle façon accélère la vitesse d'exécution par rapport à lire directement la feuille de calcul?
 

pingouinal

XLDnaute Occasionnel
Re : Recherche valeurs unique

Bonjour,

Le code donné par Pierrot93 m'intéresse énormément, mais j'aurais besoin qu'il ne compte qu'une seule colonne (au lieu de donner les résultats de chaque colonne une à une) et je n'arrive pas à l'adapter.
Quelqu'un pourrait-il m'aider à ne compter par exemple que la colonne A dans ce code?

D'avance merci
 

Discussions similaires

Réponses
0
Affichages
155
Réponses
4
Affichages
175