|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||
|
Invité de passage
![]() Mary In The SkyAcheteuse Inscription : décembre 2011 Messages : 12 ![]() |
Bonjour,
J'ai paramétré un format conditionnel dans plusieurs cellules de mon fichier Excel pour identifier des erreurs d'encodage. Je souhaiterais, via une macro, compter le nombre d'erreurs dans mon classeur. Voici la manière dont j'ai écrit cela : Code :
Et parfois, le debugger trouve un bug dans la ligne Code :
D'avance merci ! Marie |
||||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Frédéric VandermeulenInscription : juillet 2007 Messages : 1 730 ![]() |
Bonjour,
Il n'y a pas besoin de tester la propriété (de toute façon, je crois pas que ça fonctionne et en plus tu ne fais pas de boucle sur les celulles qui la compose). Cette ligne suffit: Code :
nerror = Range("Report_PrixCurrency").FormatConditions.Count A+ Edit: petite précision, quand je dit que le test sur la MFC ne fonctionne pas c'est dans le cas où la plage contient des celulles SANS mise en forme conditionnelle.
__________________
N'oubliez pas le si votre problème est solutionné.
|
|
|
00
|
|
|
#3 | ||
|
Invité de passage
![]() Mary In The SkyAcheteuse Inscription : décembre 2011 Messages : 12 ![]() |
En fait, ma macro compile dans un fichier de synthèse (en colonne), les informations qui se situent dans des fichiers indépendants.
Ces infos se trouvent dans des cellules auxquelles j'ai donné un nom qui commence par Report_QQCH dans les fichiers indépendants et Merge_QQCH dans le fichier de sythèse. Chaque cellule du fichier indépendant contient de 2 à 5 critères de mise en forme conditionnelle suivant les différentes incohérences possibles entre les informations. Dans une version précédente de la macro, mon collègue avait paramétré toutes les mises en formes conditionnelles dans la macro. Le problème de cette méthode, c'est qu'on ne voit pas les erreurs tant qu'on n'a pas executé la macro. Report_PrixCurrency contient une monnaie (EUR, USD, GBP) contrôlée par une liste de choix. C'est vrai que le mid() est un peu inutile. J'avoue que c'est une partie de code que j'ai reprise bêtement. Je vais essayer le bout de code que tu me proposes et je te dirai si ça fonctionne : Code :
nerror = Range("Report_PrixCurrency").FormatConditions.Count Code :
PrixCurrency.FormatConditions(1).Formula1 = True Rebonjour Frédéric, Et bien ça fonctionne, mais ça ne donne pas le résultat qui m'intéresse. Voici le code que j'ai inclus : Code :
Je devrais donc avoir nerror = 1 à la fin du code. Mais le debugger trouve nerror = 2. Pfff... je ne suis pas sauvée. Est-ce que tu aurais une autre idée ? |
||
|
|
00
|
|
|
#4 | ||
|
Expert Confirmé Sénior
![]() ![]() |
Salut
PrixCurrency représente quoi dans ton code? Ou alors c'est une erreur de frappe, dans ce cas, je rejoins Fvandermeulen sur le fait qu'il faille boucler sur les cellules contenues dans ta plage nommée. Code :
Qwaz
__________________
MagicQwaz := Harry Potter la baguette en moins ![]() Le monde dans lequel on vit HammerFest Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer |
||
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Mary In The SkyAcheteuse Inscription : décembre 2011 Messages : 12 ![]() |
Je vais mettre les différents fichiers en ligne.
Comme ça, vous verrez l'ensemble du code. Là, je n'ai copié qu'une partie des 8 pages de code. Les déclarations, c'est mieux, c'est vrai. J'ai perdu mes bonnes habitudes de quand je programmais en C++. Vous verrez dans la macro que je boucle sur certains de mes champs, quand ceux-ci contiennent plusieurs cellules. Mais dans le cas de Report_DaNr, Report_DaNr et Report_PrixCurrency, ça n'est pas le cas. Dans la macro, le fichier et la feuille sont aussi bien précisés... Pour faire fonctionner le code, il faut changer les chemins d'accès dans l'onglet "table" du formulaire individuel. |
|
|
00
|
|
|
#6 | ||||||||||
|
Expert Confirmé Sénior
![]() ![]() |
Salut
Il te faudra de toute façon a minima utiliser Evaluate() pour évaluer la formule contenu dans ta formula1. [Edit] J'ai fait quelques essais et recherches, et un autre internaute à eu le même soucis y'a pas longtemps avec les validations, Evaluate() ne prend que des formules en Anglais... Formula1 fait apparaître la formule dans la langue Excel... En français donc... *Essai comme ça Code :
[/Edit] Pour le reste du code, voila quelques modif, pour alléger un peu. Tu utilises énormément de variables alors que tu le les réutilises jamais dans la suite du code. Il me semble qu'en C++ il fait créer un mnémonique pour chaque champs texte et autre (enfin je m'avance un peu beaucoup je crois...) en VBa en tout cas ça n'est pas utile, tu peux directement faire référence au contenu d'une cellule. Inutile de selectionner une cellule ou un onglet pour travailler dessus, il suffit de les pointer, soit avec une variable, soit avec With... Code :
J'ai modifié la fonction compress également Code :
Code :
Je te conseille d'ailleurs de reprendre tous tes codes et de virer les Select, ça rend le code bien plus véloce et en précisant classeur+feuille, ça t'évite d'aller modifier du contenu dans un autre document juste par ce que tu as décider de faire autre chose le temps que ta macro tourne.... ![]() Et pour que tout fonctionne bien j'ai ajouté ça, que j'utilise dans le code du début. Code :
Au lieu de Code :
=SI(Report_DaNr="25xxxxxx";VRAI();FAUX()) Voir même Code :
=OU(ESTVIDE(Report_DaNr);Report_DaNr="25xxxxxx") ++ Qwaz
__________________
MagicQwaz := Harry Potter la baguette en moins ![]() Le monde dans lequel on vit HammerFest Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer |
||||||||||
|
|
00
|
|
|
#7 |
|
Invité de passage
![]() Mary In The SkyAcheteuse Inscription : décembre 2011 Messages : 12 ![]() |
Eh bien, j'aurai appris des choses aujourd'hui. Merci beaucoup Monsieur Qwaz
![]() Je vais donc virer tous les .select et remplacer ça par un beau With. Le IIf est beau aussi. C'est vrai que c'est tout de suite plus clair et léger Dans QualityNegoDetail, je fais une compilation des données qui sont dans Report_NegoQualityDetail1 et Report_NegoQualityDetail2 qui sont deux zones séparées dans mon fichier individuel. Il y a un moyen plus simple de faire, je parie ? Enfin, peux-tu m'expliquer ce que fait ta nouvelle fonction ? Je vais réessayer de compter les erreurs comme toi. Parce que c'est ce que j'avais essayé ce matin, et parfois, Excel détectait un bug que j'avais du mal à comprendre. Et si j'ai bien compris, tu me dis que si j'ai 5 conditions pour la mise en forme conditionnelle, alors je dois répéter le test avec FormatCondition(1).Formula1, FormatCondition(2).Formula1, FormatCondition(3).Formula1, FormatCondition(4).Formula1 et FormatCondition(5).Formula1 ? |
|
|
00
|
|
|
#8 | |||||||
|
Expert Confirmé Sénior
![]() ![]() |
Salut
Citation:
Citation:
J'ai rajouté le blocage du rafraîchissement. Code :
Donc pour parait le problème, je passe par une cellule qui elle contient différentes propriété qui renvoie la formule dans des versions linguistiques appropriées (regarde l'aide sur Formula, FormulaR1C1, FormulaLocal....) Citation:
Citation:
Citation:
++ Qwaz
__________________
MagicQwaz := Harry Potter la baguette en moins ![]() Le monde dans lequel on vit HammerFest Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer |
|||||||
|
|
10
|
|
|
#9 |
|
Invité de passage
![]() Mary In The SkyAcheteuse Inscription : décembre 2011 Messages : 12 ![]() |
Bonsoir Stéphane et merci beaucoup. Je vois que je te fais travailler tard.
En plus, je suis coincée devant le PC de mon Homme, où seul Office 2003 est installé. Impossible de tester quoi que ce soit d'ici. Si je repasse par ma maison demain ou ce week-end, devant mon PC un peu plus évolué Et dans tous les cas, je te tiens au courant lundi. C'est quand même le week-end du Nouvel An. C'est pas le moment d'embêter les gens avec du boulot A bientôt, Marie |
|
|
00
|
|
|
#10 | ||||
|
Expert Confirmé Sénior
![]() ![]() |
Salut
Va falloir lui faire un cadeau pour le nouvelle an à ton Homme Pour ton autre morceau de code, voila un simplification possible Code :
Code :
Passez une bonne soirée ++ Qwaz
__________________
MagicQwaz := Harry Potter la baguette en moins ![]() Le monde dans lequel on vit HammerFest Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer |
||||
|
|
00
|
|
|
#11 | ||
|
Invité de passage
![]() Mary In The SkyAcheteuse Inscription : décembre 2011 Messages : 12 ![]() |
Je serai chez moi dans quelques heures. Je pourrais donc imprimer et tester ce que tu me suggères. Au plus tard demain matin. Je n'arrive jamais à faire la grasse matinée.
Mais voici d'ores et déjà quelques questions & réponses : - dans ton premier code, icount=7, je suppose, - et dans ton deuxième code (celui avec les BU), icount devrait être égal à 3, c'est ça ? Pour la deuxième partie de code, voici, en bon français, ce que c'est sensé faire : 1. Vérifier si on n'a pas plus de 1 valeur dans les 6 cellules où on met une croix (Report_BU1et Report_BU2). C'est moi qui ait dû enlever ce test quand j'ai enlevé tout comptage des erreurs. 2. S'il n'y a pas de doublon, le code doit trouver la valeur non-nulle dans les 6 cases, prendre le titre de la case juste à gauche "Offset(0;-1)" et l'enregistrer dans BU. (Ca, c'est du code de mon prédécesseur que j'ai laissé tel quel. C'est vrai qu'il est un peu tirer par les cheveux...) Au fait, avec mes cellules qui contiennent plusieurs conditions pour le même format conditionnel, est-ce que je peux écrire un truc du genre... ? Code :
|
||
|
|
00
|
|
|
#12 | |||||||||
|
Expert Confirmé Sénior
![]() ![]() |
Salut
Je serais surement dans le quoi demain matin, entre deux passages à la cuisine icount est défini au dessus (partie que je n'ai pas affichée) dans ton code d'origine. Donc dans ce cas la oui il y a 7 cellules dans la plage nommée, mais ça fonctionne quelque soit la taille des plages du moment qu'elles sont symétriques. D'ailleurs ton prédécesseur (ou toi) à voulu rendre cette partie évolutive en regardant le nombre de cellule contenu dans la plage nommée mais ensuite le tableau qui contient l'ensemble a une dimension fixe. il serait préférable si le besoin de flexibilité est réel, de dimensionner le tableau en fonction de icount et jcount Code :
Citation:
Citation:
Citation:
Code :
Qwaz
__________________
MagicQwaz := Harry Potter la baguette en moins ![]() Le monde dans lequel on vit HammerFest Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer |
|||||||||
|
|
00
|
|
|
#13 | ||
|
Invité de passage
![]() Mary In The SkyAcheteuse Inscription : décembre 2011 Messages : 12 ![]() |
Je ne comprends pas tout dans la fonction qui transforme une formule locale en formule en anglais :
Code :
Code :
If Application.Evaluate(Formu1) Then Debug.Print TheCell.Address |
||
|
|
00
|
|
|
#14 |
|
Expert Confirmé Sénior
![]() ![]() |
Salut
Tu as repris un code d'essai, qui permettait juste de mettre en évidence l'utilisation du evaluateFR, Debug.print affiche juste l'adresse des cellules ayant un MFC validé, l'affichage se fait dans la fenêtre Execution de l'environnement VBA. RetourEval ne sert a rien ici, j'avais utiliser cette variable de type variant pour regardé la valeur retourné par evaluate sans que le code plante si la fonction renvoyé une erreur (le type variant peut contenir n'importe qu'elle type, y les erreur) Regarde mon message n°9, il y a la fonction EvaluateFr() en état d'utilisation. N'hésite pas à poster ton code une fois les corrections effectuées. ++ Qwaz
__________________
MagicQwaz := Harry Potter la baguette en moins ![]() Le monde dans lequel on vit HammerFest Ma page perso DVP - Dernier Tutoriel : VBA & Internet Explorer |
|
|
00
|
|
|
#15 | ||||||||||
|
Invité de passage
![]() Mary In The SkyAcheteuse Inscription : décembre 2011 Messages : 12 ![]() |
Bon, j'ai fait l'ensemble des modifications que tu m'as suggérées et il me semble voir le bout du tunnel...
J'ai créé la fonction suivante pour évaluer la formule associée à un Format Conditionnel quelle que soit la langue de l'utilisateur : Code :
Code :
Sauf pour deux cellules Code :
Code :
AlwaysEvaluate = Evaluate(.[B2].Formula) Code :
Code :
If AlwaysEvaluate(CondFormat.Formula1) Then J'ai le même cas de figure avec Report_PurchaserGlobal et Report_Negotiator, pour lesquels la même formule de MFC s'applique. J'ai essayé d'exécuter AlwaysEvaluate() sur l'union de ces deux Ranges, mais j'obtiens le même message d'erreur ![]() Code :
|
||||||||||
|
|
00
|
|
|
#16 |
|
Membre Expert
![]() Sebastien LIngénieur Financier Inscription : mars 2010 Messages : 880 ![]() |
Je prends le truc en cours et je n'ai pas tout regardé en détail, donc veuillez m'excusez si je suis à coté de la plaque.
Mais il y a un question de conception qui me chagrine un peu. A mon sens ce serait plus propre de recompter les cellules qui correspondent aux conditions que tu as mis dans tes MFC plutôt que de tester ce que donne la MFC. Surtout étant donné les problème de langue que ça suggère. Tu pourrais même créer une fonction de vérification que tu utilises à la fois dans ta MFC et dans ton comptage.
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer « Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell |
|
|
00
|
|
|
#17 |
|
Invité de passage
![]() Mary In The SkyAcheteuse Inscription : décembre 2011 Messages : 12 ![]() |
Bonjour ZèbreLoup,
Tu veux dire écrire la même condition dans la macro et dans la MFC ? |
|
|
00
|
|
|
#18 |
|
Membre Expert
![]() Sebastien LIngénieur Financier Inscription : mars 2010 Messages : 880 ![]() |
Soit écrire la même condition dans la macro et la MFC
Soit écrire une fonction booléenne qui vérifie les conditions et l'utiliser dans la macro et la MFC Je manque sans doute d'ouverture d'esprit sur le coup, mais c'est vrai que pour moi, la MFC sert à faire de la "mise en forme", c'est tout. Et je n'aime pas trop passer par de la mise en forme pour tester des choses. Parce que sinon, pour ton problème, si par exemple ta MFC mets le fond de ta cellules en rouge, il aurait aussi suffit de compter le nombre de cellules avec un fond rouge. C'est simple, mais pour moi, source d'erreurs potentielles. Tu peux partager ou non mon point de vue, je ne m'offusquerais pas !
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer « Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell |
|
|
00
|
|
|
#19 |
|
Invité de passage
![]() Mary In The SkyAcheteuse Inscription : décembre 2011 Messages : 12 ![]() |
En fait, ce qui se passe, c'est que j'ai une 30aine d'informations à récupérer par ci par là dans mon fichier Excel et qu'à chacune de ces infos, il peut y avoir de 2 à 5 conditions de MFC.
Au départ, les conditions étaient dans la macro et il n'y avait pas de mise en forme conditionnelle, mais les erreurs reconnues étaient bien moins nombreuses et il fallait attendre d'avoir exécuté la macro pour les reconnaître. Pour ce qui est de reconnaître la mise en forme (le fond de la cellule, par exemple), j'ai essayé. Mais Excel ne semblait pas faire la différence entre les cellules où la MFC était appliquée et les autres. Ce que m'a proposé Qwaz marche plutôt bien jusqu'à présent. Je vais remettre le code en ligne pour que vous le voyez dans son intégralité. |
|
|
00
|
|
|
#20 |
|
Membre Expert
![]() Sebastien LIngénieur Financier Inscription : mars 2010 Messages : 880 ![]() |
Ecoute, si ça marche, c'est l'essentiel. Désolé d'avoir voulu mettre mon grain de sel
![]() En plus je ne peux même pas regarder si mon approche pouvait fonctionner car je suis sous 2003... Bon courage pour la suite
__________________
« Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer « Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com