problème de compteur - VB/VBA/VBS - Programmation
Marsh Posté le 04-03-2013 à 11:09:56
j'ai pourtant arreté ma macro en pleine exécution afin de vérifier dans le code les valeurs de mes variables, et dans mon If, le compteur j n'a pas pour valeur 768 ...
Marsh Posté le 04-03-2013 à 11:16:55
Juste comme ça sans avoir regardé en détail le code, pourquoi tu as pas utilisé la fonction Excel VLOOKUP (ou RECHERCHEV en français) ? J'ai l'impression que ça fait exactement ce que tu veux et ça t'aurait évité de coder.
Marsh Posté le 04-03-2013 à 11:19:48
euh... parce que je n'ai jamais utilisé cette fonction
je vais essayer
Marsh Posté le 04-03-2013 à 11:24:05
je dois faire dans ma boucle For i :
Code :
|
?
mais comment je peux faire pour mes compteurs? pour vérifier s'il a trouvé quelquechose?
Marsh Posté le 04-03-2013 à 11:28:32
Si tu utilises cette fonction (regarde comment ça marche, ya pas mal de sites qui expliquent), elle renvoie la valeur #N/A dans le cas où aucune ligne n'a été trouvé.
Du coup pas besoin de compteur ni même de code en macro, t'aurais une formule du genre IF(ISNA(VLOOKUP(...))) dans ta Sheet3.
C'est une fonction extrêmement utile et très puissante d'Excel. Je recommanderais de regarder comment ça fonctionne.
Marsh Posté le 04-03-2013 à 11:36:42
Ca doit être une formule du genre :
=IF(ISNA(VLOOKUP(Sheet2!A1:A5;Sheet1!$A$1:$B$5;2;FALSE));"Pas trouvé !";"Trouvé !" )
à appliquer dans les cellules de ta Sheet3
Marsh Posté le 04-03-2013 à 11:47:55
Code :
|
Citation : Sub ou Fonction non définie |
je dois ajouter une référence pour utiliser VlookUp? (Excel 2002)
Marsh Posté le 04-03-2013 à 11:50:25
Ce que tu viens d'écrire renvoie Pas trouvé ou trouvé c'est ça?
est-ce que tu pourrais détailler ta ligne?
je comprends l'utilisation de VlookUp, mais les ; après je ne sais pas...
Marsh Posté le 04-03-2013 à 11:52:06
et le IF(ISNA(vlookup) ...
ISNA correspond à ce qu'a renvoyé vlookup?
genre : Si la fonction vlookup n'a rien trouvé (ISNA) alors ...
?
Marsh Posté le 04-03-2013 à 13:16:16
minimoack a écrit : et le IF(ISNA(vlookup) ... |
Oui le N/A c'est le retour du VLOOKUP. Dans ton cas tu cherches en colonne 5 c'est ça ?
Du coup ça donnerait :
=IF(ISNA(VLOOKUP(Sheet2!E1:E65536;Sheet1!$A$1:$E$65536;5;FALSE));"Pas trouvé !";"Trouvé !" )
(colonne 5 dans le tableau Sheet1!$A$1:$E$65536, colonne E dans la Sheet2).
Ensuite le ISNA, si vrai retourne "Pas trouvé", sinon retourne "Trouvé". Mais si tu veux tu peux retourner la ligne en question à la place.
Marsh Posté le 04-03-2013 à 13:21:18
minimoack a écrit :
|
Le code que je t'ai donné n'est pas un code de Macro. C'est une formule à appliquer directement aux cellules de ta Sheet3. Je pense que tu n'as pas besoin de code VB dans le cas présent.
Marsh Posté le 04-03-2013 à 13:56:46
Yonel a écrit : |
En fait, mon but, est qu'à l'ouverture d'un certain fichier, ces actions s'effectuent automatiquement, afin de permettre un gain de temps non négligeable. C'est pour cela que je fais une macro. Mon programme principal est dans le Workbook_Open, afin de s'exéctuer lors de l'ouverture du fichier, puis il appelle cette fonction.
Marsh Posté le 04-03-2013 à 14:01:44
minimoack a écrit : |
A ce moment là la partie importante c'est le VLookup. Le ISNA n'est là que pour pouvoir exploiter le résultat. Essaye de coder ta macro en utilisant VLookup seulement, pour voir si tu as aussi un problème de références.
Marsh Posté le 04-03-2013 à 14:04:42
En fait, si une donnée de la feuille 1 est également dans la feuille 2, c'est une donnée sensible, et je dois donc récupérer la ligne de cette donnée pour la mettre en feuille 3, et répertorier le numéro de la ligne de cette donnée en feuille 1 et en feuille 2 afin de les mettre en feuille 3...
Marsh Posté le 04-03-2013 à 14:07:40
Essaye la fonction Match dans ce cas, ça permet de renvoyer le numéro de ligne.
Marsh Posté le 04-03-2013 à 14:15:05
pour Match, il me met le même message d'erreur que pour VlookUp, "sub ou function non définie" ...
Marsh Posté le 04-03-2013 à 14:17:34
Essaye de préfixer avec genre :
Application.Match
Application.WorksheetFunction.Vlookup
Marsh Posté le 04-03-2013 à 14:24:44
j'ai mis
Code :
|
et ça me donne :
"Impossible de lire la propriété VLookUp de la classe WorkSheetFunction"
...
Marsh Posté le 04-03-2013 à 14:28:36
Copie/colle l'erreur dans google ya plusieurs solutions, notamment une sur ce même forum :
http://forum.hardware.fr/hfr/Progr [...] 9417_1.htm
http://www.commentcamarche.net/for [...] p-vba-2003
Marsh Posté le 04-03-2013 à 14:37:18
le vlookup ne fonctionne que si la valeur à rechercher est dans la première colonne?
Marsh Posté le 04-03-2013 à 14:38:29
Code :
|
parce que moi c'est en colonne 5 dans les 2 feuilles
Marsh Posté le 04-03-2013 à 14:39:26
Non normalement tu passes l'index de la colonne à chercher en 3ème paramètre. En tout cas c'est comme ça que ça fonctionne en formule, en macro je ne sais pas mais j'imagine que c'est similaire.
Marsh Posté le 04-03-2013 à 14:41:09
Après, ma fonction initiale fonctionnait très bien, excepté le compteur j qui me retournait ligneMaxSh2, le copier/coller fonctionnait correctement, et ma macro trouvait les correspondances entre les 2 feuilles, et me les mettait en feuille 3... tu n'aurais pas une idée pour j?
Marsh Posté le 04-03-2013 à 14:42:52
Yonel a écrit : Non normalement tu passes l'index de la colonne à chercher en 3ème paramètre. En tout cas c'est comme ça que ça fonctionne en formule, en macro je ne sais pas mais j'imagine que c'est similaire. |
http://forum.hardware.fr/hfr/Progr [...] 9417_1.htm
dans le lien que tu m'as donné, le problème était que la valeur qu'on recherchait n'était pas dans la première colonne.
ici, on recherche une valeur DE la 5ème colonne de la feuille 1 DANS la 5ème colonne de la feuille 2
Marsh Posté le 04-03-2013 à 14:57:58
minimoack a écrit : Après, ma fonction initiale fonctionnait très bien, excepté le compteur j qui me retournait ligneMaxSh2, le copier/coller fonctionnait correctement, et ma macro trouvait les correspondances entre les 2 feuilles, et me les mettait en feuille 3... tu n'aurais pas une idée pour j? |
Mmmh c'est assez difficile de débugger un cas comme ça en lisant le code. Essaye d'exécuter en pas-à-pas pour voir ce qui se passe dans ta boucle avec j.
Pour le VLookUp en VBA il doit y avoir moyen de le faire fonctionner, d'habitude je l'utilise en formule donc je sais pas. Tu peux ptet essayer avec Index(Match(,,0) si tu es bloqué sur ton premier code.
Marsh Posté le 04-03-2013 à 15:38:26
Bonjour ! Comme cela à la louche (en ce moment je n'ai pas trop le temps), je crois bien déceler une erreur de conception
dans ton code de départ : à quoi sert ta boucle j en ligne 22 ?
Ensuite pour les lignes 25 à 32, c'est dommage (encore !) de travailler à coups d'horribles Activate / Select
alors que c'est bien plus efficace de gérer directement les objets ‼
Marsh Posté le 04-03-2013 à 15:41:13
pour la boucle, effectivement, je me rends compte qu'elle est de trop merci
qu'entends-tu par "gérer directement les objets" ?
merci de m'accorder un peu de temps
Marsh Posté le 04-03-2013 à 15:56:57
et en fait, je viens de regarder un peu, la boucle j me permet de récupérer le numéro de la ligne de la feuille 2
Marsh Posté le 04-03-2013 à 16:18:04
Code :
|
ça, ça fonctionne
Marsh Posté le 04-03-2013 à 17:44:00
Et oui avec un peu de réflexion !
Sinon en lisant l'aide par exemple de la méthode Copy (je n'invente rien …), avec l'existence de son argument Destination,
tes six lignes n°4 à 9 de ton dernier code peuvent (doivent !) être remplacées par une seule, si si ‼
ActiveWorkbook.Sheets(nomFeuil1).Rows(i).Copy ActiveWorkbook.Sheets(nomFeuil3).Rows(k) |
En clair, voilà comment travailler efficacement avec les objets sans recourir aux affreux ralentisseurs Activate & Select !
Quant aux lignes n°10 & 11, il faudrait alors y préciser leur feuille …
Marsh Posté le 05-03-2013 à 09:02:19
ok merci
je débute en vba, donc j'ai encore un peu de mal
Marsh Posté le 04-03-2013 à 10:57:55
Bonjour!
J'ai un fichier avec 3 feuilles. je fais une boucle qui pour chaque cellules de la colonne 5 de la feuille 1, cherche une correspondance dans la colonne 5 de la feuille 2. Si on trouve une correspondance, on copie/colle la ligne de la feuille 1 dans la feuille 3.
Afin de faciliter les recherches des lignes après l'execution de la macro, j'ai rajouté deux colonnes à mon tableau qui contiennent le numéro de la ligne de la feuille 1, et le numéro de la ligne correspondante dans la feuille 2.
voici mon code :
Le "Cells(k, 11).Value = i" fonctionne correctement, et m'indique bien le numéro de ma ligne de la feuille 1.
Par contre, le "Cells(k, 12).Value = j" ne marche pas, et m'indique constamment 768, qui correspond à la valeur de ligneMaxSh2 ...
une idée?
merci