IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

[VBA-E] Séparer deux valeurs d'une cellule


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Points : 15
    Points
    15
    Par défaut [VBA-E] Séparer deux valeurs d'une cellule
    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.

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Le pb se rencontre pour les noms ou prénoms composés... Sinon tu as split. Jète un oeil dans l'aide
    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
    Juste une idée

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Merci pour cette réponse rapide, je met ça en forme est je vais voir si ça colle.

  4. #4
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Jemétrompé
    Remplace "elseif Nbre > 2 then" par "elseif Nbre > 1 then" sinon cépabon

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 344
    Points : 158
    Points
    158
    Par défaut
    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)))

  6. #6
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Bonne chance avec les Van et les de ...

    Ca me paraît vachement périlleux de se baser sur les espaces.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    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

  8. #8
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    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+

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 344
    Points : 158
    Points
    158
    Par défaut
    tien espace dur je connaissais pas , je vais retenir cette idée

    merci ouskel

  10. #10
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mars 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2017
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Parser une valeur en fonction du n°ASCII
    Citation Envoyé par AlainTech Voir le message
    Bonne chance avec les Van et les de ...

    Ca me paraît vachement périlleux de se baser sur les espaces.
    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 :
    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
    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.
    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).

  11. #11
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    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.

  12. #12
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mars 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mars 2017
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    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).

  13. #13
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    je n'avais pas pensé à ce genre de cas particulier
    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.
    etc ...

    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é).

  14. #14
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    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****) :
    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
    N'est pas sans risques (à divers titres), bien que plus rigoureuse que la tienne.

    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"

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 26/10/2014, 16h47
  2. Réponses: 4
    Dernier message: 25/07/2013, 22h48
  3. [VBA-E] RechercheV si changement de valeur sur une cellule
    Par bonilla dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/01/2007, 16h22
  4. VBA-Excel copier la valeur d'une textbox dans une cellule
    Par GrandGarfield dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 29/08/2006, 10h15
  5. [VBA-E] Effacer les valeurs d'une plage de cellules
    Par jfamiens dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 10/06/2006, 11h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo