Dans un formulaire, j'ai une ListBox qui s'affiche à son ouverture. Dans cette liste ("Lbx_Enregist") il y a 2 colonnes une qui contient un code et l'autre le Nom et Prénom.
Je souhaiterais que lorsque je clique sur une ligne de la liste, le NOM s'affiche dans la TextBox1 et le Prénom dans la TextBox2, en fait séparer le Nom du Prénom.
Les Noms et Prénoms sont également présent dans la feuille "Liste_agents" TS "t_Noms" colonne "Salarié".
J'ai cherché un peu partout, mais je n'ai pas trouvé pour cette situation.
Comment puis-je procéder et surtout est-ce possible ?
Je sais que cela va se compliquer s'il y a un Nom du style "De La Bouche en biais Marie-Thérèse".
Merci par avance pour votre aide.
Bonjour Nono,
Le problème des noms/prénoms ont fait l'objet de nombreux sujets avec toujours la même problématique :
Il est impossible de séparer les deux avec 100% de réussite. Par exemple avec :
Dupont Marie Thérèse : Vous ne pouvez pas savoir si le nom est Dupont ou Dupont Marie, et le prénom si c'est Thérèse ou Marie Thérèse.
Un exemple en PJ avec cette fonction :
VB:
Function Séparation(Texte, NomPrénom)
Dim T, L%
T = Split(Texte, " ")
If NomPrénom = 0 Then
Séparation = T(UBound(T))
Else
L = Len(T(UBound(T)))
Séparation = Left(Texte, Len(Texte) - L)
End If
End Function
La syntaxe est :
=Séparation(B6;1) pour le nom et =Séparation(B6;0) pour le prénom.
Comme vous le voyez ça ne marche pas toujours.
( sauf si le prénom est toujours orthographié avec un tiret entre les deux mots composés et jamais d'espace )
Et je ne connais pas de solution miracle.
Addon : J'ai rajouté un exemple par macro en appuyant sur le bouton.
Bonjour Nono,
Le problème des noms/prénoms ont fait l'objet de nombreux sujets avec toujours la même problématique :
Il est impossible de séparer les deux avec 100% de réussite. Par exemple avec :
Dupont Marie Thérèse : Vous ne pouvez pas savoir si le nom est Dupont ou Dupont Marie, et le prénom si c'est Thérèse ou Marie Thérèse.
Un exemple en PJ avec cette fonction :
VB:
Function Séparation(Texte, NomPrénom)
Dim T, L%
T = Split(Texte, " ")
If NomPrénom = 0 Then
Séparation = T(UBound(T))
Else
L = Len(T(UBound(T)))
Séparation = Left(Texte, Len(Texte) - L)
End If
End Function
La syntaxe est :
=Séparation(B6;1) pour le nom et =Séparation(B6;0) pour le prénom.
Comme vous le voyez ça ne marche pas toujours.
( sauf si le prénom est toujours orthographié avec un tiret entre les deux mots composés et jamais d'espace )
Et je ne connais pas de solution miracle.
Addon : J'ai rajouté un exemple par macro en appuyant sur le bouton.
Si votre base de données n'est pas trop grande, il vous suffit de vérifier que les noms sont toujours en premier et qu'il n'y a aucun espace dans les prénoms composés.
Dans ce cas ça marche avec ma fonction.
J'ai trouvé une solution avec ce code. Je récupère bien le Nom et le Prénom dans mes 2 TextBoxs.
Par contre, je vais devoir chercher encore un peu afin de récupérer le code et son temps de travail qui sont sur la même ligne et les récupérer dans 2 autres TextBoxs.
Je fais cela pour récupérer les données d'un agent déjà enregistré afin de les modifier.
VB:
Private Sub Lbx_Enregist_Click()
Dim FullName As String
Dim FirstName As String
Dim LastName As String
Dim SpacePose As Integer
'On identifie FullName
FullName = Me.Lbx_Enregist.Value
'On trouve la position de l'espace
SpacePose = InStr(1, FullName, " ")
'On extrait le Nom de famille avant l'espace
LastName = Left(FullName, SpacePose - 1)
'On extrait le Prénom
FirstName = Mid(FullName, SpacePose + 1)
'On affiche les résultats dans des TextBoxs
Me.TextBox1.Value = LastName
Me.TextBox2.Value = FirstName
Application.ScreenUpdating = False
End Sub
Oui je sais mais je n'ai pas trouvé comment utiliser votre fonction dans le Vba.
Désolé pour mon incompétence....
Je cherche encore pour les Noms séparés et les prénoms avec ou sans tirets.
Ligne = Application.Match(FullName, [A:A], 0) ' Récupération ligne si Name en colonne A
Code = Cells(Ligne, "B") ' Récupération Code si en colonne B
TempsTravail = Cells(Ligne, "C") ' Récupération temps travail si en colonne C
Sans fichier difficile de faire mieux, mais cela pourrait ressembler à ça :
Code:
Private Sub Lbx_Enregist_Click()
Dim FullName$, FirstName$, LastName$, Code, TempsTravail
'On identifie FullName
FullName = Me.Lbx_Enregist.Value
'On extrait le Nom de famille avant l'espace
LastName = Séparation(FullName, 1)
'On extrait le Prénom
FirstName = Séparation(FullName, 0)
' Récupération ligne si Name en colonne A
Ligne = Application.Match(FullName, [A:A], 0)
' Récupération Code si en colonne B
Code = Cells(Ligne, "B")
' Récupération temps travail si en colonne C
TempsTravail = Cells(Ligne, "C")
'On affiche les résultats dans des TextBoxs
Me.TextBox1.Value = LastName
Me.TextBox2.Value = FirstName
'Rajouter rangement Code et TempsTravail
Application.ScreenUpdating = False
End Sub
Function Séparation(Texte, NomPrénom)
Dim T
T = Split(Texte, " ")
If NomPrénom = 0 Then
Séparation = T(UBound(T))
Else
Séparation = Left(Texte, Len(Texte) - Len(T(UBound(T))))
End If
End Function
Sans fichier difficile de faire mieux, mais cela pourrait ressembler à ça :
Code:
Private Sub Lbx_Enregist_Click()
Dim FullName$, FirstName$, LastName$, Code, TempsTravail
'On identifie FullName
FullName = Me.Lbx_Enregist.Value
'On extrait le Nom de famille avant l'espace
LastName = Séparation(FullName, 1)
'On extrait le Prénom
FirstName = Séparation(FullName, 0)
' Récupération ligne si Name en colonne A
Ligne = Application.Match(FullName, [A:A], 0)
' Récupération Code si en colonne B
Code = Cells(Ligne, "B")
' Récupération temps travail si en colonne C
TempsTravail = Cells(Ligne, "C")
'On affiche les résultats dans des TextBoxs
Me.TextBox1.Value = LastName
Me.TextBox2.Value = FirstName
'Rajouter rangement Code et TempsTravail
Application.ScreenUpdating = False
End Sub
Function Séparation(Texte, NomPrénom)
Dim T
T = Split(Texte, " ")
If NomPrénom = 0 Then
Séparation = T(UBound(T))
Else
Séparation = Left(Texte, Len(Texte) - Len(T(UBound(T))))
End If
End Function
Merci beaucoup. J'ai collé le code dans mon application mais j'ai une incompatibilité de type pour "code" en gras.
Je vous joins mon fichier. Le code se trouve dans l'UfGestTemps, la 1ère page du multipage.
Merci par avance pour votre aide
VB:
Private Sub Lbx_Enregist_Click()
Dim FullName$, FirstName$, LastName$, Code, TempsTravail
'On identifie FullName
FullName = Me.Lbx_Enregist.Value
'On extrait le Nom de famille avant l'espace
LastName = Séparation(FullName, 1)
'On extrait le Prénom
FirstName = Séparation(FullName, 0)
' Récupération ligne si Name en colonne A
Ligne = Application.Match(FullName, [A:A], 0)
' Récupération Code si en colonne B
[B]Code = Cells(Ligne, "B")[/B]
' Récupération temps travail si en colonne D
TempsTravail = Cells(Ligne, "D")
'On affiche les résultats dans des TextBoxs
Me.TextBox1.Value = LastName
Me.TextBox2.Value = FirstName
Me.TextBox3.Value = Code
Me.TextBox5.Value = TempsTravail
'Rajouter rangement Code et TempsTravail
Application.ScreenUpdating = False
End Sub
Cela signifiait que c'est un exemple et qu'il faut adapter.
Si la feuille concernée est bien "Imp_Pointage", et en supposant que Nom Prénom sont ien présent dans votre feuille ( ce qui n'est pas le cas dans votre fichier ) alors on peut faire :
Code:
Private Sub Lbx_Enregist_Click()
Dim FullName$, FirstName$, LastName$, CodeT, TempsTravail
On Error GoTo NonTrouvé
'On identifie FullName
FullName = Me.Lbx_Enregist.Value
'On extrait le Nom de famille avant l'espace
LastName = Séparation(FullName, 1)
'On extrait le Prénom
FirstName = Séparation(FullName, 0)
' 'On affiche les résultats dans des TextBoxs
With Sheets("Imp_Pointage")
Ligne = .Application.Match(FullName, [B:B], 0) ' N° de ligne
Me.TextBox1.Value = Séparation(FullName, 1) ' Nom
Me.TextBox2.Value = Séparation(FullName, 0) ' Prénom
Me.TextBox3.Value = .Cells(Ligne, "A") ' Code
Me.TextBox5.Value = .Cells(Ligne, "G") ' Tps travail
End With
Application.ScreenUpdating = False
Exit Sub
NonTrouvé:
MsgBox " Les nom et prénoms " & FullName & " n'ont pas été trouvés."
End Sub
Non testé je n'ai pas compris le fonctionnement de vos userforms.
Cela signifiait que c'est un exemple et qu'il faut adapter.
Si la feuille concernée est bien "Imp_Pointage", et en supposant que Nom Prénom sont ien présent dans votre feuille ( ce qui n'est pas le cas dans votre fichier ) alors on peut faire :
Code:
Private Sub Lbx_Enregist_Click()
Dim FullName$, FirstName$, LastName$, CodeT, TempsTravail
On Error GoTo NonTrouvé
'On identifie FullName
FullName = Me.Lbx_Enregist.Value
'On extrait le Nom de famille avant l'espace
LastName = Séparation(FullName, 1)
'On extrait le Prénom
FirstName = Séparation(FullName, 0)
' 'On affiche les résultats dans des TextBoxs
With Sheets("Imp_Pointage")
Ligne = .Application.Match(FullName, [B:B], 0) ' N° de ligne
Me.TextBox1.Value = Séparation(FullName, 1) ' Nom
Me.TextBox2.Value = Séparation(FullName, 0) ' Prénom
Me.TextBox3.Value = .Cells(Ligne, "A") ' Code
Me.TextBox5.Value = .Cells(Ligne, "G") ' Tps travail
End With
Application.ScreenUpdating = False
Exit Sub
NonTrouvé:
MsgBox " Les nom et prénoms " & FullName & " n'ont pas été trouvés."
End Sub
Non testé je n'ai pas compris le fonctionnement de vos userforms.