Fonction Find et Findnext

Hello tout le monde!

Je suis vraiment novice dans les macros... j'ai fait pas mal de recherches pour savoir quelles fonctions utiliser pour le projet que j'aimerais réaliser et il semblerait que ce soit Find et Findnext. Je m'explique.

J'ai un tableau sur la feuille1 que j'aimerais remplir avec des noms de travailleurs (sur la feuille2) en fonction de la qualification ciblée. Chaque travailleur peut avoir 4 qualifications. J'ai donc en feuille 1 un tableau avec x lignes et 1 colonne que j'aimerais remplir avec les données de la première colonne (noms) du tableau (z lignes et 5 colonnes) de la feuille 2.

J'ai un menu déroulant où si je sélectionne Qualif 1, alors le tableau se remplit avec tous les noms des travailleurs qui possèdent cette qualification en question.

Quelqu'un peut-il m'indiquer comment faire cela?

Un grand merci!

Bonjour,

Je te conseille de joindre un classeur qui indique la structure exacte des tes feuilles avec quelques lignes de données (non confidentielles).

Précise également le résultat attendu avec un exemple.

Cordialement.

Voici l'idée:

Si je sélectionne tâche 2 par exemple, alors, le tableau sera rempli avec tous les noms des ouvriers possédant cette tâche (peu importe s'il s'agit de la tâche principale ou non).

Est-ce plus clair?

feuille 1 feuille 2

Bonjour,

Voici un code à placer dans le module de la feuille 1

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim MaPlage As Range, C As Range
Dim Ligne As Long
Dim AdresseInit As String
    If Target.Count > 1 Then Exit Sub
    If Target.Address = "$D$7" Then
        Application.ScreenUpdating = False
        Worksheets("Feuil1").Range("B10:B1000").ClearContents
        Set MaPlage = Worksheets("Feuil2").UsedRange
        Set C = MaPlage.Find(Range("D7").Value, , xlValues, xlWhole)
        Ligne = 11
        If Not C Is Nothing Then
            AdresseInit = C.Address
            Do
                Worksheets("Feuil1").Cells(Ligne, 2) = Worksheets("Feuil2").Cells(C.Row, 1).Value
                Ligne = Ligne + 1
                Set C = MaPlage.FindNext(C)
            Loop While Not C Is Nothing And C.Address <> AdresseInit
        End If
        Application.ScreenUpdating = True
    End If
End Sub

Cordialement.

Un grand merci!

Malheureusement je n'arrive pas à ce que cela fonctionne... serait-ce exagéré de vous demander la marche à suivre?

Bonjour,

Voici un fichier exemple créé à partir de tes images.

Si la procédure ne fonctionne pas de ton coté, il te faudra chercher les différences.

Je t'avais conseillé de joindre un classeur qui indique la structure exacte des tes feuilles avec quelques lignes de données (non confidentielles), précisant également le résultat attendu avec un exemple.

Tu nous a retourné des images. C'est nettement moins efficace.

Cordialement.

17cmoilinoa.xlsm (200.68 Ko)

Super!

J'avais recommencé mon fichier à zéro et ça a fonctionné finalement (j'avais des cellules fusionnées, il n'a peut-être pas apprécié). J'ai compris quelles lignes faisaient quoi

Dernière chose, est-il possible d'ajouter du code qui demande d'insérer automatiquement les ouvriers avec le poste "brigadier" ? J'ai rajouté les éléments nécessaires dans les deux feuilles.

Un tout tout grand merci!

5cmoilinoa.xlsm (45.40 Ko)

Bonjour,

Au vu de ton tableau, les ouvriers avec le poste "brigadier" font l'objet d'une liste à part.

Ils n'entrent donc pas directement dans la recherche initiée par la cellule D7.

Il suffit donc de lister les ouvriers identifiés par un "oui" dans la colonne "Brigadier".

Cordialement.

7cmoilinoa-2.xlsm (46.65 Ko)

Merci beaucoup!

Le code a fameusement changé !

N'est-il par exemple pas possible d'avoir deux codes séparés plutôt que les deux entremêlés? Donc le code de base pour les ouvriers, et un deuxieme pour les brigadiers?

Merci !

Bonjour,

En l’état actuel, le traitement global est effectué suite à une modification de la cellule D7, soit la sélection d’une tâche. On établit alors la liste des ouvriers suivant la qualification demandée.

Ensuite, on établit la liste des brigadiers et cette liste vient se placer en dessous de celle des ouvriers.

L’ordre de traitement a donc une importance.

Si la liste des brigadiers doit être établie à la demande, c’est-à-dire indépendamment d’une modification de D7, il faut ajouter un bouton de commande (ou tout autre élément permettant de lancer la procédure). Il serait alors souhaitable que cette liste ne soit pas dans la même colonne que celle des ouvriers.

Si le listage des brigadiers reste dépendant d’une modification de D7 (ou d’une autre cellule), le traitement restera lié à une seule procédure puisqu’il ne peut y avoir qu’une seule procédure Worksheet.Change.

Maintenant, il te reste à choisir le type de traitement en fonction du résultat recherché.

Cordialement.

Ok, merci pour toutes ces explications.

Je vais adapter le code sur mon "vrai" classeur, cela me permet en même temps de comprendre chaque ligne de code.

Ca m'a énormément aidée, encore un tout grand merci!

Tout fonctionne parfaitement.

Mon fichier est mis à jour avec le code adapté.

J'ai une dernière demande pour le fichier soit "parfait"

- j'aimerais que le nombre de lignes entre la ligne 23 et la ligne 71 s'adapte en fonction du nombre de noms (pour ne pas avoir 20 lignes vides)

OPTIONNEL (à mettre en commentaires?):

- j'aimerais que si la personne a le poste "brigadier" et le poste concerné en B12, alors elle ne doit pas apparaître dans la première liste car elle va se retrouver deux fois dans le tableau

un IMMENSE merci

Bonjour,

Pour adapter le nombre de lignes en fonction du nombre de noms, j’ai remplacé les copies par des insertions.

Pour éviter qu’un même nom apparaisse à la fois dans la liste des ouvriers et celle des brigadiers, j’ai placé un test dans la recherche des brigadiers.

Si tu souhaites absolument voir le nom dans la liste des brigadiers, le plus simple sera d’inverser la recherche et commencer par la liste des brigadiers.

Cordialement.

Effectivement, ca marche super bien!

Je préfèrerais tout de même que les brigadiers soient prioritaires par rapport aux ouvriers mais que leurs noms restent en bas de page, est ce possible? ou cela est-il en contradiction avec la recherche?

Est-il également possible de fixer un nombre de lignes minimum? Par exemple min 15 lignes? Au dela, le tableau s'allonge, sinon il reste à 15 lignes? Et que dans ces lignes, les ouvriers se mettent en haut du tableau et les brigadiers en bas?

Pour ajouter une ligne qui reste fixe en fin de tableau, comment doit-on procéder?

Encore une fois, milles fois merci!

J'aimerais être capable de coder ainsi!

Ton fichier en retour ...

Pour ajouter une ligne qui reste fixe en fin de tableau, comment doit-on procéder ?

Pour avoir une information fixe en bas de page, il faut la placer dans le pied de page.

Si problème, tu vas devoir te passer de mon aide pendant un quinzaine ...

Cordialement.

Rechercher des sujets similaires à "fonction find findnext"