[Résolu] Obtenir la dernière ligne d'une personne

Nico70

XLDnaute Nouveau
Bonjour,

Dans mon fichier j'utilise actuellement un système pas pratique pour obtenir la dernière demande d'une personne à l'aide matrice, malheureusement, je ne maitrise pas du tous les matrice et du coup ce système est pas super et je n'ai pas la dernière demande d'une personne mais du service (qui peut avoir plus de 1 personne).

De plus on m'a demander d'indiquer ceci mais que cela soit plus simple de modification.

Auriez vous une solution ?

Merci à vous
 

Fichiers joints

Dernière édition:

Modeste

XLDnaute Barbatruc
Re : Obtenir la dernière ligne d'une personne

Bonjour nico70,

A condition que j'aie bien compris, tu peux essayer,en E7 de la feuille "Général":
Code:
=INDEX(Personne!$C$7:$C$200;MAX(SI(Personne!$B$7:$B$200=$B7;LIGNE(Personne!$B$7:$B$200)-6)))&" le "&TEXTE(INDEX(Personne!$I$7:$I$200;MAX(SI(Personne!$B$7:$B$200=$B7;LIGNE(Personne!$B$7:$B$200)-6)));"jj/mm/aaaa")
A valider avec Ctrl+Shift+Enter

Si c'est OK, il restera à trouver un système pour éviter les messages d'erreurs ... mais une chose à la fois :)

Edit: Salut Robert :)
 
Dernière édition:

Robert

XLDnaute Barbatruc
Re : Obtenir la dernière ligne d'une personne

Bonjour Nico, bonjour le forum,

Si on considère que la dernière demande est toujours placée en dernier dans l'onglet Général alors la proposition VBA ci-dessous devrait convenir.
Le code :
Code:
Sub Macro1()
Dim g As Object 'déclare la variable g (onglet Général)
Dim p As Object 'déclare la variable p (onglet Personne)
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim r As Range 'déclare la variable r (Recherche)
Dim pa As String 'déclare la variable pa (Première Adresse)
Dim li As Integer 'déclare la variable li (LIgne)
Dim lim As Integer 'déclare la variable lim (LIgne Maximum)

Set g = Sheets("Général") 'définit l'onglet g
Set p = Sheets("Personne") 'définit l'onglet p
dl = g.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne B de l'onglet g
Set pl = g.Range("B7:B" & dl) 'définit la plage pl
For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
    lim = 0 'réinitialise la variable lim
    'définit la recherche r (recherche cel dans la colonnne B de l'onglet p)
    Set r = p.Columns(2).Find(cel.Value, , xlValues, xlWhole)
    If Not r Is Nothing Then 'condition : si il existe au moins une occurence
        pa = r.Address 'définit l'adresse de la première occurrence trouvé
        Do 'exécute
            li = r.Row 'définit la ligne li
            If li > lim Then lim = r.Row 'si la ligne li est supérieure à la ligne maximum lim , redéfinit la ligne maximum lim
            Set r = p.Columns(2).FindNext(r) 'redéfinit la recherche r (occurrence suivante)
        Loop While Not r Is Nothing And r.Address <> pa 'boucle tant qu'il existe des occurrences ailleurs qu'en pa
    End If 'fin de la condition
    'récupère les données et les place dans la colonne E de l'onglet g
    g.Cells(cel.Row, 5).Value = p.Cells(lim, 3).Value & " le " & p.Cells(lim, 9).Value
Next cel 'prochaine cellule de la boucle
End Sub
le fichier :

[Édition]
Bonjour Modeste on s'est croisé...
 

Fichiers joints

Nico70

XLDnaute Nouveau
Re : Obtenir la dernière ligne d'une personne

Bonjour Modeste et Robert,

Modeste, j'utilise actuellement ce même système sur mon fichier, moi je pourrais modifier(dans la limite de mes connaissances) mais les utilisateur , ce genre de ligne ça fait peur ;)

Robert, j'aime plutôt bien ta macro, cependant j'ai plusieurs feuilles, est-ce que ça poserais problème ?

Merci à vous deux pour vos deux solutions (et votre bonne humeur :D)

Bon après midi !
 

Modeste

XLDnaute Barbatruc
Re : Obtenir la dernière ligne d'une personne

Re-bonjour,

Ce qui n'est pas clair pour moi, c'est la raison pour laquelle les utilisateurs devraient modifier!?

... Ceci dit, si tu préfères Môôssieur Robert, c'est ton choix :D (mais ne viens pas te plaindre après, hein)
 

hoerwind

XLDnaute Barbatruc
Re : Obtenir la dernière ligne d'une personne

Bonjour, salut Modeste et Robert,

ce genre de ligne ça fait peur

Tu as tout à fait raison, j'ai aussi été comme cela, peur face à l'inconnue !
Mais rassures-toi, cela n'a duré que le temps (du début) de ma puberté.
Dès que j'avais compris comment cela fonctionnait, je ne m'en suis plus privé.

En pièce jointe une proposition (merci Modeste) qui devrait rassurer d'éventuels septiques
 

Fichiers joints

Modeste

XLDnaute Barbatruc
Re : Obtenir la dernière ligne d'une personne

Re²,

@ hoerwind: tu m'as fait peur ;) j'ai cru un instant que tu t'étais lancé à corps perdu dans le VBA et que tu avais créé une fonction personnalisée (ce qui aurait été une bonne idée) ... la formule nommée en est une autre (de bonne idée!)
 

Robert

XLDnaute Barbatruc
Re : Obtenir la dernière ligne d'une personne

Bonjour le fil, bonjour le forum,

Si le nom en colonne A est le même que celui de l'onglet auquel il se rapporte, le code ci-dessous devrait convenir :
Code:
Sub Macro1()
Dim g As Object 'déclare la variable g (onglet Général)
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim s As Object 'déclare la variable s (onglet Service)
Dim r As Range 'déclare la variable r (Recherche)
Dim pa As String 'déclare la variable pa (Première Adresse)
Dim li As Integer 'déclare la variable li (LIgne)
Dim lim As Integer 'déclare la variable lim (LIgne Maximum)

Set g = Sheets("Général") 'définit l'onglet g
dl = g.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne B de l'onglet g
Set pl = g.Range("B7:B" & dl) 'définit la plage pl
For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
    On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
    Set s = Sheets(cel.Offset(0, -1).Value) 'définit l'onglet s (génère une erreur si cet onglet n'existe pas)
    If Err <> 0 Then 'condition : si une erreur a été générée
        Err = 0 'annule l'erreur
        MsgBox "le texte en colonne A ne correspond pas à un onglet existant !" 'message
        cel.Offset(0, -1).Select 'sélectionne la cellule contenant l'erreur
        Exit Sub 'sort de la procédure
    End If 'fin de la condition
    On Error GoTo 0
    lim = 0 'réinitialise la variable lim
    'définit la recherche r (recherche cel dans la colonnne B de l'onglet s)
    Set r = s.Columns(2).Find(cel.Value, , xlValues, xlWhole)
    If Not r Is Nothing Then 'condition : si il existe au moins une occurence
        pa = r.Address 'définit l'adresse de la première occurrence trouvé
        Do 'exécute
            li = r.Row 'définit la ligne li
            If li > lim Then lim = r.Row 'si la ligne li est supérieure à la ligne maximum lim , redéfinit la ligne maximum lim
            Set r = s.Columns(2).FindNext(r) 'redéfinit la recherche r (occurrence suivante)
        Loop While Not r Is Nothing And r.Address <> pa 'boucle tant qu'il existe des occurrences ailleurs qu'en pa
    End If 'fin de la condition
    'récupère les données et les place dans la colonne E de l'onglet g
    g.Cells(cel.Row, 5).Value = s.Cells(lim, 3).Value & " le " & s.Cells(lim, 9).Value
Next cel 'prochaine cellule de la boucle
End Sub
Le fichier :
 

Fichiers joints

Nico70

XLDnaute Nouveau
Re : Obtenir la dernière ligne d'une personne

Bonjour,

Excusez moi pour ma réponse tardive, je vous remercie pour votre aide (et votre courage !)

Re-bonjour,

Ce qui n'est pas clair pour moi, c'est la raison pour laquelle les utilisateurs devraient modifier!?

... Ceci dit, si tu préfères Môôssieur Robert, c'est ton choix :D (mais ne viens pas te plaindre après, hein)
Tu ma fait sourire avec ton message, gros jaloux va ! :p
Il ne doivent pas le modifier mais tu les connais, il touche toujours à tous ! (et casse toujours tous... :( ) je suis la seul personnes qui modifie les variable (ou macro) mais eux utilise et remplisse le fichier ^^



Bonjour, salut Modeste et Robert,

ce genre de ligne ça fait peur

Tu as tout à fait raison, j'ai aussi été comme cela, peur face à l'inconnue !
Mais rassures-toi, cela n'a duré que le temps (du début) de ma puberté.
Dès que j'avais compris comment cela fonctionnait, je ne m'en suis plus privé.

En pièce jointe une proposition (merci Modeste) qui devrait rassurer d'éventuels septiques
En effet tu à l'air d'avoir tous compris :eek:, si tu aime donner des cours ma boite à mp est dispo :D
Merci !

Bonjour le fil, bonjour le forum,

Si le nom en colonne A est le même que celui de l'onglet auquel il se rapporte, le code ci-dessous devrait convenir :
Code:
Sub Macro1()
Dim g As Object 'déclare la variable g (onglet Général)
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim s As Object 'déclare la variable s (onglet Service)
Dim r As Range 'déclare la variable r (Recherche)
Dim pa As String 'déclare la variable pa (Première Adresse)
Dim li As Integer 'déclare la variable li (LIgne)
Dim lim As Integer 'déclare la variable lim (LIgne Maximum)

Set g = Sheets("Général") 'définit l'onglet g
dl = g.Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne B de l'onglet g
Set pl = g.Range("B7:B" & dl) 'définit la plage pl
For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
    On Error Resume Next 'gestion des erreurs (en cas d'erreur passe à la ligne suivante)
    Set s = Sheets(cel.Offset(0, -1).Value) 'définit l'onglet s (génère une erreur si cet onglet n'existe pas)
    If Err <> 0 Then 'condition : si une erreur a été générée
        Err = 0 'annule l'erreur
        MsgBox "le texte en colonne A ne correspond pas à un onglet existant !" 'message
        cel.Offset(0, -1).Select 'sélectionne la cellule contenant l'erreur
        Exit Sub 'sort de la procédure
    End If 'fin de la condition
    On Error GoTo 0
    lim = 0 'réinitialise la variable lim
    'définit la recherche r (recherche cel dans la colonnne B de l'onglet s)
    Set r = s.Columns(2).Find(cel.Value, , xlValues, xlWhole)
    If Not r Is Nothing Then 'condition : si il existe au moins une occurence
        pa = r.Address 'définit l'adresse de la première occurrence trouvé
        Do 'exécute
            li = r.Row 'définit la ligne li
            If li > lim Then lim = r.Row 'si la ligne li est supérieure à la ligne maximum lim , redéfinit la ligne maximum lim
            Set r = s.Columns(2).FindNext(r) 'redéfinit la recherche r (occurrence suivante)
        Loop While Not r Is Nothing And r.Address <> pa 'boucle tant qu'il existe des occurrences ailleurs qu'en pa
    End If 'fin de la condition
    'récupère les données et les place dans la colonne E de l'onglet g
    g.Cells(cel.Row, 5).Value = s.Cells(lim, 3).Value & " le " & s.Cells(lim, 9).Value
Next cel 'prochaine cellule de la boucle
End Sub
Le fichier :
Oui le nom sera toujours identique à la colonne A.

Merci !

Je vais voir pour l'adapter à mon fichier et je vous recontact les gens ;)

Merci encore beaucoup, pour votre travail, votre courage et votre sympathie ! changez rien :)
 

Nico70

XLDnaute Nouveau
Re : Obtenir la dernière ligne d'une personne

Mon problème est résolu.

Merci beaucoup ! vous êtes géniaux

Ceci dit, si tu préfères Môôssieur Robert, c'est ton choix :D (mais ne viens pas te plaindre après, hein)
Il à fait un travail de fous ! ^^

Bonne journée :)
 

Haut Bas