IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

[VBA-E]Methode pour trouver une valeur qui apparait plusieur fois


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut [VBA-E]Methode pour trouver une valeur qui apparait plusieur fois
    hello,

    désolé pour le titre si ce n'est pas tres clair

    je cherche une methode pour faire ca :

    j'ai 2 colonnes et je veux trouver les elements de la colonne 1 qui ne sont pas dans la 2 (là c'est simple). Les elements de la colonne 1 se repetent (15 elements pour environ 1000 lignes) donc si dès qu'un element n'est pas trouvé je le stock, il y aura beaucoup de repetition et je voudrai ne voir qu'une fois les elements repetés.

    je pense aussi qu'il doit etre possible de gagner du temps de traitement si quand un element de la colonne 1 a deja ete trouvé dans la 2, eviter de faire à nouveau la recherche... mais je ne voit pas trop comment

    voilà j'ai des idées pour faire ca mais bon c'est tres moche alors je prefere pas les expliquer


    merci d'avance de vos reponses

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    Citation Envoyé par ouskel'n'or
    N'empêche qu'en créant un tableau des éléments à trouver... tu pourrais passer de l'un au suivant dès qu'il a été trouvé et recommencer la recherche depuis la première ligne avec le suivant... N'empêche
    oue à la base jpensai sois stocker les données sur une feuille puis les effacer ou soit creer un tableau.

    jpige pas ton premier poste ouskel, tavai envie de te défouler? pourquoi un tel acharnement?

    donc pour toi le mieux est un tableau ya pas plus efficace?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    hm,

    j'ai fait ce code et je pense que ca ressemble assez à ta solution, non?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    ' on initialise la valeur à false
    TrouveOk = False
    ' On ne s'occupe pas de la premiere ligne on commence à i=2
    j = 2
    ' on initialise k à 1
    k = 1
     
    ' On vérifie que les temps (priority, colonne L) sont connus
    For i = 2 To NombreDeLignesAComparer
     
      ' on regarde pour chaque valeur connue
      Do While (TrouveOk = False And j <= NombreDeLignes)
        If (Sheets("feuil1").Cells(i, 12) = Sheets("conversion_temps").Cells(j, 2)) Then
          TrouveOk = True
        ElseIf j = NombreDeLignes Then 
          TabTemp(k) = Sheets("feuil1").Cells(i, 12)
          k = k + 1
        End If
        j = j + 1
      Loop
      TrouveOk = False
      j = 2
    Next
     
    For i = 0 To k
      MsgBox TabTemp(i)
    Next
    j'ai un souci 'l'indice n'appartient pas à la selection' là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TabTemp(k) = Sheets("feuil1").Cells(i, 12)
    je comprend pas pourquoi ! ca vient du " TabTemp(k) = " car si je met = 1 par exemple, j'ai toujours l'erreur

    ptet que je declare mal mon tableau (mais je pense pas) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim TabTemp(1 To 100) As Variant
    à la base j'avais mis de type String mais bon rien n'y change

    Par la suite je vais essayer de faire un talbeau que je redimensionne, je sais pas trop comment mais j'ai deja vu qu'on pouvais (pour l'instant j'essaye la methode 'simple')

    Sinon, ça t'apprendra à dire des méchanceries au plus gentil de tes supporters
    Je vois pas DU TOUT de quoi tu parles !

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    hmmm c'est bon pour mon erreur (je suis trop nul )


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      If (Sheets("feuil1").Cells(i, 12) = Sheets("conversion_temps").Cells(j, 2))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     If (Sheets("feuil1").Cells(i, 12) = Sheets("conversion_temps").Cells(j, 1))
    le nombre à trouver etait dans la colonne 1 et comme il trouvait jamais alors il l'ecrivait dans le tableau et comme mon tableau eait de taille 100 et que j'ai beaucoup plus de lignes alors il etait trop petit d'où l'erreur

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    hm juste une petite question...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    k = k + 1
    Redim preserve LeTableau(k)
    TabTemp(k) = Sheets("feuil1").Cells(i, 12)
    j'initialise mon k à 0 alors ?

    Désolé mais j'ai jamais utilisé ces tableaux

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    ok ca roule j'aurai juste besoin d'un dernier coup de pouce

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    'on initialise les valeurs à false
        TrouveOk = False
        AjouterOk = False
        'On ne s'occupe pas de la premiere ligne on commence à i=2
        j = 2
        'on initialise k à 0
        k = 0
     
        'On vérifie que les temps (priority, colonne L) sont connus
        For i = 2 To NombreDeLignesAComparer
     
            'on regarde pour chaque valeur connue
            Do While (TrouveOk = False And j <= NombreDeLignes)
                If (Sheets("feuil1").Cells(i, 12) = Sheets("conversion_temps").Cells(j, 1)) Then
                    TrouveOk = True
                ElseIf j = NombreDeLignes Then 
                  For Each x In TabTemp
                      If (TabTemp(x) = Sheets("feuil1").Cells(i, 12)) Then
                          AjouterOk = True
                      End If
                  Next
                    'si la valeur n'y etait pas on l'ajoute
                    If AjouterOk = True Then
                        k = k + 1
                        ReDim Preserve TabTemp(k)
                        TabTemp(k) = Sheets("feuil1").Cells(i, 12)
                    End If
                End If
                j = j + 1
            Loop
            TrouveOk = False
            AjouterOk = False
            j = 2
        Next
        For i = 1 To k
            MsgBox TabTemp(i)
        Next
    le code mis en gras ne fonctionne pas 'boucle for non initialisée' ou une erreur de ce genre... à la base j'avais mis for x=1 to k mais ca rentrait jamais dedans car k vaut 0 et si je met x à 0 il me dit que l'element tabtemp(0) n'existe pas..

    cette boucle sert à verifier si l'element est deja dans le tableau. Si il ne l'est pas on l'ajoute...

    une idée pour ecrire ca? (meme completement différente de la mienne)

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    hmhm ne lisez pas le code du post d'avant

    j'm'y etait vraiment pris comme une m....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    'on initialise les valeurs à false
        TrouveOk = False
        AjouterOk = True
        'On ne s'occupe pas de la premiere ligne on commence à i=2
        j = 2
        'on initialise k à 0
        k = 0
     
        'On vérifie que les temps (priority, colonne L) sont connus
        For i = 2 To NombreDeLignesAComparer
     
            'on regarde pour chaque valeur connue
            Do While (TrouveOk = False And j <= NombreDeLignes)
                If (Sheets("feuil1").Cells(i, 12) = Sheets("conversion_temps").Cells(j, 1)) Then
                    TrouveOk = True
                ElseIf j = NombreDeLignes Then ''''''ZERTF
     
                    If k = 0 Then
                        k = k + 1
                        ReDim Preserve TabTemp(k)
                        TabTemp(k) = Sheets("feuil1").Cells(i, 12)
     
                    Else
                        For x = 1 To k
                            If (TabTemp(x) = Sheets("feuil1").Cells(i, 12)) Then
                                AjouterOk = False
                            End If
                        Next
     
                        'si la valeur n'y etait pas on l'ajoute
                        If AjouterOk = True Then
                            k = k + 1
                            ReDim Preserve TabTemp(k)
                            TabTemp(k) = Sheets("feuil1").Cells(i, 12)
                        End If
                    End If
     
                End If
                j = j + 1
            Loop
            TrouveOk = False
            AjouterOk = True
            j = 2
        Next
        For i = 1 To k
            MsgBox TabTemp(i)
        Next
    Ce code est largement mieux

    voilà merci de ton aide dodo (alors là ta plus interet à te plaindre de mes mechancetés )

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    non j'ai edité mon post,

    j'avais juste mal placé un if

    En outre qu'en est-il si d'un côté tu as des majuscules et de l'autre des ou une minuscule... ou le contraire ?
    ce sont des valeurs generée... enfin je veux dire que c'est pas quelqu'un qui les tape donc y'a pas ce souci.

    Au vu de ta solution je suppose que tu ne peux rien classer par ordre alphabéthique
    je ne pense pas que ca aide beaucoup, enfin je me trompe peut etre, mais là en gros ma colonne1 à plus de 1000 lignes et la 2 une dizaine et j'ai le resultat rapidement

    là, j'ai une intervention.
    Le super dodo part en mission (pardon c'est plus fort que moi )

    sinon je veux bien voir ta solution car je vois pas comment le faire autrement que ce que j'ai fait donc c'est toujours interesant

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Jète un oeil à ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    Sub ChercherTrouver()
    Dim TabTemp(), NoLigne
    'Classement des données à chercher par ordre de grandeur
    'Je suppose que les données à chercher sont dans feuil1, colonne A
        NoCol1 = 1
        Worksheets("Feuil1").Columns(1).Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
            OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
    'Classement des datas par ordre de grandeur
    'Je suppose que les datas sont dans feuil2, colonne A
        NoCol2 = 1
        Worksheets("Feuil2").Cells.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
            OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
    'Je cherche dans Feuil2 chaque donnée prise dans feuil1 et si je trouve, je mets dans un tableau
        NoLigne = 1
        k = 0
        For i = 1 To DernièreLigne
            If Worksheets("Feuil2").Cells(i, NoCol2).Value = Worksheets("Feuil1").Cells(NoLigne, NoCol1).Value Then
                k = k + 1
                ReDim Preserve TabTemp(k)
                TabTemp(k) = Sheets("feuil1").Cells(i, 12)
                NoLigne = NoLigne + 1
            End If
        Next
    End Sub
    On peut encore simplifier mais là...

    A+

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Points : 448
    Points
    448
    Par défaut
    ouéoué, j'avais jamais vu le "sort" !!

    ca m'a l'air pas mal ton truc (pour une fois ) jvais tester tout ca et je revien si j'ai une question.

    jmet resolu car j'ai plus de probleme, là c'est juste du perfectionnement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 22
    Dernier message: 13/09/2013, 14h20
  2. [XL-2010] Somme à effectuer pour trouver une valeur
    Par dark_sidious dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 21/05/2013, 15h39
  3. Réponses: 1
    Dernier message: 10/11/2012, 19h28
  4. Réponses: 4
    Dernier message: 03/12/2009, 11h50
  5. Trouver une valeur qui n'est pas dans un champ
    Par eric41 dans le forum Requêtes
    Réponses: 6
    Dernier message: 16/05/2006, 16h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo