Probleme find sur texte

Bonjour,

j'ai un soucis de find que j'ai reproduit dans le fichier joint.

En effet j'arrive détecter la ligne de début et fin de tableau mais même si j'utilises les lignes exactes la valeur du match est fausse

cela me retourne 6 au lieu de 9... et je ne comprends vraiment pas pourquoi ici!!

19staff.xlsm (36.38 Ko)

une petite aide serait appréciable

merci

Bonjour,

l'explication est dans l'aide Excel de la méthode Find:

Argument After :

.../...

Si vous ne spécifiez pas cet argument, la recherche commence après la cellule située dans le coin supérieur gauche de la plage.

.../...

La plage étant E5:E14, la recherche commence en E6 , même si E5 aurait dû être trouvé ( et pas E9).

il faut donc préciser le paramètre After. Pour démarrer la recherche dès la première cellule, il faut spécifier After := la dernière cellule de la plage soit ici : After := Range("E14").

Bonjour

Quand on utilise des tableaux structurés on code des ListoOjects pas des plages

Tu veux afficher quoi concrètement car la fin du tableau (qui doit intégrer la colonne A et non y être juxtaposée) peut correspondre à un autre Id_Project...

Bonjour et merci pour vos retours,

si j'ajoute effectivement after:

debut = P_HR.Range("A1:A" & fin).Find(Id_Project).Row
Match = P_HR.Range("E" & debut & ":E14").Find(what:="PP", After:=Range("E14"), LookIn:=xlValues, lookat:=xlWhole).Row
MsgBox ("Debut " & debut & " Match " & Match)

ca me retourne bien 5 pour la ligne de départ

Mais 5 désormais pour match au lieu de 9....

dans mon cas ici je cherche pour pouvoir lister le personnel dit PP pour permanent d'un projet X

ICI dans cet exemple je voudrais donc savoir qui sont les 9 personnes

pour se faire j'ai la ligne de départ et si le match me donnait 9 je pourrais lister les personnes de la ligne 5 à 13

RE

ICI dans cet exemple je voudrais donc savoir qui sont les 9 personnes

OK mais tu affiche le résultat où ? Et cela se suit toujours ?

j'afficherais la liste dans une listbox avec colonnes après.

cela fonctionne pour les résultats trouvés mais comme le match ne fonctionne pas correctement le retour de liste n'est pas complet

voila toute la macro

Private Sub Staff()
Dim Trouve_HR As Range, PlageDeRecherche As Range
Dim Valeur_Cherchee As String, AdresseTrouvee As String
Dim debut As Long, fin As Long
Dim P_HR As Worksheet

Set P_HR = Sheets("Staff")
fin = P_HR.Range("A" & Rows.Count).End(xlUp).Row

debut = P_HR.Range("A1:A" & fin).Find(Id_Project).Row

Match = P_HR.Range("E" & debut & ":E" & fin).Find(what:="PP", LookIn:=xlValues, lookat:=xlWhole).Row
  If (Match <> 0) Then
   fin = debut + Match
   MsgBox (fin)
     Set Rng = P_HR.Range("A" & debut & ":" & "J" & fin)

ColVisu = Array(2, 3, 4, 6, 7)

LargeurCol = Array(60, 60, 50, 30, 30)
  Me.List_PP.ColumnCount = UBound(ColVisu) + 1
  Me.List_PP.ColumnWidths = Join(LargeurCol, ";")
  Me.List_PP.List = Application.Index(Rng, Evaluate("Row(1:" & Rng.Rows.Count & ")"), ColVisu)
  End If

RE

En nommant le tableau (avec la colonne A incorporée) T_Staff et sous réserve que les lignes se suivent

Private Sub Staff()
Dim Valeur_Cherchee, Debut As Long, Fin As Long

Valeur_Cherchee = 32

With [T_Staff].ListObject.ListColumns("Id_Project")

    Debut = .DataBodyRange.Find(What:=Valeur_Cherchee, LookIn:=xlValues, LookAt:=xlWhole).Row
    Fin = WorksheetFunction.CountIf(.DataBodyRange, Valeur_Cherchee) + Debut - 1
End With
End Sub

A noter que le tableau est automatiquement rattaché à sa feuille

merci d'avoir optimiser les lignes de début et fin mais le probleme reste le meme

le match est faux

voir fichier joint

6staff-1.xlsm (35.96 Ko)

RE

Décidément on te donne les bonnes pratiques mais tu continues sur ton code...

Tu as le début et la fin de la plage mais tu veux afficher quoi ?

Ce n'est toujours pas clair

Déjà on ne sait pas si tu cherches un Id_Project ou bien un Permanent vs Nom Permanent ou bien la combinaison des deux

Tu parles de listbox mais tu n'as pas de formulaire...

le match est faux

non !!

la variable Match contient le résultat correct d'une instruction ...!

Si vous voulez obtenir autre chose il faudra le spécifier .

Par ailleurs, il n'est jamais bon d'utiliser des noms de fonction comme nom de variable !

L'instruction find ramène la première occurrence en utilisant le paramètre After, mais elle peut ramener la dernière en utilisant le paramètre SearchDirection:=xlPrevious.

Avec une instruction Find avec paramètre After on obtient la ligne de début ( soit 5 dans l'exemple)

Avec une instruction Find avec paramètre SearchDirection on obtient la ligne de fin ( soit 13 dans l'exemple)

On peut donc définir facilement la plage contenant la recherche .

Attention ça ne fonctionnera qu'à la condition que les lignes recherchées se suivent et sans ligne vide.

Désolé mais je pensais avoir été explicite

je connais l'id du projet dont je veux pouvoir récupérer le personnel impliqué

Je demande à pouvoir identifier dans un tableau général les lignes concernées tant par l'ID du projet que du statut dit PP

Les données étant triées il est possible de connaitre les lignes liées au projet mais pour tout le personnel donc statut PP et PnP

ce que votre code optimisé fait très bien et je vous en remercie.

Séparant les deux statuts PP et PNP je souhaitais donc pouvoir récupérer les lignes ayant ID projet et Statut PP effectivement

mais au sein du match je me trompe

je recherche dans la feuille P_HR la plage E5 à E14 (début à fin identifié par l'ID) quoi (valeur "PP") et je recherche cette valeur dans le tout mais à priori non correct dans ma formulation...

Match = P_HR.Range("E" & debut & ":E" & fin).Find(what:="PP", LookIn:=xlValues, lookat:=xlWhole).Row

aucune ligne ne sera vide.

merci par avance

Je me demande si vous avez lu mes réponses précédentes ou si je me suis mal exprimé.

Dans les deux cas j'abandonne.

Bonne suite

non désolé mon message était parti avant et suis entrain d'en prendre connaissance.

RE

Private Sub Staff()
Dim Valeur_Cherchee, Debut As Long, Fin As Long, Debut2 As Long, Fin2 As Long, Maplage As Range

Valeur_Cherchee = 32
Valeur_Cherchee2 = "PP"

With [T_Staff].ListObject

    Debut = .ListColumns("Id_Project").Range.Find(what:=Valeur_Cherchee, LookIn:=xlValues, LookAt:=xlWhole).Row
    Fin = WorksheetFunction.CountIf(.DataBodyRange, Valeur_Cherchee)
    Set Maplage = .Range.Rows(Debut).Resize(Fin)
End With
    Debut2 = Maplage.Find(what:=Valeur_Cherchee2, LookIn:=xlValues, LookAt:=xlWhole).Row  - Debut + 1
    Fin2 = WorksheetFunction.CountIf(Maplage.Columns(5), Valeur_Cherchee2)
    Set Maplage = Maplage.Rows(Debut2).Resize(Fin2)

    'Exemple avec listbox basique
    ListBox1.ListFillRange = Maplage.Address

End Sub

pourtant que je fais Maplage.Select cela donne la bonne plage donc c'est moi

RE

affiche plutôt MaPlage.Address et tu devrais comprendre

je vais éplucher cela avec attention car je ne comprends pas encore tout mais cela fonctionne bien.

grand merci à vous pour soutien bien que je n'ai pas été clair à vos yeux au début

Bonjour à tous

Pour bien comprendre, vois l'image ci-dessous, est-ce cela que tu souhaites récupérer ?

En G4, place cette formule matricielle, à recopier vers le bas et à droite

{=INDEX($A$2:$E$14; PETITE.VALEUR(SI(NB.SI($H$1; $A$2:$A$14)*NB.SI($H$2; $E$2:$E$14); LIGNE($A$2:$E$14)-MIN(LIGNE($A$2:$E$14))+1); LIGNE(A1)); COLONNE(A1))}

capture 6

klin89

Rechercher des sujets similaires à "probleme find texte"