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 :

modification d'un mot via "replace"


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut modification d'un mot via "replace"
    Bonjour,

    Je dois, sous excel 2010, remplacer des mots par leurs abreviations.
    J'utilise cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str = Replace(str, "Direction Générale", "DG", 1, 1, vbTextCompare)
    Le mot ou la phrase matché pouvant être n'importe où dans str.
    Le problème vient du type de "régles d'abréviation" suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str = Replace(str, "Fonction", "Fonc°", 1, 1, vbTextCompare)
    lorsque str = "Fonctionnel".

    Evidemment, ca me remplace "Fonctionnel" par "Fonc°nel" ...
    Je dois donc matché un mot uniquement en totalité.

    Problème, un mot n'est pas forcement suivi d'un espace dans mon cas.
    Il peut y avoir ",", "&", "/" et plein d'autre caractere joyeux.

    Je me demandais s'il n'y avais pas une fonction qui me permettrai de ne pas matché les chaine suivi d'une lettre.
    J'ai pensé aux regex, mais j'ai du mal a mettre le système en place.

    Avez-vous un conseil ou une piste à me proposer s'il vous plaît ?
    Merci beaucoup de votre lecture.

    Cordialement.

  2. #2
    Expert confirmé
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Par défaut
    Evidemment, ca me remplace "Fonctionnel" par "Fonc°nel" ...
    Bonjour,

    la différence flagrante entre les deux est la longueur de chaîne, donc en cumulant avec un LEN, ça devrait mieux marcher

    cordialement,

    Didier

  3. #3
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Bonjour,

    Effectivement, cela aurai pu marcher si seul un mot était dans la chaine.
    En réalité, j'en ai plus.

    str peut ressembler a cela :
    mot1[separateur]mot2[separateur]Fonction[separateur]mot3[separateur]Fonctionnel
    [separateur] peut contenir ",", "&", "/" et d'autre caractere que je ne peux lister mais il ne contient pas de lettres.

    Donc, c'est pour cela que j'aurai aimé differencier "fonction" de "fonctionnel" en cherchant a savoir si après "fonction" il y a une lettre.

    En fait, la règle d'abreviation "generique" est la suivante :

    tout les mots terminant par "tion" se voient "tion" remplacer par "°".
    Je liste manuellement les mot dans "replace".
    Cependant, je ne me vois pas regarder pour tous les mot en "tion" s'il n'y a pas un mots qui continue, a l'instar de "Fonction" -> "Fonctionnel".

    Voici ce que j'ai fait :

    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
    32
    33
    34
    35
    36
    37
    38
    39
     
        'regle en "tion[s]" -> "°"
        str = Replace(str, "Opérations", "Opera°", 1, 1, vbTextCompare)
        str = Replace(str, "Opération", "Opera°", 1, 1, vbTextCompare)
        str = Replace(str, "Operations", "Opera°", 1, 1, vbTextCompare)
        str = Replace(str, "Operation", "Opera°", 1, 1, vbTextCompare)
        str = Replace(str, "informations", "Informa°", 1, 1, vbTextCompare)
        str = Replace(str, "information", "Informa°", 1, 1, vbTextCompare)
        str = Replace(str, "Evolutions", "Evolu°", 1, 1, vbTextCompare)
        str = Replace(str, "Evolution", "Evolu°", 1, 1, vbTextCompare)
        str = Replace(str, "Formation", "Forma°", 1, 1, vbTextCompare)
        str = Replace(str, "Facturation", "Factura°", 1, 1, vbTextCompare)
        str = Replace(str, "Géolocalisation", "Géolocalisa°", 1, 1, vbTextCompare)
        str = Replace(str, "Production", "Produc°", 1, 1, vbTextCompare)
        str = Replace(str, "Associations", "Associa°", 1, 1, vbTextCompare)
        str = Replace(str, "gestion", "Ges°", 1, 1, vbTextCompare)
        str = Replace(str, "Préparation", "Prépara°", 1, 1, vbTextCompare)
        str = Replace(str, "relations", "Relat°", 1, 1, vbTextCompare)
        str = Replace(str, "relation", "Relat°", 1, 1, vbTextCompare)
        str = Replace(str, "Rémunérations", "Rémunéra°", 1, 1, vbTextCompare)
        str = Replace(str, "Rémunération", "Rémunéra°", 1, 1, vbTextCompare)
        str = Replace(str, "Coordinations", "Coord°", 1, 1, vbTextCompare)
        str = Replace(str, "Coordination", "Coord°", 1, 1, vbTextCompare)
        str = Replace(str, "interventions", "interven°", 1, 1, vbTextCompare)
        str = Replace(str, "intervention", "interven°", 1, 1, vbTextCompare)
        str = Replace(str, "Fonctions", "Fonc°", 1, 1, vbTextCompare)
        str = Replace(str, "Fonction", "Fonc°", 1, 1, vbTextCompare)
        str = Replace(str, "Innovations", "Innov°", 1, 1, vbTextCompare)
        str = Replace(str, "Innovation", "Innov°", 1, 1, vbTextCompare)
        str = Replace(str, "Communications", "Com°", 1, 1, vbTextCompare)
        str = Replace(str, "Communication", "Com°", 1, 1, vbTextCompare)
        str = Replace(str, "Obligations", "Oblig°", 1, 1, vbTextCompare)
        str = Replace(str, "Obligation", "Oblig°", 1, 1, vbTextCompare)
        str = Replace(str, "fidélisation", "fidélisa°", 1, 1, vbTextCompare)
        str = Replace(str, "Administration", "Administra°", 1, 1, vbTextCompare)
        str = Replace(str, "Commercialisation", "Commercialisa°", 1, 1, vbTextCompare)
        str = Replace(str, "Satisfaction", "Satisfac°", 1, 1, vbTextCompare)
        str = Replace(str, "Distribution", "Distribu°", 1, 1, vbTextCompare)
        'fin regle en "tion[s]" -> "°"
    Il y a une répétitions pour matché le "s" aussi, c'est pas joli-joli a voir mais ce n'est que comme ca que j'ai réussi a faire.

    Merci beaucoup de ta participation.

    Cordialement.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 53
    Par défaut
    Citation Envoyé par SofEvans Voir le message
    Je me demandais s'il n'y avais pas une fonction qui me permettrai de ne pas matché les chaine suivi d'une lettre.
    Bonjour SofEvans,

    En suivant cette idée j'ai pensé à çà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim Str$, n1%, n2%
    n1 = InStr(1, Str, "Fonction")
    If n1 > 0 Then
        If n1 = 1 Or Right(Left(Str, n1 - 1),1) = " " Then
            n2 = InStr(6, Str, " ")
            If n2 = 0 Then n2 = Len(Str) + 1
            If n2 > 0 Then
                If n2 - n1 = Len("Fonction") Then Str = Replace(Str, "Fonction", "Fonc°", 1, 1, vbTextCompare)
            End If
        End If
    End If
    Si le mot est trouvé alors :
    Si le mot commence la chaine ou si le caractère précédent le mot est un espace alors :
    Prendre la position de de l'espace d'après (ou le simuler quand on est en bout de chaine) et comparer la longueur du mot avec la longueur de la chaine

    Cordialement

    R

  5. #5
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Bonjour,

    Je vais étudier ton code, j'aimerai comprendre ce qu'il fait.
    Je ne connait pas par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim Str$, n1%, n2%
    le $ et % me laisse perplexe, je vais me renseigner la dessus.

    Merci beaucoup

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 53
    Par défaut
    Oups il faut corriger cette ligne, sorry! :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If n1 = 1 Or Right(Left(Str, n1 - 1), 1) = " " Then
    $ remplace as string
    % remplace as integer

    Edit : bonjour Ormonth (le rafraichissement avant de poster je maitrise pas...)

  7. #7
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Bonjour,

    je prend note de ta correction.
    Merci beaucoup pour $ et %, j'avais commencé a chercher mais sans grand résultat pour le moment.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 53
    Par défaut
    Comme je n'avais pas vu ton post de 15h01 avant de poster, la version fonction :
    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
    Sub test()
    Dim Str$
        Str = RepBis(Str, "Fonction", "Fonc°")
    End Sub
     
    Function RepBis$(t$, x$, y$)
    Dim n1%, n2%
    RepBis = t
    n1 = InStr(1, t, x)
    If n1 > 0 Then
        If n1 = 1 Or Right(Left(t, n1 - 1), 1) = " " Then
            n2 = InStr(6, t, " ")
            If n2 = 0 Then n2 = Len(t) + 1
            If n2 > 0 Then
                If n2 - n1 = Len(x) Then RepBis = Replace(t, x, y, 1, 1, vbTextCompare)
            End If
        End If
    End If
    End Function
    Cordialement

    R

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