Comparer un range de cellules avec un autre range
Bonjour à tous,
Ca faisait longtemps que je n'avais plus galéré autant, sans trouver de solution déjà expliquée sur ce forum.
J'ai pas mal bossé sur cette macro pour finalement réaliser que j'avais loupé un point crucial :s
Fichiers:
- 1 fichier contenant une ligne avec toutes les bonnes réponses (RIGHT_ANSWER_Reference.xlsx)
- 1 fichier contenant une ligne pour chaque répondant et ses réponses (Basic_Report_ALL_ANSWERS.xlsx)
Les 2 fichiers ont la même structure (2 lignes d'en-têtes, mêmes colonnes)
- 1 fichier "MACRO" qui contient donc la macro et va se charger de copier et convertir les données (Converter.xlsm)
Objectif:
- Supprimer les réponses justes des répondants
(pour pouvoir ensuite leur montrer uniquement les questions auxquelles ils n'ont pas pu répondre correctement)
Situation:
Jusque là, j'ai fait une macro qui fait ceci:
- Ouvre chacun des 2 fichiers (Réponses justes et Toutes les réponses)
- Copie leur contenu dans les Sheets du fichier "MACRO" (Sheets: TO_CONVERT et RIGHT_ANSWERS)
- Colonne après colonne, sélectionne la bonne réponse de "RIGHT_ANSWERS" et "Rechercher-Replacer" (par "" rien-donc supprimer) dans la colonne correspondante de "TO_CONVERT"
Ca marche nikel sauf que... j'ai oublié un point crucial que je n'arrive pas à résoudre:
Problème:
Il y a 2 lignes d'en-têtes
La 1ère ligne correspond aux titres des questions
La 2è ligne correspond aux titres des options de réponses ou sous-questions s'il s'agit d'une question à réponse "ouverte"
--> Sur la première ligne, puisqu'une question peut avoir plusieurs options ou sous-questions, les cellules de toutes les colonnes incluant les options/sous-questions sont fusionnées.
Plutôt que de comparer colonne par colonne, je devrais comparer une série de colonnes à la fois (les colonnes en dessous de chaque série de cellules fusionnées à la première ligne)
--> Si, par ligne, toutes les cellules des colonnes correspondante sont identiques, alors supprime son contenu, sinon laisse-le intact
Pour illustrer:
]
- Disons que la ligne 3 (en VERT) correspond aux réponses justes de référence (en réalité dans un autre fichier/sheet mais on pourrait bien sûr la mettre en ligne 3 si plus facile pour la macro... en tout cas pour illustrer:) )
- En ROUGE: réponses identiques - les bonnes réponses donc
- Le contenu sur fond JAUNE/ORANGE doit être supprimé car toute les cellules de cette ligne (sous l'en-tête fusionnée) ne correspondent pas.
- En ORANGE: mise en évidence des données incorrectes
- -> donc ORANGE et JAUNE doit être supprimé
Attention, le nombre de colonnes par question varie
Le nombre de colonnes au total varie également (dans ma dernière tâche de conversion il y en avait 743
Malheureusement je pense que mon approche n'ira pas dans ce contexte car le "search&replace" ne permet pas de "comparer" plusieurs cellules à la fois :s Donc les seules bonnes choses à garder sont l'ouverture des fichiers, la copie de leur contenu et l'enregistrement du fichier converti. Frustrant:)
Dans ce cas-ci, plutôt que de numéroter chaque colonne, je pense à un truc du genre:
Sheets("RIGHT_ANSWERS").Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Offset(2, 1).Select
ColAns1 = Selection.Value
Sheets("TO_CONVERT").Select
LC = Cells(1, Columns.Count).End(xlToLeft).Column
Range("A1", Cells(1, LC)).Select
Range(Selection, Selection.End(xlDown)).Select
Cells.Replace What:=ColAns1, Replacement:="", LookAt:=xlWhole, _
SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=FalseC'est erroné mais le problème se situe de toute façon au niveau du "Replace" qui ne fonctionne visiblement pas avec plusieurs cellules :s
Si vous avez des idées de solutions... je pourrai retrouver un semblant de sommeil... la nuit:)
Merci déjà d'avoir pris la peine de lire mon message de désespoir... et mille mercis à ceux qui me donneraient de l'espoir
David
Bonjour,
Je ne suis pas sur que beaucoup de répondeurs acceptent de charger des .exe spécifiques à ton hébergeur pour pouvoir lire tes fichiers.
Si tu ne peux réduire suffisamment tes fichiers, mets les sur cjoint et change tes liens : ça me semble préférable si tu comptes obtenir une/des réponses.
A+
Merci !
En fait les EXE se téléchargent quand on clique sur les "download" de pub
En cliquant sur "Download" à droite, le fichier se télécharge sans affreux .exe
J'ai ajouté des liens "cjoint" dans mon post ci-dessus
Merci encore pour le conseil!
A+
J'espère que la blague avec le faux lien de download n'en a pas repoussé...
Quelqu'un a une idée/ de l'inspiration?
Bonjour,
Hum... Les liens ci-joint fonctionnent parfaitement.
C'est assez imbuvable ton truc.
Voir le classeur joint.
Bon j'ai un peu élagué...
J'ai supprimé tous les messages, pour simplifier un peu mon approche, mais ce ne sera pas trop difficile de les rajouter.
Par voie de conséquence il faut bien respecter la succession logique des boutons :
- charger le classeur de réponses.
- charger le classeur de travail (basic report...)
Euh... en fait il n'y a pas besoin des feuilles 2 et 3 on pourrait travailler directement sur (basic report...) mébon c'est juste pour voir si j'ai bien compris la question !
Tu me diras si j'ai respecté l'esprit du truc. (Je me suis contenté d'effacer les réponses exactes)
A+
Bonjour,
Merci beaucoup! Je veux bien croire que c'était imbuvable - mes 1000 lignes tarabiscotées et tes 50 lignes qui font tout niquel propre...
Mais, comme ma macro d'origine, ça check colonne par colonne et pas par "range de colonnes" correspondantes aux intitulés de questions de la ligne 1.
L'idée de copier les data ailleurs c'est pour conserver l'original à chaque conversion, et d'enregistrer la conversion sous un autre fichier.
Mais aucun problème pour les bouger où ça arrange le mieux la macro.
Tu aurais une idée de comment résoudre le problème lié aux ranges à comparer?
Je vais essayer de l'expliquer un peu différemment que dans mon premier post:
2 lignes d'en-têtes
ligne 1 = intitulés de questions
Chaque question est divisée en plusieurs colonnes; les options de réponses
Donc pour chaque question, l'intitulé est plusieurs cellules fusionnées
Par série de colonnes sous chaque question (ligne 1 de cellules fusionnées), il faudrait ne supprimer le contenu que si tout le range est identique.
par ex:
question A (cellules fusionnées de A1 à D1)
disons que les bonnes réponses sont:
A= 01/01/2001
B= 02/02/2002
C=03/03/2003
D=04/04/2004
--> il faut supprimer le contenu des cellules A,B,C et D uniquement si ces 4 conditions sont réunies
autrement laisser intact
bien entendu, ligne par ligne/horizontalement
Tu comprends ce que je cherche à faire?
Je t'avoue que je ne comprends pas tout de ta macro mais tu utilises la même technique du "Chercher&Remplacer" --> ça pourrait fonctionner même pour comparer un range de colonnes, par ligne?
Encore merci pour ton aide - j'ai encore beaucoup à apprendre pour faire une macro avec si peu de lignes de code - j'ai pas mal chipoté pour répliquer mon bout de code 1500X
J'avais à peu près compris le problème des ranges de colonnes fusionnées même si ce n'était pas trop clair, mais ce qui me paraissait le plus urgent était de simplifier ton code qui aboutissait à une impasse.
Bon les cellules fusionnées, c'est pas une bonne idée : il faut que j'y réfléchisse.
J'avais aussi compris l'idée de garder le fichier source "propre".
Je pense que le plus simple ça va être de copier 2 fois le fichier de réponses.
La première copie sera celle que je viens de faire.
On travaillera avec la 2 ème copie pour restituer les groupes ou une des réponses est fausse.
Mais encore une fois ce n'est pas simple. Les cellules fusionnées c'est vraiment une s...
Je reviens un peu plus tard.
A+
Cool, merci beaucoup!
C'est vrai qu'en comparaison mon code était pourritos
Tout le mal qu'on dit sur les cellules fusionnées, je crois comprendre que les manipuler est une crasse mais dans ce cas je n'ai que ça pour identifier les questions et ainsi connaitre quelles colonnes "vont ensemble".
J'ai vu qu'en les défusionnant, le contenu reste dans la première de la série, les autres restant ainsi vides.
Est-ce que d'une certaine façon, en comptant les cellules vides suivantes, jusqu'à la prochaine cellule ayant du contenu (donc la prochaine question), ça pourrait permettre d'identifier le range plus facilement? C'est dit avec des mots d'ignorant mais j'essaye, j'assemble les pièces du puzzle:D
Merci encore pour ton aide!
A+
La réponse est dans l'intitulé des items (ligne 1)
le 2ème chiffre entre : : indique le nombre de réponses pour la question.
Ex : "12:4:2S001: Dummy Question"
Pour cette question (12) il y a 4 colonnes
Pour la question 13, il y en a 5...
A+
Mais oui! Juste!! je n'avais pas remarqué:)
J'ai passé au moins 15heure sur ce truc, mon dimanche au complet y est passé et je n'ai pas vu ça
Tu as une idée de comment on peut l'utiliser dans la macro?
a+
Bonsoir,
il faut "spliter" les en-tête de colonnes
La solution (en pièce jointe)
A+
Bonsoir Galopin01
Mille merci!!! c'est une tuerie
Ca a l'air de marcher du tonerre. Je vais tester demain avec des fichiers plus conséquents et comparer en détail.
Et surtout je vais essayer de comprendre la macro
Merci encore! Je te donne plus de feedback demain
A+
YES!!! Ca marche impec'
Enfin j'ai eu un petit coup de chaud quand même... ça bloquait sur Var = Arr(1)
après pas mal de tests j'ai compris
en fait le
x=25
c'est parce que dans l'exemple la première cellule fusionnée est la 25è
dans d'autres fichiers que je dois traiter ça peut changer
j'ai donc replacé x=25 par
x=2
après je l'ai remis avec un seul bouton et une suite de application.run avec des petits msgbox
top top!!
T'as un "give me a beer"?
Mille merci!!