Problème vba findNext
Fermé
Dan
-
12 juil. 2017 à 18:54
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 - 13 juil. 2017 à 12:00
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 - 13 juil. 2017 à 12:00
3 réponses
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 255
12 juil. 2017 à 19:38
12 juil. 2017 à 19:38
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
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.
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.
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 255
Modifié le 12 juil. 2017 à 22:55
Modifié le 12 juil. 2017 à 22:55
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 ?
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 ?
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 255
Modifié le 12 juil. 2017 à 23:29
Modifié le 12 juil. 2017 à 23:29
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
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
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
eriiic
Messages postés
24603
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
15 décembre 2024
7 255
Modifié le 13 juil. 2017 à 12:03
Modifié le 13 juil. 2017 à 12:03
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.
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.
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
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