Certaines recherches n'aboutisses pas

Bonjour,

J'explique le titre:

Dans le classeur ci-joint, j'encode mes données dans "NE" ensuite je fait une recherche, par Atelier ou par n° de commande, sur la première feuille, mais c'est là que sa coince!

Quand je fais ma recherche par "atelier" pas de soucis, il m'affiche bien toutes les commandes correspondantes.

Par contre par n° de commande, il y en à certaines où il m'indique un message d'erreur ! (ex. à ce jour: 16358 et 16887)

a ep3

Mais cette commande est pourtant bien encodée dans "NE"

a ep4

En effectuant quelques tests, j'ai remarqué que cela démarrait à partir de la ligne 324 de la feuille "NE"! Toutes les lignes avant, aucun soucis.

C'est un soucis assez spéciale ou aléatoire, car j'ai eu le coup avec les com. 17312, 17372, 17370, 17313, 17211qui pour finir, s'affiche dans ma recherche, c'est là que je ne comprend pas!!

De plus j'ai masqué les lignes que je ne voulais pas voir et je n'arrive pas à les ré-affichées!

Merci pour votre aides, si vous comprenez pourquoi?

28atelier.xlsm (68.09 Ko)

Bonjour,

La 16358 existe bien ! Tu supprimes ta liste de validation et tu tapes, et tu l'auras. Le message d'erreur provient de ce qu'elle n'est pas dans la liste, d'où la validation bloque...

Pas le temps d'aller plus avant pour savoir pourquoi la validation renâcle.

Tes listes ne sont pas cascade et ne jouent aucun rôle complémentaire dans la recherche, Les deux types de recherche sont donc concurrents. Il conviendrait donc qu'une sélection en C3 efface C6 et vice-versa.

D'autre part, il serait bon que ta liste soit triée, cela faciliterait.

In-extremis ! Peut-être la raison (ou une raison du problème : une cellule vide dans tes numéros de factures, tu perdras donc une ligne dans ta plage nommée dynamiquement.

Et il se trouve que la 16358 est justement en fin de liste !

Cordialement et bon courage pour poursuivre.


Petit rectificatif :

Dans la définition de plage, tu ne perds pas une ligne puisque pas de -1 au nombre de lignes, mais utilisant NB et non NBVAL, tu as en outre 12 ? qui ne sont pas des nombres, tu en perds donc 13 !

En outre, le nombre de colonnes est défini à : -1.

Il faut certainement commencer par mettre de l'ordre dans cette formule.

Bonjour MFerrand,

Je te remercie de t'être penché sur mon soucis

La majorité du code VBA est de "belkacem64" car je suis tout nouveau dans ce langage.

Je vais essayer de voir ce que je peut modifier, pour éviter ce genre d'erreurs.

Mais, y a t'il une solution pour afficher les colonnes masquées? J'ai déjà essayé le clic droit sur la dernière colonne visible et "afficher", et rien !?

Tu tapes I1 dans la zone Noms (à gauche de la barre de formule.

Tu appuies sur Entrée pour valider.

Tu enfonces la touche Maj et pendant qu'elle est enfoncée tu cliques sur le A (en-tête de la colonne A). Cela aura sélectionné toutes les colonnes de A à I.

Clic droit > Afficher et les colonnes masquées dans cet intervalle s'affichent.

Cordialement.

je te remercie pour l'affichage des colonnes, ce problème là est résolut.

Je cherche pour le reste et je valide ce post une fois le problème résolut.

Bonsoir,

MFerrand a écrit :

Bonjour,

La 16358 existe bien ! Tu supprimes ta liste de validation et tu tapes, et tu l'auras. Le message d'erreur provient de ce qu'elle n'est pas dans la liste, d'où la validation bloque...

Pas le temps d'aller plus avant pour savoir pourquoi la validation renâcle.

Tes listes ne sont pas cascade et ne jouent aucun rôle complémentaire dans la recherche, Les deux types de recherche sont donc concurrents. Il conviendrait donc qu'une sélection en C3 efface C6 et vice-versa.

D'autre part, il serait bon que ta liste soit triée, cela faciliterait.

In-extremis ! Peut-être la raison (ou une raison du problème : une cellule vide dans tes numéros de factures, tu perdras donc une ligne dans ta plage nommée dynamiquement.

Et il se trouve que la 16358 est justement en fin de liste !

Cordialement et bon courage pour poursuivre.


Petit rectificatif :

Dans la définition de plage, tu ne perds pas une ligne puisque pas de -1 au nombre de lignes, mais utilisant NB et non NBVAL, tu as en outre 12 ? qui ne sont pas des nombres, tu en perds donc 13 !

En outre, le nombre de colonnes est défini à : -1.

Il faut certainement commencer par mettre de l'ordre dans cette formule.

Eh bien je ne trouve pas la solution, j'ai épluché le code et les formules pour voir ce que je pouvais modifier,... je sèche..

Depuis j'ai inséré des données dans "NE" et celles qui ne passait toute à l'heure fonctionnes, mais d'autres pas! voir ligne en rouge dans "NE"

24atelier-copie.xlsm (84.43 Ko)

Bonjour,

J'avais signalé quelques pistes... qui ne t'ont apparemment pas émues...

Cordialement.

Bonsoir,

MFerrand a écrit :

J'avais signalé quelques pistes... qui ne t'ont apparemment pas émues...

Si si, j'ai regardé, mais je dois dire que comme ce n'est pas moi qui ai fait le code, j'ai du mal à m'y retrouver, j'ai corrigé certaines choses, qui on fait que, ce qui ne fonctionnait pas hier fonctionne maintenant, mais pour combien de temps !!!

Je vais encoder des choses maintenant et je verais bien

ARRRFFFffff, je m'arracher les cheveux.....

Sa recommence... là je vais avoir besoins d'aide, je ne sais pas ou ça coince "MFerrand" ou "belkacem64" help !!

j'essaye de comprendre les pistes que tu m'as données "MFerrand", mais pas encore suffisamment doué en vba pour comprendre

j'ai fais des tris sur les n° de commandes, sur les dates (croissant et décroissant) et le problème est toujours là!

Mais jamais avec les mêmes commandes!

Je remarque maintenant que ce sont souvent une ou quelques une des dernières ajoutées.

"MFerrand" tu me parlais de ligne a -1 et de NBVAL!, pourrais-tu m'en dire plus?

Bonne soirée

PS/ je remet le fichier avec les dernières commandes au "12-12-16" et le tri

22ne-atelier.xlsm (84.86 Ko)

J'aurais mieux fait de commencer par virer tous tes noms et toutes tes macros, j'y aurais passé moins de temps !

C'est ce qui s'est en gros passé à la fin... Inutile donc de rechercher ton ancien code !

Commençons par le commencement !

Les diverses formes dessinées, images ou autres, cela se renomme lorsque cela va interférer avec des macros.

Pour renommer, on sélectionne la forme, on va ensuite sélectionner le nom dans la zone nom, on en retape un judicieusement choisi, on valide par Entrée. On désélectionne. On vérifie par la suite en sélectionnant que le nouveau nom est bien effectif...

L'intérêt de renommer : on peut affecter la même macro à plusieurs objets, la propriété Application.Caller permet à la macro de savoir quel bouton a été actionné en renvoyant son nom, ce qui permet de se limiter à une seule macro là où on en mettait plusieurs, pour faire le même travail.

Sur NE : les flèches servant au tri, respectivement renommées : Projet1, Projet0, Date1, Date0.

Du 1 ou 0, on déduira l'ordre de tri. Du reste du nom, on déduira la colonne sur laquelle trier.

Un procédure pour remplacer les 4, et qui en lui ajoutant un argument optionnel, peut également être appelée par d'autres macros.

Même chose pour Début et Fin : une seule proc. peut effectuer le déplacement voulu.

De même pour les croix rouges sur RECHERCHER, renommées Efface3 et Efface6, elles pointent vers une même proc.

Pour les noms : une réorganisation s'imposait :

NEatelier => =DECALER(NE!$A$1;;;NBVAL(NE!$A:$A))

Le noms est dynamique, concerne la 1re colonne de la feuille, inclut l'en-tête (on décale à partir de la ligne 1 et on ne soustrait pas 1 correspondant à l'en-tête).

Pourquoi : parce qu'on utilisera le filtre avancé sur cette feuille, qui exige l'en-tête...

Pas d'autres noms sur la feuille, celui-ci suffira pour définir n'importe quelle plage.

Sur la feuille ATELIER :

En A : LstAtelier => =ATELIER!$A$2:$A$5

Je l'ai laissée fixe. J'en ai seulement exclu la cellule vide (double emploi avec la croix rouge).

Elle alimente la liste en C3.

En K : Crit => =ATELIER!$K$1:$K$2

Zone de critères à utiliser pour le filtrage avancé. K2 accueillera la sélection faite en C3. Ce qui permet de filtrer par atelier lorsque une valeur en C3, et tous ateliers confondus si rien en C3.

Le résultat du filtrage se retrouve en colonnes C et D. Seule la colonne D est nommée :

LstProjet => =DECALER(ATELIER!$D$2;;;NBVAL(ATELIER!$D:$D)-1)

Là on dimensionne avec -1 et à partir ligne 2 (intitulé exclus). Alimente la liste en C6.

Ce dispositif permet de rendre la liste en C6 dépendante de C3.

Ça ne l'était pas, et c'est pourtant préférable !

Les procédures :

On a déjà évoqué : TriProjetDate (proc. de tri), DébutFin (déplacement), Efface (effacement C3 ou C6).

Deux complètent le dispositif :

Lister : effectue le filtrage indiqué ci-dessus.

Rechercher : effectue la recherche (entièrement réécrite)

Elle efface la recherche antérieure, puis parcourt la base en retenant les lignes correspondant aux critères sélectionnés, selon l'un des 3 cas : 1-valeur en C3/C6 vide, 2-C3 vide/valeur en C6, 3-valeur en C3/valeur en C6. Elle constitue un tableau de résultats et l'affiche.

Le lancement de la recherche est fait à partir de l'évènement Change s'il concerne C3 ou C6, mais contrairement à ce qui se passait avant : si C3 change, C6 est effacé, la zone de critère est servie, le filtrage est effectué, puis la recherche lancée. Si C6 change, seule la recherche est lancée.

La colonne I qui accueillait antérieurement un filtrage est supprimée.

Deux modules sur 3 sont supprimés (un seul suffit amplement !)

Il ne te reste plus qu'à étudier l'ensemble...


Bonjour MFerrand

Un grand merci pour tout et le temps que tu m'as consacré, ta lecture fut très constructive

Je vais éplucher cela ce soir après le boulot à mon aise.

Je pense en fait, que je me suis lancé dans une démarche trop compliquée pour mes compétences

Je suis autodidacte et aime apprendre, mais surtout pouvoir comprendre mes erreurs, le travail que vous avez fourni, vas pouvoir (enfin j'espère) m'aider à comprendre les subtilités du vba et les raccourcis à utilisé pour évité les macros double emploi.

Par la même occasion je vais refaire un tour par ici: https://www.excel-pratique.com/fr/formation.php

Même ci je suis inscrit que depuis peut, cela fait longtemps que je m'informe et que j’apprends des choses par le site et j'ai toujours été surpris et admiré par l'entraide qu'il pouvais y avoir. car bcp d'autre site n’atteint pas celui-ci dans le dévouement.

Bonjour,

Les compétences viendront et s'accroîtront... Il me semble que là le problème venait du fait de la double modalité de recherche, dont tu n'avais pas poussé la simultation jusqu'au bout... Pour le reste, tu assimileras divers trucs pour améliorer au fur et mesure.

Bonne continuation.

Bonsoir MFerrand,

Après une re-lecture approfondie et avec le code et les formules sous les yeux, je commence à comprendre

Dans ton explication (très bien faite ) il y a une petite contradiction (si je peut me permettre, sauf si je me trompe) par rapport au code:

Le lancement de la recherche est fait à partir de l'évènement Change s'il concerne C3 ou C6, mais contrairement à ce qui se passait avant : si C3 change, C6 est effacé, la zone de critère est servie, le filtrage est effectué, puis la recherche lancée. Si C6 change, seule la recherche est lancée.

En surligner, signifie bien que, ci les deux cellules ont une valeur, la recherche commence?

Case 1: If .Cells(i, 1) = At Then Rin = True
                Case 2: If .Cells(i, 2) = Pr Then Rin = True
                Case 3: If .Cells(i, 1) = At And .Cells(i, 2) = Pr Then Rin = True

Pourtant, quand je test il réagi bien comme ton explication! j'inscris une valeur dans C3 il efface C6 et inversement!

Pas de zone de "critère pour la sélection faite en C6? Normale? d'où peut-être mon problème de valeur en C6 (Voir NB fin de message)

En K : Crit => =ATELIER!$K$1:$K$2

Zone de critères à utiliser pour le filtrage avancé. K2 accueillera la sélection faite en C3. Ce qui permet de filtrer par atelier lorsque une valeur en C3, et tous ateliers confondus si rien en C3.

NB:

  • En faisant ce test, si il y a une valeur dans C6 pas de résultats? Mais en C3 oui.
  • Si je fais une erreur de frappe dans la cellule C3, j'ai "erreur d'execution '424' objet requis", mais pas en C6

Au plaisir de te relire

- Si je fais une erreur de frappe dans la cellule C3, j'ai "erreur d'execution '424' objet requis", mais pas en C6

d'avoir mis le doigt là-dessus !

Pas la première fois, mais comme la liste de C6 a été effacée, à partir de la 2e fois, elle n'existe plus, d'où l'"objet requis" lors de son effacement ! Et pas de moyen d'en sortir .

Le truc pour relancer, c'est de taper un caractère en D2 (ATELIER) ce qui redonne une existence à la plage.

Mais en amont, cela a été provoqué par le fait qu'une frappe hors liste en C3 n'a pas été bloquée par la validation, et ce parce la liste contenait toujours une cellule vide malgré ce que j'ai affirmé, pensant l'avoir supprimée ! (j'avais donc rétabli l'ignorance des vides dans la validation, pour pouvoir effacer.. et c'est l'existence de ce vide dans la validation qui a provoqué le phénomène...)

Pour l'éliminer, il faut donc rectifier la définition de la plage LstAtelier :

=ATELIER!$A$2:$A$4

(remplacer le 5 par 4).

Ceci dit, pour éliminer tout risque de survenance de ce problème :

Sub Lister()
    On Error Resume Next
    [LstProjet].Offset(, -1).Resize(, 2).ClearContents
    On Error GoTo 0
    With Worksheets("ATELIER")
        TriProjetDate "Projet1"
        [NEatelier].Resize(, 2).AdvancedFilter xlFilterCopy, [Crit], .Range("C1:D1"), True
    End With
End Sub

L'erreur étant qu'on ne peut effacer LstProjet si la plage n'existe plus, en mettant la ligne sous gestion d'erreur on évite un blocage sur ce problème répertorié (mais on rétablit immédiatement après les arrêts sur erreur pour ne pas risquer qu'une autre erreur ayant des conséquences échappe à la détection).

Premier soucis résolu

Pour l'éliminer, il faut donc rectifier la définition de la plage LstAtelier :

=ATELIER!$A$2:$A$4

(remplacer le 5 par 4).

Ceci dit, pour éliminer tout risque de survenance de ce problème :

Sub Lister()
        On Error Resume Next
        [LstProjet].Offset(, -1).Resize(, 2).ClearContents
        On Error GoTo 0
        With Worksheets("ATELIER")
            TriProjetDate "Projet1"
            [NEatelier].Resize(, 2).AdvancedFilter xlFilterCopy, [Crit], .Range("C1:D1"), True
        End With
    End Sub

Plus que deux et après je vais essayé de ne pas trop le mal mener

Il n'y a pas de contradiction dans ce que j'ai dit, mais c'est peut-être exprimé de façon un peu bancale et incomplète.

Voilà comment ça fonctionne, qui correspond bien à ce que tu as constaté.

Si C3 change :

  • on efface C6 (parce qu'on a rendu C6 dépendant de C3 et si l'Atelier change, le Projet éventuellement affiché en C6 n'y correspond plus, en tout cas la liste de C6 ne correspond plus à la nouvelle valeur de C3)
  • la valeur de C3 est répercutée en ATELIER!K2 (critère de filtrage)
  • et la proc Lister est lancée qui va filtrer les 2 premières colonnes de la base en ne retenant que les Projets de l'Atelier sélectionné en C3 (et figurant en K2). Si C3 est vide et donc K2 aussi, la liste est constituée sans filtrage (sauf d'éléments unique si répétition)

On est donc : si C3 a une valeur, en situation de liste-cascade classique, liste en C6 ne comportant que les Projets de l'Atelier en C3 ; mais si rien en C3, C6 dispose alors de la liste de tous les Projets (tous Ateliers). Ce qui permet d'affiner la recherche quand C3 à une valeur mais de rechercher directement à partir de C6 si C3 vide...

Enfin, la recherche est lancée.

Et si C6 change la recherche est lancée.

Ce, dans tous les cas, même si C3 et C6 sont vides : cela a pour effet d'effacer la recherche antérieure, et dans le cas où C3 et C6 sont vides, cela s'arrête là.

On continue la recherche dans les autres cas, en définissant 3 cas :

  • Atelier défini (C3) - Pas de Projet (C6) : cas 1
  • Pas d'Atelier (C3) - Projet défini (C6) : cas 2
  • Atelier défini (C3) - Projet défini (C6) : cas 3
Pour traiter ces 3 cas dans la même boucle, on teste diversement selon le cas (Select Case que tu as indiqué), et si la ligne doit être renvoyée dans les résultats, on passe une variable booléenne à True, en sortie des tests si ligne retenue on insère ses données dans un tableau et on passe à la ligne suivante (après réinititialisation à False de la variable).

Donc à chaque changement un résultat de recherche est produit (sauf C3 et C6 vides bien sûr).

Cordialement.


Plus que deux et après je vais essayé de ne pas trop le mal mener

Y avait autre chose que j'ai perdu au passage ?

Merci pour les explications,

heu...En effet pas deux!

Maintenant je comprend mieux le principe de la recherche du code.

Mais en faite, le soucis que nous avons au boulot, c'est que tout les projets qui doivent êtres sous traité par nos dis "Atelier", sont notés à "l'arrache" sur une note d'envoi manuscrite, pas toujours lisible, et où il nous faut beaucoup de temps pour retrouver toutes les marchandises envoyées, non pas, en une fois mais en plusieurs transport et pas toujours le même jour.

Et avec tout les projets en cours, il nous est utile de pouvoir , aussi, connaître l'atelier lié au projet recherché

Donc par question de facilité, j'ai commencer à créer cet base de donnée qui à évoluée au fur et à mesure.

D'où l'importance pour nous de pouvoir aussi faire une recherche par "projet" seul, sans lui indiquer dans quel "Atelier" c'est partit.

C'est pour ça que dans ma feuille "recherche" en ne tapant que le "projet", dans "résultats" il m'indique l'atelier ou ça ce trouve.

Bonsoir MFerrand, et tout le mondes,

As-tu eu l'occasion de regarder pour que je puisse, aussi, faire une recherche en C6 (projet) sans rien mentionné en C3 (Atelier)?

Si ce n'est vraiment pas possible, au risque d'avoir des erreurs comme j'ai eu avec l'ancien, et bien, je vais essayer d'inverser le lien entre les recherches, non plus C6 (projet) lié à C3 (atelier), mais inversement.

Bien entendu la première solution m'arrangerais plus.

au plaisir

Oh ! Là je suis confus !

Dans Rechercher :

If k > 13 Then .Range("A14:D" & k).ClearContents: k = 0

C'était bien prévu... !

Oh ! Là je suis confus !

Mais il ne faut pas! Tu as déjà fait du beaux boulots

Ceci ne fonctionne pas:

If k > 13 Then .Range("A14:D" & k).ClearContents: k = 0
a ep3

n° de projet inséré mais rien dans la liste!

dans "Rechercher()", il y avait déjà cet ligne, sans "K = 0", donc je l'ai rajouté, mais rien!

At = .Range("C3"): Pr = .Range("C6")
        k = .Cells(.Rows.Count, 1).End(xlUp).Row
        If k > 13 Then .Range("A14:D" & k).ClearContents: k = 0

et au cas où j'ai rajouter la ligne avec le "K = 0", mais ça n'a rien changé non plus!

At = .Range("C3"): Pr = .Range("C6")
        k = .Cells(.Rows.Count, 1).End(xlUp).Row
        If k > 13 Then .Range("A14:D" & k).ClearContents
        If k > 13 Then .Range("A14:D" & k).ClearContents: k = 0
Rechercher des sujets similaires à "certaines recherches aboutisses pas"