Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Doublons multicolonnes

E

Eric

Guest
Bonjour,
ceci est mon 1er topic sur ce forum qui m'a l'air très sympathique à la lecture de quelques messages.
Je suis arrivé ici par une recherche google sur une macro pour les doublons.
J'ai trouvé donc ce Lien supprimé sur lequel j'aurais voulu continuer, mais il semble fermé.

Lien supprimé correspond presque à ce que je cherche puisqu'en fait, c'est la feuille 'doublons' crée qui m'interesse.

Toutefois, j'aimerais aussi avoir l'original pour mieux choisir lequel je garde par la suite.

D'autre part, la macro fonctionne bien sur une feuille avec 30000 lignes mais plante Excel sur une autre avec 40000 lignes. Y aurait il un pb de variable limitée à 2^15 (32768) ?

Peut etre est il plus simple que j'exprime ce que je cherche.

D'une feuille 'ListeAll', je voudrais une feuille 'Doublons'.

ex pour ListeAll contenant plusieurs colones à préserver, et 2 colonnes surquelles faire la sélection :
A B C D E
toto1 moa
toto1 mai
toto2 dioe
toto5 weifo
gjep pjp
qdjwp perogj
toto maoa
toto1 moa
toto2 mai
toto2 dioe
toto1 mai
toto1 moa


Je voudrais avoir ceci en feuille 'doublons' :
A B
toto1 moa
toto1 moa
toto1 moa
toto2 dioe
toto2 dioe


Cad avoir une copie de toutes les lignes qui sont en plusieurs exemplaires pour le couplet (A,B) dans 'ListeAll'

L'idéal serait d'avoir un choix du nombre de colonnes à prendre en compte, ce qui est le cas dans la macro de myDearFriend.

Je viens à l'instant de comprendre où modifier le code effectif de la macro. Peut etre puis je obtenir ce que je cherche en ne modifiant que qques variables, mais je ne comprends pas encore où et comment.

Merci de votre aide.

PS: j'ai regardé aussi dans la rubrique 'Téléchargement', mais les scripts de doublons proposés ne semblent (ou alors j'ai pas trouver le bon) concerner que les doublons pour une colonne
 

Dugenou

XLDnaute Barbatruc
Salut Eric,

En attendant que Our Dear Friend se jette sur ce post et te fabrique une super soluce je te propose de regrouper par concaténation les mots de tes deux colonnes à tester dans une troisième et d'appliquer la macro 'monocolonne' à cette troisième.

dans le troisimème colonne (F dans mon exemple) cellule F2 : =a2&b2 puis tu recopies sur toute la colonne.

Cordialement
 

myDearFriend!

XLDnaute Barbatruc
Bonsoir Eric, Dugenou, le Forum.

Oui Jean-Yves, à mon goût, ce qui suit n'est pas vraiment à la hauteur d'une 'super soluce' comme tu l'as si gentillement annoncé, mais j'espère toutefois que ça permettra à Eric de poursuivre son projet...

Cela dit, je suis content que cette macro complémentaire puisse rendre quelques services. J'envisage d'ailleurs quelques options supplémentaires pour la prochaine version qui, j'espère, ne tardera pas trop.

En ce qui concerne le cas de dépassement de capacité que tu sembles rencontrer Eric, effectivement, je n'avais pas prévu la possibilité d'un nombre de doublons supérieur à 32 767. Aussi, il te faut modifier la déclaration de la variable C située dans la procédure Private Sub btnDoublons_Click() comme suit :
Dim C As Long           'Au lieu de Dim C As Integer
Pour rappel, le mot de passe d'accès au VBA de cette xla est 'mydearfriend'.


Par contre, je te confirme que ce code, tel quel, ne pourra archiver dans l'onglet créé à cet effet que les lignes 'doublons', c'est-à-dire un traitement seulement à partir de la 2ème occurence rencontrée.

Pour pouvoir donc répondre pleinement à ta question, je te propose de remplacer cette procédure Private Sub btnDoublons_Click() par celle-ci :
Un inconvénient de taille par contre : le temps de traitement sera malheureusement beaucoup plus long...

Cordialement,
 
E

Eric

Guest
merci pour ta réponse, MyDearFriend.
Je vais voir ce soir ou demain soir ce que cela donne.

A propos des types: les Integer (16bits) sont donc des 'short' de C++, cad des entiers signés de -32k à +32k.
Les Long sont sur 32 bits.
L'alternative pour moi serait le type 'unsigned integer' (de 0 à 64k). Apparamment, la déclaration en Basic est 'Dim x%' au lieu de 'Dim x As Integer'

Tu confirmes ? Une variable 16bits au lieu de 32 rendra le traitement plus rapide...
 

myDearFriend!

XLDnaute Barbatruc
Bonsoir Eric, le Forum.

Mes connaissances en C++ sont plus que limitées aussi je me garderais bien de disserter sur le sujet...
Cela dit, je pense pouvoir te confirmer que l'Integer de VBA peut être assimilé au Short que tu connais (valeurs comprises entre -32 768 et 32 767) entier signé de 2 octets (16 bits) qui peut être déclaré grâce au signe %.
De même, toujours pour VBA, le type Long (entiers signés compris entre -2 147 483 648 et 2 147 483 647) peut être déclaré grâce au signe &.

Sauf erreur de ma part, il n'y a pas d'équivalent UnSigned Integer dans VBA.

Pour essayer de clarifier un peu, tu trouveras ci-dessous la liste des types de données disponibles sous VBA et poids associés :



Par contre, concernant la rapidité du traitement, je ne suis pas convaincu que l'utilisation de variables 16 bits te permettra un gain de rapidité par rapport aux variables 32 bits. D'ailleurs, je copie ci-dessous l'extrait d'un article très intéressant du MSDN Library sur le sujet :

'Les données de types Integer et Long peuvent prendre des valeurs positives ou négatives. Seule la taille des données différencie ces deux types. Les variables de type Integer ont une valeur comprise entre -32 768 et 32 767, les variables de type Long ont, elles, une valeur comprise entre -2 147 483 648 et 2 147 483 647. Généralement, les programmeurs VBA utilisent le type Integer pour représenter les petits nombres, car il nécessite moins de mémoire. Dans les versions plus récentes, cependant, VBA convertit toutes les valeurs de type Integer en type Long, même si elles sont déclarées comme étant de type Integer. L'utilisation de variables de ce type ne présente donc plus d'avantage de performance ; de fait, elle ralentit légèrement les opérations puisque VBA doit systématiquement procéder à une conversion'.

En espérant avoir pu t'éclairer un peu...

Cordialement,
 
E

Eric

Guest
Qd je parlais de différences de perfs, je me demandais si Excel mettait 2 Integer dans un Long ou transformait les Int en Long. MSDN confirme la 2ème solution.

Et les tests que j'ai fait avec ta macro aussi. J'obtiens les memes temps (chronométré) avec un Dim C As Integer et Dim C As Long (2 min sur ma table de 30000 lignes qui supprime 3600 doublons et 3 min sur celle de 36000 lignes en supprimant 4300 doublons).

Quant au 'Unsigned Integer', la macro fonctionne avec 'Dim %C' et 36000 lignes. Je vais réessayer de voir si elle fontionne avec 'Dim C As Integer'...

En cherchant un peu aussi sur MSDN, je viens de voir que Microsoft avait changer les Data Types entre VB6 / VBA et VB.NET.
VB.NET est .NET donc plus proche du C++ avec des Integer sur 32 bits, des Shorts sur 16 bits et des Long sur 64 bits.
Ce lien n'existe plus et Ce lien n'existe plus


Les tests précédents ne concernaient que la macro originale. J'ai pas pris le temps de tester la version que tu m'as modifiée (j'ai éteint mon PC après 20 min de traitement, ce n'était tjs pas fini...)

Mais comme j'ai la possiblité de trier ma list avant d'appliquer la macro, l'optimisation la plus importante serait donc de comparer simplement une ligne avec celle du dessus.
 
E

Eric

Guest
Bonjour,

bon aprés analyse du code de la macro, toute la discussion sur le type de C fut certes intéressante et formatrice, mais hors sujet : comme la lettre le suggère, C représente les colonnes. Donc en fait, cela fonctionne très bien avec C As Integer.

Mon 1er post était donc biaisé. Probablement n'avais je alors pas attendu les 2 ou 3 min de traitement pendant lesquelles Excel est frozen. Idéalement, il faudrait du multi thread.
Juste par curiosité, est il possible de faire du multithreading avec VBA ?

Mais je m'écarte encore...

Si je comprends bien, la macro originale a une complexité en 2n^2 (soit n le nombre de cellulles concernées, la recherche de doublons genere n*n instructions).

Et la modification que tu me proposes semble etre en 2n^3 (au cube).

Et là, ca devient impossible: mon PC a tourné 2 heures hier soir dessus sans aboutir. En fait, si ma comprehension et mon caculs sont corrects, il faudrait meme + d'1 an de traitement !!!!

(25 000 cellules à 1Ghz
2n^2 -> 2*25 000 * 25 000 / 1^9 = 134 s (2 min mesurées)
2n^3 -> ( 25 000 * 67 ) / (3600*24) = 402 jours !

Comme je disais plus haut, j'ai la chance de pouvoir trier ma liste avant de chercher les doublons.
Il va falloir que je modifie le code en conséquence... Bien sur, toute aide sera la bienvenue.
 

myDearFriend!

XLDnaute Barbatruc
Bonsoir Eric,

Heu.. je crois que tu peux revoir tes calculs Eric, car la macro ne raisonne pas en terme de cellules mais boucle sur des lignes (65536 lignes maxi par feuille pour rappel).

Ceci dit, je t'avais prévenu que le temps de traitement serait long... (j'aurai pour ma part préféré avoir connaissance de cette possibilité de tri dès le début car la solution aurait pu être tout autre).

En tout cas, avec une question-réponse hors sujet et une proposition que tu n'as pas pris le temps de tester, je pense qu'on a tous les deux gagné un temps fou.

Bon courage pour la suite...
 
E

Eric

Guest
Désolé en effet d'avoir mal expliquer mes besoins.

J'ai regardé hier plus en détail ton code, et ai compris un peu mieux le fonctionnement. Le principe est de comparer TabTemp, copie du fichier, avec TabTemp2 qui contient les données en double, c'est cela ?
Je suis pas encore familier avec VBA, surtout que bcp de fonctions semblent spécifiques aux macro Excel (.Range, .Cell, ...)

A propos du temps d'execution, mon calcul etait en effet foireux, je voulais tenter de prendre en compte toutes les executions processeurs pour estimer la durée de traitement.

Saurais tu chiffrer le 'beaucoup plus long...' de ta proposition ? Quel coefficient multiplicateur ?
Il s'agit de savoir si l'execution est simplement faisable sur ma gorsse liste. Un coeff supérieur à 1000 rendrait la macro inexpoitable...
 

Discussions similaires

Réponses
4
Affichages
1 K
Réponses
1
Affichages
1 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…