Repérage des doublons [Résolu]

Messages postés
29
Date d'inscription
samedi 22 octobre 2011
Statut
Membre
Dernière intervention
10 novembre 2011
- - Dernière réponse : Dbratt
Messages postés
29
Date d'inscription
samedi 22 octobre 2011
Statut
Membre
Dernière intervention
10 novembre 2011
- 9 nov. 2011 à 15:34
Bonjour,

je suis un débutant en VB6 et je me remets à vous car j’espère que vous m'aiderez à devenir meilleur. Je vous remercie d'avance

J'ai un autre problème au qu'elle je crois avoir trouvé la solution mais je ne pense pas que cette solution soit optimale.

En fait j'ai un tableau supposons de taille 30 et je souhaite comparer toutes les valeurs de ce tableau afin de repérer les doublons. Pour le faire, j'ai écris le code ci-dessous

Dim TabRessources(30) as Interger 
Dim i as Integer 

for i=1 to 30 
   if TabRessources(i) = TabRessources(i+1) then 
      TabRessources(i+1)=0 
   elseif TabRessources(i) = TabRessources(i+2) then 
      TabRessources(i+2)=0 
   elseif TabRessources(i) = TabRessources(i+3) then 
      TabRessources(i+3)=0 
      . 
      . 
      . 
   elseif TabRessources(i) = TabRessources(i+30) then 
      TabRessources(i+30)=0 
   end if 
Next i 


le problème ici est que si par exemple mon tableau est de taille 1000 faire ce code va s'avérer fastidieux.

J'aimerai svp avoir qlqs pistes pour savoir comment optimiser ce code

merci

Cordialement

William
Afficher la suite 

12 réponses

Meilleure réponse
Messages postés
14592
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
15 novembre 2019
137
3
Merci
Bonjour,

Tu peux aussi imbriquer 2 boucles For :
For i=0 to Ubound(MonTab)-1
    For j=i+1 to Ubound(MonTab)
        If MonTab(i)=MonTab(j) Then 'Doublon
    Next
Next


---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 210 internautes nous ont dit merci ce mois-ci

Commenter la réponse de NHenry
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
0
Merci
Bonjour,

Le plus simple et le plus rapide est alors d'utiliser un dictionnaire ===>>

Set mondico = CreateObject("Scripting.Dictionary")

For i = 0 To 30
    If mondico.Exists(TabRessources(i)) Then
      TabRessources(i) = 0
    Else
      mondico.Add TabRessources(i), TabRessources(i)
    End If
Next


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
29
Date d'inscription
samedi 22 octobre 2011
Statut
Membre
Dernière intervention
10 novembre 2011
0
Merci
Merci beaucoup pour votre réponse; mais je ne sais si j'ai réussi à adaptée cette réponse à mon problème.

En fait j'ai 3 tableaux et j'ai écris le code ci-dessous afin de repérer d'un les doublons (meme code ressource) et si jamais il y a un et que l'heure de début de la tache(u+1) est inférieur à l'heure de fin de la tache(u) alors dans ma flexgrid.textmatrix(u+1,2) je mets l'heure de fin de la tache(u)+ 0,5

VOICI CE QUE J'AI ECRIS PRECEDEMENT

Dim TabHeureD as integer
Dim TabHeureF as integer
Dim TabRessources as integer

For u =  1 To 30
      
    If TabHeureD(u + 1) < TabHeureF(u) And TabRessources(u) =             TabRessources(u + 1) Then
         frmRecapAvantOrdo.TextMatrix(u + 1, 2) = (TabHeureF(u) + 0.5)
              
     ElseIf TabHeureD(u + 2) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 2) Then
         frmRecapAvantOrdo.TextMatrix(u + 2, 2) = (TabHeureF(u) + 0.5)
         
     ElseIf TabHeureD(u + 3) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 3) Then
         frmRecapAvantOrdo.TextMatrix(u + 3, 2) = TabHeureF(u) + 0.5
         
     ElseIf TabHeureD(u + 4) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 4) Then
         frmRecapAvantOrdo.TextMatrix(u + 4, 2) = TabHeureF(u) + 0.5
         .
         .
         .
         .  
      ElseIf TabHeureD(u + 30) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 30) Then
         frmRecapAvantOrdo.TextMatrix(u + 30, 2) =  TabHeureF(u) + 0.5
         
      End If
Next u


VOICI L'ADAPTATION

Dim mondico as string

Set mondico   = CreateObject("Scripting.Dictionary")

For u = 0 To 30
    If mondico.Exists(TabRessources(u)) And TabHeureD(u + 1) < TabHeureF(u) Then
       frmRecapAvantOrdo.TextMatrix(u + i, 2) = TabHeureF(u) + 0.5
    'Else
      'mondico.Add TabRessources(i), TabRessources(i)
    End If
Next u


Quand je lance ce code on me dit qu'il y a erreur de compilation et qu'un object est requis...

Aussi j'aimerai savoir si mon adaptation est bonne?

Merci
Commenter la réponse de Dbratt
Messages postés
29
Date d'inscription
samedi 22 octobre 2011
Statut
Membre
Dernière intervention
10 novembre 2011
0
Merci
Merci beaucoup pour votre réponse; mais je ne sais si j'ai réussi à adaptée cette réponse à mon problème.

En fait j'ai 3 tableaux et j'ai écris le code ci-dessous afin de repérer d'un les doublons (meme code ressource) et si jamais il y a un et que l'heure de début de la tache(u+1) est inférieur à l'heure de fin de la tache(u) alors dans ma flexgrid.textmatrix(u+1,2) je mets l'heure de fin de la tache(u)+ 0,5

VOICI CE QUE J'AI ECRIS PRECEDEMENT

Dim TabHeureD as integer
Dim TabHeureF as integer
Dim TabRessources as integer

For u =  1 To 30
      
    If TabHeureD(u + 1) < TabHeureF(u) And TabRessources(u) =             TabRessources(u + 1) Then
         frmRecapAvantOrdo.TextMatrix(u + 1, 2) = (TabHeureF(u) + 0.5)
              
     ElseIf TabHeureD(u + 2) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 2) Then
         frmRecapAvantOrdo.TextMatrix(u + 2, 2) = (TabHeureF(u) + 0.5)
         
     ElseIf TabHeureD(u + 3) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 3) Then
         frmRecapAvantOrdo.TextMatrix(u + 3, 2) = TabHeureF(u) + 0.5
         
     ElseIf TabHeureD(u + 4) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 4) Then
         frmRecapAvantOrdo.TextMatrix(u + 4, 2) = TabHeureF(u) + 0.5
         .
         .
         .
         .  
      ElseIf TabHeureD(u + 30) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 30) Then
         frmRecapAvantOrdo.TextMatrix(u + 30, 2) =  TabHeureF(u) + 0.5
         
      End If
Next u


VOICI L'ADAPTATION

Dim mondico as string

Set mondico   = CreateObject("Scripting.Dictionary")

For u = 0 To 30
    If mondico.Exists(TabRessources(u)) And TabHeureD(u + 1) < TabHeureF(u) Then
       frmRecapAvantOrdo.TextMatrix(u + 1, 2) = TabHeureF(u) + 0.5
    'Else
      'mondico.Add TabRessources(i), TabRessources(i)
    End If
Next u


Quand je lance ce code on me dit qu'il y a erreur de compilation et qu'un object est requis...

Aussi j'aimerai savoir si mon adaptation est bonne?

Merci
Commenter la réponse de Dbratt
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
214
0
Merci
1) Elle ne l'est pas, dès lors que tu supprimes, comme tu l'as fait, l'inscription au dictionnaire
2) tu mélanges tout (ton tableau et apparemment une flexgrid ) !
Ta discussion ne concernait, je te le rappelle, que les doublons d'un tableau ! Et la réponse que tu as reçue concerne donc ce que tu as demandé, tel que demandé !
pour mémoire :
En fait j'ai un tableau supposons de taille 30 et je souhaite comparer toutes les valeurs de ce tableau afin de repérer les doublons

et voilà que tu arrives maintenant avec autre chose.
Ma réponse : une discussion n'est ni un "chat", ni le moyen de traiter plusieurs choses ! Elle est l'exposé d'un seul problème isolé et spécifique et n'"est susceptible de recevoir que la réponse à ce problème spécifique et isolé. Une discussion n'est pas là pour aller "au delà" dans le développement et le suivi d'une application qui n'est( que la tienne et dont nous n'avons pas à connaître les tenants et aboutissants.
Tu as posé un problème ===>> tu as eu la réponse (au demeurant testée) à ce seul problème.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
29
Date d'inscription
samedi 22 octobre 2011
Statut
Membre
Dernière intervention
10 novembre 2011
0
Merci
Bonjour NHenri,

Merci pour t'as réponse. je l'ai déjà fait et j'ai rencontré le probleme suivant:
Avec cette méthode, la recherche des doublons ne se fait que s'ils sont consécutifs ( u et u+1, u+1 et u+2....). s'ils sont non consécutifs alors elle ne marche plus (u et u+2, u et u+25,.....) et c'est le cas de mes tableaux

je ne sais pas si je me suis fait comprendre?

Merci
Commenter la réponse de Dbratt
Messages postés
14592
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
15 novembre 2019
137
0
Merci
Bonjour,

Dbratt, alors, ce n'est pas le même code que tu as testé, car celui-ci détecte les doublons, même s'ils sont non consécutifs.

J'ai utilisé ce format de code assez souvent pour le savoir.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
Messages postés
29
Date d'inscription
samedi 22 octobre 2011
Statut
Membre
Dernière intervention
10 novembre 2011
0
Merci
Mr. ucfoutu,

je suis d'accord avec vous, j'ai eu la solution au problème que j'ai posé. et je vous en remercie. Je me suis juste dit que une fois connaissant cela je pourrais l'adapter a mon problème.

Pouvez vous donc m'aider a optimiser mon code ci-dessous s'il vous plait connaissant mon reel probleme?

Dim TabHeureD as integer
Dim TabHeureF as integer
Dim TabRessources as integer

For u = 1 To 30
      
    If TabHeureD(u + 1) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 1) Then
         frmRecapAvantOrdo.TextMatrix(u + 1, 2) = (TabHeureF(u) + 0.5)
              
     ElseIf TabHeureD(u + 2) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 2) Then
         frmRecapAvantOrdo.TextMatrix(u + 2, 2) = (TabHeureF(u) + 0.5)
         
     ElseIf TabHeureD(u + 3) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 3) Then
         frmRecapAvantOrdo.TextMatrix(u + 3, 2) = TabHeureF(u) + 0.5
         
     ElseIf TabHeureD(u + 4) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 4) Then
         frmRecapAvantOrdo.TextMatrix(u + 4, 2) = TabHeureF(u) + 0.5
         .
         .
         .
         .  
      ElseIf TabHeureD(u + 30) < TabHeureF(u) And TabRessources(u) = TabRessources(u + 30) Then
         frmRecapAvantOrdo.TextMatrix(u + 30, 2) = TabHeureF(u) + 0.5
         
      End If
Next u 


Cordialement
Commenter la réponse de Dbratt
Messages postés
29
Date d'inscription
samedi 22 octobre 2011
Statut
Membre
Dernière intervention
10 novembre 2011
0
Merci
Re-Bonjour NHenri,

je m'excuse ca marche surper bien certainement c moi qui ai fait une erreur quand je l'ai fait.

je me permets de vous poser une autre question! quand j'ecris ceci:

For r = 0 To 29 'UBound(MonTab) - 1
    For e = r + 1 To 30 'UBound(MonTab)
        If TabRessources(r) = TabRessources(e) And TabHeureD(r) < TabHeureF(e) Then
        frmRecapAvantOrdo.TextMatrix(e, 2) = TabHeureF(e) + 0.5
        End If
    Next e
Next r


j'ai une erreur: type de donnees incompatible sur cette ligne (frmRecapAvantOrdo.TextMatrix(e, 2) = TabHeureF(e) + 0.5)

je presume que c parce que j'essaye de remplir une flexgrid avec un tableau est ce la raison? si oui comment contourner cela?

Merci
Commenter la réponse de Dbratt
Messages postés
14592
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
15 novembre 2019
137
0
Merci
Bonjour,

Peut être qu'il attend une chaine de caractère et que tu lui envoi un nombre.
Conserves les UBound, comme ça si plus tard, tu changes le nombre d'éléments, tu n'auras pas de problème à ce niveau.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
Messages postés
29
Date d'inscription
samedi 22 octobre 2011
Statut
Membre
Dernière intervention
10 novembre 2011
0
Merci
Merci, je me doutais bien que c'etait cela ! y a t'il pas des convertisseurs qui convertissent des nombre en texte comme (Val) qui converti le contenu d'un texte en nombre?

Cordialement
Commenter la réponse de Dbratt
Messages postés
29
Date d'inscription
samedi 22 octobre 2011
Statut
Membre
Dernière intervention
10 novembre 2011
0
Merci
C'est bon j'ai résolu le probleme avec (CStr) Merci pour votre aide.
Commenter la réponse de Dbratt