Comparer deux plages excel rapidement

Résolu/Fermé
JORKY - 15 avril 2014 à 23:05
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 - 29 avril 2014 à 11:21
Bonjour,

Je suis à la recherche d'un code VBA pour une fonction qui permette de comparer 2 plages excel, comme suit :

PlageA =A1:B20000

PlageB =C1:D20000

RANGVAL = le rang de l'ordre d'apparition de la valeur en différence

fonction = DIFFTAB(PlageA;PlageB;RANGVAL)

En cellule E1, je pose ma fonction "DIFFTAB(PlageA;PlageB;LIGNE($A1))" et je tire vers le bas.
Dans E1, E2 et le suite, le résultat se présente sous la forme =>

* si la valeur en différence appartient à la plage A = "(A) -valeur-"
* si la valeur en différence appartient à la plage B = "(B) -valeur-"
* si aucune ou plus aucune la valeur en différence = "???".

J'ai fait deux fonctions :

1- par comparaison de tableau avec en prime la possibilité de choisir soit à la valeur égale soit valeur recherchée contenue dans la plage de recherche,

2- comparaison avec la commande MATCH de la plage A puis B.

Elles fonctionnent toutes les 2. Mon problème est que lorsque je le fais sur un gros volume - 20000 lignes - cela n'en finit pas de calculer au point qu'il me faut couper l'exécution d'Excel.

Je me suis demandé si la solution n'était pas de calculer les différences et les restituer dans une plage d'accueil prédéfinies car mes fonctions présentes l'inconvénient qu'elles recalculent tout à chaque ligne.

C'est un besoin courant dans mon travail. Il y a bien la solution de la commande EQUIV + INDEX mais il faut les mettre au point. De plus, EQUIV ne permet pas de le faire sur plusieurs colonnes (Ex: EQUIV("TOTO";A1:D2000;0)), certains formats de cellules posent problème (la valeur recherchée est bien dans la plage de recherche mais EQUIV ne la trouve pas - vérification faite par CTRL+F cela marche-, gérer si EQUIV échoue par ESTERREUR.

Dans mon cas, c'est surtout la rapidité d'une fonction qui est mon vrai problème car du volume.

Cordialement.

2 réponses

eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
Modifié par eriiic le 15/04/2014 à 23:42
Bonjour,

tu ne veux pas déposer un classeur avec 2-3 exemples , résultat attendu et le comment ? Que doit faire cette fonction personnalisée ?

Parce que pour comprendre si la valeur en différence appartient à la plage A = "(A) -valeur-" ... Ca ne parle qu'à toi...

Et pourquoi pas un sub qui traite toute la plage ?
eric

En essayant continuellement, on finit par réussir.
Donc plus ça rate, plus on a de chances que ça marche.(les Shadoks)
En plus du merci (si si, ça se fait !!!), penser à mettre en résolu. Merci
0
Bonjour,

Merci pour cette intervention rapide.

Voilà procédons avec un exemple réaliste bien que mon besoin soit récurent sur d'autres recherches.

Une entreprise a 80000 contrats en colonne A. En colonne B, on a des contrats résiliés dont certains sont absents de la colonne A.

En colonne C, j'aimerai une fonction VB du style DIFFTAB(colonne A; colonne B; colonne C) - ou cela peut-être DIFFTAB(colonne A à C;colonne D à F) - qui donne en résultat toutes les valeurs du premier argument - ici colonne A absentes de la l'argument 2 - ici colonne B et place le résultat dans l'argument 3 - ici colonne C. On considère d'office que l'argument 1 est la plage à comparer, l'argument 2 la plage de recherche donc l'argument 3 ne comportera que des valeurs de l'argument 1 - plage à comparer - absentes de l'argument 2 -plage de recherche.

Dans notre exemple :

* le résultats de la colonne C comportera les contrats en vigueur.

Je pars sur une fonction car mes besoins sont divers. De plus, dans mon job on peut avoir des volumétries importantes.

Pour répondre à ta question "si la valeur en différence appartient à la plage A = "(A) ", je pense qu'il faut oublier car c'était une mauvaise idée. L'idée était de poser la fonction et de choisir dans le numéro de la valeur en différence. Exemple : supposons que nous trouvions 5 valeurs de la colonne A en différence avec la colonne B, en C1, je sollicitais première valeur en différence. En tirant la cellule C1 vers le bas, j'obtenais en C2 la deuxième valeur en différence ...etc. Mais oublions.

Je joins un fichier excel en colonne D, on trouve tous les contrats de la colonne A absents de la la colonne B. Dans mon exemple, je dois chercher les absents par EQUIV - très long pour 80000 contrats - puis faire un copier/coller texte puis classer la colonne D.

JE NE VOIS PAS DE QUOI CHARGER MON FICHIER EXCEL ????

J'espère avoir été plus clair.

Cordialement.
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
16 avril 2014 à 23:51
Bonjour,

Avant de chercher à accélérer il faut déjà faire les bons choix au départ.
Une fonction personnalisée sera toujours plus lente que les fonctions natives sur feuille, et qu'un sub qui traite tout d'un coup.
Quand tu as 80000 lignes c'est beaucoup ( beaucoup , beaucoup ) plus rapide de tout charger et de travailler en mémoire avec un sub.
Ton sub peut très bien être interactif et que tu lui désignes les colonnes à comparer, ainsi que où tu veux le résultat (même autre feuille éventuellement). Tu te rapproches de la souplesse d'une fonction, et tu as ton résultat en 2s...

Pour la restitution j'ai cru comprendre que tu veux la liste sans trous (pas alignée sur A), mais ce n'est pas dit explicitement.

ou cela peut-être DIFFTAB(colonne A à C;colonne D à F)
Et il faut A=D, B=E et C=F je suppose.
Et la restitution ? Uniquement A ou A, B et C ?

Précise aussi si la case (majuscules/minuscules) est toujours respectée entre A et B (ou A:C, D:F). C'est chronophage et si on peut se passer de cette conversion c'est toujours ça de pris.

Merci de déposer le fichier xls (réduit au nécessaire et anonymisé, avec les explications et éventuellement le résultat attendu) sur cjoint.com et coller ici le lien fourni.

eric
0
Bonsoir,

Je vais essayer avec un SUB paramétrable comme tu le suggères. Je peux appeler d'une cellule, un SUB comme une fonction ?

Convenons qu'à ta prochaine réponse à une ultime question, je marquerai la question comme résolu.

Question : avec un SUB, je peux afficher le contenu d'une cellule avec un ".select". Pourquoi cela ne marche-t-il pas avec FUNCTION ?

Merci pour la réponse précédente. Bonne soirée.
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
18 avril 2014 à 00:00
Je peux appeler d'une cellule, un SUB comme une fonction ?
Non.
Mais tu peux faire un raccourci clavier, ou bien lancer la macro sur un évènement comme activation de la feuille, ou clic sur un bouton, ou double-clic sur une cellule ou ...

Question : avec un SUB, je peux afficher le contenu d'une cellule avec un ".select". Pourquoi cela ne marche-t-il pas avec FUNCTION ?
Une fonction ne peut que retourner une valeur (ou une table de valeur si elle est matricielle), c'est tout.

eric
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
18 avril 2014 à 17:24
Regarde si ça t'intéresse : https://www.cjoint.com/?DDsrvwwwGdY
J'ai mis différentes options pour garder de la souplesse, comme tu disais que les besoins étaient divers.
L'option 'colorer' n'est pas encore opérationnelle, mais celle qui t'intéresse (extraire) l'est.
Teste sur tes 80000 lignes et dit ce qu'il en est.

eric
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
21 avril 2014 à 21:39
Bonjour,

Je te laisse juge des améliorations à apporter - sans que tu es aucune obligation.
C'est bien comme ça que je l'entendais ;-)
Correction des anomalies que tu as signalées et amélioration du temps de traitement des suppressions.
Je te laisse découvrir l'oeuf de pâques surprise ;-) Pas besoin d'explication sur cette nouvelle fonctionnalité qui, je pense, pourra t'intéresser.

Là ça touche à sa fin. J'espère que je n'ai pas ajouté de régressions. Maintenant plus d'évol, juste des corrections des anomalies que tu pourras détecter.
https://www.cjoint.com/c/DDvvIDwWTU0

eric
0
Bonsoir Eric,

Tout d'abord mille mercis pour cette nouvelle mouture. Par rapport à ma demande initiale, la réponse va bien au-delà de mes attentes. Convenons en effet que nous sommes arrivés au but.

Peu familier de ce forum, dois-je suite à cette réponse, cliquer sur "Marque comme résolu" ?

Bravo encore pour ce bon travail.

Cordialement.
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
22 avril 2014 à 10:27
Bonjour,

Oui, tu peux mettre en résolu, en haut vers ton titre.
Il reste des passages qui font un peu bricolage suite aux modif pour dysfonctionnements sur 2010 que je dois reprendre car ils ne me plaisent pas, ça sera un peu plus tard.
Et il reste sans doute des bugs...

eric
0
Bonsoir Eric,

Je vais mentionner la question comme résolue.

Je te remercie pour toutes démarches.

A titre purement informel, deux cas de figures (j'ai du occulter quelques tests)
- si l'on choisit deux colonnes dans "de" - A:B par exemple et deux colonnes dans "dans" - C:D par exemple en résultat colonne E, quand B est en différence dans C:D, il donne la référence de A systématiquement,
- autre cas : si nous avons deux colonnes - A:B du Feuil1 par exemple = A 80000 lignes B=15000 lignes et deux colonnes - C:D Feuil2 par exemple = C 15000 lignes D=80000 lignes soit l'inverse du Feuil1, quand nous comparons "de" Feuil2!B:B, "dans" Feuil1!A:A avec en résultat colonne Feuil2!D:D, - (nous comparons donc la même chose, on s'attend à un résultat vide) - il trouve en différence les valeurs portant égales à partir de la 150001 lignes sur les 80000 lignes.

Je te souhaite bonne continuation.

Cordialement.
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
22 avril 2014 à 22:58
Bonsoir,

1) quand B est en différence dans C:D, il donne la référence de A systématiquement,

C'est normal, c'est ce que j'ai prévu.
On compare 2 champs, mais on n'est pas obligé d'avoir les 2 champs en résultat.
Si on en veut qu'un seul c'est le 1er qui est retourné.
Si c'est le 2nd qui t'intéresse le plus simple c'est de mettre 2 colonnes et de supprimer celle qui ne t'intéresse pas. Le demander à chaque fois deviendrait lourd.

2) ça doit être un bug, il va falloir que je me mette en situation pour constater.
J'essaie de voir ça demain, mais j'aurais d'autres choses avant.

eric
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 249
24 avril 2014 à 20:06
Bonjour,

J'ai un peu de mal à dégager suffisamment de temps mais je ne t'oublie pas.
eric
0