Voici ma question :
Dans une cellule il y a, un Nom (en majuscule) et un prenom (avec la première lettre en majuscule). Comment les mettre en mémoire séparement? Notons aussi qu'ils sont séparés par un espace.
Merci d'avance.![]()
Voici ma question :
Dans une cellule il y a, un Nom (en majuscule) et un prenom (avec la première lettre en majuscule). Comment les mettre en mémoire séparement? Notons aussi qu'ils sont séparés par un espace.
Merci d'avance.![]()
Le pb se rencontre pour les noms ou prénoms composés... Sinon tu as split. Jète un oeil dans l'aide
Juste une idée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Tableau = Split(Cells(NoLigne,NoCol)," ") Nbre = Ubound(Tableau) 'te donne la taille du tableau et donc le nbre d'espaces if Nbre = 1 then Nom = Tableau(0) Prénom = Tableau(1) elseif Nbre > 2 then 'Affichage et traitement manuel endif![]()
Merci pour cette réponse rapide, je met ça en forme est je vais voir si ça colle.
Jemétrompé
Remplace "elseif Nbre > 2 then" par "elseif Nbre > 1 then" sinon cépabon![]()
salut ,
si par exemple en a2 tu as : nom prenom
pour recuperer le nom tu pourrai faire ca dans une cellule:
=LEFT(A2; SEARCH(" "; A2)-1)
pour recuperer le prenom tu pourrai faire ca dans une cellule :
=RIGHT(A2;(LEN(A2)-SEARCH(" "; A2)))
Bonne chance avec les Van et les de ...
Ca me paraît vachement périlleux de se baser sur les espaces.
N'oubliez pas de cliquer surquand vous avez obtenu ou trouvé vous-même la réponse à votre question.
Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
Pensez aussi à voter pour les réponses qui vous ont aidés.
------------
Je dois beaucoup de mes connaissances à mes erreurs!
Merci pour vos réponses j'ai réussit à me débrouiller avec les espaces.
Enfin ça risque d'irriter certain d'avoir un tiré dans leurs non de famille mais bon![]()
Remplace donc tes tirets par des espaces "dur" (Chr(160) au lieu de chr(32) ou, au clavier, Alt + 255
Ainsi, tu auras des espaces que ton code considérera comme des caractères et qui s'imprimeront comme des espaces. Et tu pourras utiliser l'une ou l'autre méthode qu'on t'a donnée![]()
Tu fais un "Remplacer..." sur ta colonne
A+
tien espace dur je connaissais pas , je vais retenir cette idée
merci ouskel
Désolé Alain
Je suis tout a fait d'accord avec toi, se baser sur les espaces n'est pas viable. La méthode que je vais exposer n'est pas "omnisciente" non-plus mais à le mérite de gérer les noms & prénoms composés.
Si une norme de nommage existe et qu'elle suit toujours cette logique : NOM Prénom, on pourrait boucler sur les caractères de la cellule pour repérer la première minuscule (généralement la 2ème lettre du prénom) et ainsi séparer les deux valeurs du NOM et du Prénom :
Comme me l'a fait remarquer unparia, il faudrait gérer tous les cas particuliers dans le test (car en effet le prénom n'est pas forcément composé uniquement de lettres). Le code idéal combinerait celui-ci avec l'autre puisque l'espace est sensé séparer les noms et prénoms.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 Sub parseCell() ' Cellule à tester celluleTest = ActiveWorkbook.ActiveSheet.Range("A72") ' Nb de caractère à vérifier sur la Cellule de test imax = Len(celluleTest) ' Boucle sur tous les caractère de la Cellule de test For i = 1 To imax ' Récupération de la valeur ASCII du caractère courant i testCar = Asc(Mid(celluleTest, i, 1)) ' Test pour repérer le deuxième caractère du prénom si c'est une lettre minuscule If Application.WorksheetFunction.Or(Application.WorksheetFunction.And(testCar <= 122, testCar >= 97), Application.WorksheetFunction.And(testCar <= 141, testCar >= 129), Application.WorksheetFunction.And(testCar <= 151, testCar >= 147)) Then pointeur = i - 1 i = imax End If Next i ' La valeur du nom de la cellule de test valNOM = Mid(celluleTest, 1, pointeur - 2) ' La valeur du prénom de la cellule de test valPrenom = Mid(celluleTest, pointeur, imax - pointeur + 1) End Sub
Ce code risque par ailleurs d'être très gourmand sur un grand nombre d'enregistrements et est donc plutôt recommandé pour une application sur une seule cellule à la fois (IHM par exemple).
Bonjour BananeSadique
Tu me parais bien trop sûr de toi
Tu ignores apparemment tous les pièges possibles.
Allez -->> je vais t'aider à "élargir" ton champ de réflexion avec un exemple (parmi des milliers possibles) -->>
Mets donc CLINTON N'jie dans ta cellule de test et regarde ce que sera devenu ce prénom camerounais
(et je n'ai pas choisi le cas le plus complexe, tant en ce qui concerne le patronyme que le prénom)
Et rappelle-toi que rien n'est plus dangereux, en informatique, que de faire une règle "universelle" qui ignorerait les cas particuliers. Une "moulinette" travaillant en silence, il arrive que l'on ne constate des dégâts éventuels que des années plus tard.![]()
Bonjour unparia,
Merci pour ta réponse, je suis aussi d'accord avec toi, je n'avais pas pensé à ce genre de cas particulier.
Pour que mon code fonctionne il faudrait inclure au test l'ensemble des caractères en question (http://www.asciitable.com/). Cela impliquerait donc au préalable d'étudier les caractères existants et possibles pour le champ concerné ou inclure un gestionnaire d'erreur pour les cas particuliers. On pourra alors se servir du code précédent en l'adaptant aux enregistrements cibles.
Il serait possible aussi de tester l'exclusion du caractère test à l'ensemble des caractères du nom de famille (espace et majuscule : 32 & [65:90]), qui sont peut être un peu plus "normés" que ceux des prénoms mais impossibles à prévoir (et donc à ajouter au test pour chaque nouveau cas particulier.
Je voulais juste indiquer qu'en effet il est très fréquent d'avoir des noms ou des prénoms composés (plus de 200 dans ma base) et je n'ai pas pu appliquer la méthode trouvé sur cette discussion à mon problème. Le code que j'ai utilisé m'a néanmoins permis de limiter ma liste de noms aux cas particuliers (un dizaine d'enregistrement sur plusieurs milliers).
je n'avais pas pensé à ce genre de cas particulieretc ...Cela impliquerait donc au préalable d'étudier les caractères existants et possibles pour le champ concerné ou inclure un gestionnaire d'erreur pour les cas particuliers. On pourra alors se servir du code précédent en l'adaptant aux enregistrements cibles.
On résume (tu veux bien ?) ?
Je ne t'ai parlé que d' UN cas particulier (il y en a des centaines totalement distincts)
Si tu devais tous les prévoir et les traiter :
1) il te faudrait commencer par une analyse exhaustive de tous les cas possibles
2) même ainsi, le code traitant tous ces cas possibles serait extrêmement lent et lourd !
Voilà l'une des raisons pour lesquelles l'étape "conception" et l'étape "modélisation" sont de la plus haute importance, qu'il s'agisse de Noms et prénoms ou d'adresses. On ne met JAMAIS dans un seul champ ce qui, d'emblée, devrait être mis dans des champs distincts de sorte à pouvoir "affiner", "séparer", faire des requêtes, quoi ...
A ne pas le faire, on en arrive (comme ici) à "tenter" des "rattrapages" plutôt hasardeux et en tout état de cause assez bancales.
Voilà tout (je pense n'avoir rien oublié).![]()
A BananeSadique
Pour que tu comprennes mieux la nécessité d'être extrêmement vigilant et soucieux en matière de moulinettes (on appelle "moulinette" tout outil tendant à transformer en bloc des données en d'autres données) :
Même cette manière de procéder (que j'avais testée naïvement il y a plus d'une bonne vingtaine d'années****) :
N'est pas sans risques (à divers titres), bien que plus rigoureuse que la tienne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Dim nom As String, prenom As String, Q As String, i As Integer, toto toto = Split(Range("A1").Text, " ") For i = 0 To UBound(toto) Q = toto(i) If UCase(Q) = Q Then nom = nom & " " & Q Else prenom = prenom & " " & Q End If Next MsgBox nom & vbCrLf & prenom
EDIT : **** Et c'était précisément pour tenter de "rattraper par les cheveux" un défaut majeur (à la base même du projet) de conception du projet et de modélisation des données.
Nous avions finalement choisi de faire une moulinette qui :
- proposait une modification, article par article
- un intervenant devait alors soit accepter, soit émettre une réserve (un flag ajouté)
Etaient ensuite examinés les articles mis en réserve : Et là : surprise -->> même ainsi, il était quasiment impossible dans certains cas de distinguer manuellement sans risque le nom et le prénom. Il nous avait alors fallu faire d'autres vérifications (courrier, etc ...) coûteuses en temps !!!
J'insiste donc sur l'extrême importante de bien penser AVANT (conception + modélisation) de "faire" puis avoir à "rattraper"
Partager