Problème vba findNext

Fermé
Signaler
-
Messages postés
24222
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
29 novembre 2021
-
Bonjour,

Je cherche vérifier si j'ai les ressources suffisantes pour répondre à un besoin.

Je boucle donc sur ma feuille besoin et ma feuille ressources avec la fonction findNext, et quelques conditions en fonction de la disponibilité de la ressource.

Je tourne mon code dans tout les sens mais je ne parviens pas au bon résultat.
La boucle findnext ne fonctionne pas et je ne parviens pas a corriger.
Je joins un fichier avec le code que j'ai réalisé. En colonne T le résultat de la Macro.
En colonne U ce que j'attend comme résultat

http://www.cjoint.com/c/GGmqVPjxzj2

Je ne manquerai pas de donner plus de précision si besoin.
Merci d'avance pour vos conseils.

3 réponses

Messages postés
24222
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
29 novembre 2021
6 980
Bonjour,

quand tu fais .findnext tu as fait d'autres .find dans ta boucle.
Tu as donc perdu toutes les conditions du 1er find puisque tu ne conserves que les derniers paramètres utilisés.
Fait à la place un .find avec what, after, lookin et lookat
eric
Bonsoir eriiic,

merci de ta réponse rapide,

Je viens de regarder pour modifier le code comme tu me le suggères, mais cela ne change rien,

Est ce que tu m'apporter quelques précisions supplémentaires ?
mes conditions ne sont peut être pas non plus idéalement construites ?

Merci d'avance.
Messages postés
24222
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
29 novembre 2021
6 980
si le what et le after correspondent bien à ce que tu veux, et toi seul le sait, tu devrais trouver la cellule suivante qui t'intéresse.
Je ne me rappelle plus trop ton fichier et je n'ai pas lu tout le code vu sa longueur, mais le what devrait être celui du 1er find.
Quand au after c'est toi qui sait. Soit tu dois repartir du range trouvé par le 1er find dans ce cas il faut l'avoir mémorisé, soit tu dois repartir du range (ou de sa ligne) trouvé par le dernier find.
Fait en pas à pas ou met un Stop avant ton ex-findnext et regarde les valeurs des paramètres transmis à find, ils doivent être ce que tu as prévu.

Edit :
Pour expliquer autrement car ce n'est pas facile à expliquer, ne considère pas que le .find que tu considère de premier niveau garde dans un coin ce que tu as cherché et où il l'a trouvé pour te le restituer quand tu as fini tes find de 2nd niveau. Il a une mémoire de poisson rouge... Il faut lui redire (d'où le .find au lieu du .findnext) quoi et à partir de quelle cellule.
C'est un peu plus clair ?
Messages postés
24222
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
29 novembre 2021
6 980
Edit2

Je t'ai indiqué l'erreur la plus classique avec .find mais j'ai commencé à regarder ton code d'un peu plus près et il y a un peu à redire...

Méfie-toi des propriétés par défaut, surtout si tu peines à le faire fonctionner :
If Sheets("Paramètres").Columns(1).Find(C.Offset(0, 3),...
si c'est .value que tu cherches et il faut l'écrire : C.Offset(0, 3).value

2 ligne plus bas :
Rows(Ligne).Copy
Rows(Ligne + 1).EntireRow.Insert Shift:=xlUp
Rows de quel sheets ? WsB ?Tu as défini des variables courtes , sers-toi en : WsB.Rows(Ligne).Copy
Plus d'ambiguité possible pour le lecteur, qui sera toi dans 6 mois quand il faudra faire des modif

Et pour finir :
J'ai l'impression que tous tes autres .find sont juste pour contrôler la présence d'une lettre dans Paramètres.
Pourquoi ne pas utiliser un simple nb.si pour ça :
If Application.CountIf(Sheets("Paramètres").Columns(1), C.Offset(0, 3).value) = 0 Then
Et pour le suivant tu recherches en colonne 9 qui est vide (?!?)
Si c'est bon comme ça plus qu'un seul .find
Bonjour eriiic,

Je remets le fichier modifié avec tes conseils.
Par contre, la fonction CountIf ne fonctionne pas.
Erreur 424.

J'ai modifié le Numéro de la colonne ou vérifier la présence d'une lettre.. il s'agit bien de la colonne 1.

J'ai supprimer quelques conditions pour en simplifier la lecture..

http://www.cjoint.com/c/GGni5DlcFLg

Avec un seul fond cela simplierai la compréhension.. (pour moi au moins, je ne suis pas un pro) ^^
Est ce que tu peux regarder ce qui bloque à nouveau ?

Encore merci
Messages postés
24222
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
29 novembre 2021
6 980
Bonjour,

ah ouais mais là tu mets n'importe quoi...
Il faut quand même acquérir les bases et faire preuve d'un minimum de logique si tu veux programmer.

WsB(Ligne) = WsB(Cel).Row

C'est quoi WsB(Ligne) pour toi ? J'ai dit de mettre ça ?
Ligne est une variable numérique et n'a aucun lien avec une quelconque feuille.
D'ailleurs je viens de voir que tu l'as déclarée et typée (très bien ça) mais As integer.
Integer va jusqu'à 32657 et tu as 1 millions de lignes... mettre As Long

et WsB(Cel)
Aucun sens. En plus Cel est un Range donc il connait son parent (la feuille) et le parent de son parent (le classeur), il est parfaitement identifié sans ambiguïté possible.

If Application.CountIf(Sheets("Paramètres").Columns(1), C.Offset(0, 2).Value) = 0 Is Nothing

Comment veux-tu que ça fonctionne ça ? Que vient faire is nothing ici ?
Is Nothing se réfère à un objet et tu as un nombre...
nb.si compte le nombre de fois où "x" est présent dans la colonne.
Le test c'est seulement si=0 (=absent)

Programmer c'est 10% de codage et 90% de débogage (pour toi peut-être 99% ;-) mais tout le monde a démarré comme ça)
Le B.A.BA du débogage : https://www.commentcamarche.net/contents/1381-debogage
Prend vraiment le temps de tout lire, surtout points d'arrêt et espions.
Avec un peu d'entrainement tu trouveras tes erreurs tout seul et progressera plus vite.
Par exemple tu affiches la fenêtre espion (menu affichage).
Et quand ça plante soit tu amènes le curseur sur une variable où tu as un doute et tu peux lire sa valeur, ou bien tu sélectionnes une variable ou une expression (comme Application.CountIf(Sheets("Paramètres").Columns(1), C.Offset(0, 2).Value) que tu fais glisser dans la fenêtre espion pour voir son évolution.
Et sert-toi du pas à pas (F8)

Ca aussi pourrait intéresser comme livre de chevet : Cours VBA