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 :

Replace() buguée ? [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut Replace() buguée ?
    Bonjour à tous,

    Sur 2010 avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub test()
        Dim tmp As String, debut As Long
        tmp = "CUMUL : 135 022,05 4 000,00 123 456,78"
        debut = 8
        tmp = Replace(tmp, " ", "|", debut, 1, vbTextCompare)
    End Sub
    je m'attend à obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "CUMUL :|135 022,05 4 000,00 123 456,78"
    or j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "|135 022,05 4 000,00 123 456,78"
    Pour Start l'aide dit bien : Position dans l'argument expression où la recherche de sous-chaîne doit commencer.,
    pas qu'il va tout dégager... C'est moi qui interprète mal ?
    Qu'en pensez-vous ?
    Sinon je ferais autrement mais ça m'intrigue n'ayant rien vu là-dessus. Et puis 1 ligne c'est mieux que 5...
    Le but, vous l'aurez deviné, est de placer des séparateurs entre des décimaux avec séparateurs de millier gênants
    eric

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

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour eriic
    Fais comme moi : à mon âge, j'ai le temps de lire la rubrique jusqu'à la fin.
    Tu y verras ceci :
    Remarques
    La valeur renvoyée par la fonction Replace est une chaîne, une fois les substitutions effectuées, qui commence à la position spécifiée par l'argument start et se termine à la fin de la chaîne expression. Il ne s'agit pas d'une copie de la chaîne d'origine du début à la fin.
    Il te faut donc concaténer pour parvenir à tes fins.
    Ou, pour un seul caractère, y aller ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     tmp = "CUMUL : 135 022,05 4 000,00 123 456,78"
        Mid(tmp, 8, 1) = "|"
        MsgBox tmp
    Amitiés
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  3. #3
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 950
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 950
    Points : 9 279
    Points
    9 279
    Par défaut
    hello,

    Effectivement, j'ai vu un exemple où l'on voit bien que le paramètre start conditionne aussi le début de la chaîne de sortie :
    Replace ("alligator", "a", "z", 2 ) – This statement will result into “lligztor” as here the Replace statement starts searching for character ‘a’ after the second position in the source string and then replaces it with ‘z’ character.
    Question bête : pourquoi ne fais-tu pas un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tmp = Replace(tmp, ": ", ":|")
    ?

    Ami calmant J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

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

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    On voit tout simplement là la différence existant entre le regard et intérêts anglo-saxons et latins.
    L'anglo-saxon a bâti une fonction qui extrait une chaîne A d'une chaîne B en la modifiant comme il l'entend. Il n'a pas cherché (moins intéressé) à modifier une chaîne A.
    La fonction Replace est donc avant tout une fonction d'extraction.
    Le Latin, lui, y verrait d'autres opportunités, que l'anglo-saxon n'est pas intéressé à saisir.
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  5. #5
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par unparia Voir le message
    On voit tout simplement là la différence existant entre le regard et intérêts anglo-saxons et latins.
    L'anglo-saxon a bâti une fonction qui extrait une chaîne A d'une chaîne B en la modifiant comme il l'entend. Il n'a pas cherché (moins intéressé) à modifier une chaîne A.
    La fonction Replace est donc avant tout une fonction d'extraction.
    Le Latin, lui, y verrait d'autres opportunités, que l'anglo-saxon n'est pas intéressé à saisir.
    Pas vraiment non. C'est plutôt la normalité des opérations sur des chaînes dans VB. Encore que dans VB.net, il y ait moyen de le faire autrement. Dans VB, les opérations sur les chaînes se font presque systématiquement sur une ou des copies de la chaîne d'origine.

    Sauf horreur de ma part, si les paramètres de début et de fin ve sont pas renseignés, replace ramène toute la chaîne
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

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

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 422
    Points
    12 422
    Par défaut
    Bonjour cmarcotte
    Sauf horreur de ma part, si les paramètres de début et de fin ve sont pas renseignés, replace ramène toute la chaîne
    bien évidemment, mais il s'agit alors d'une extraction avec modification à compter du 1er caractère et non d'un remplacement dans la chaîne
    Amitiés

    EDIT : pour aider à comprendre cet esprit, j'invite à s'interroger (par analogie) sur le distinguo fait entre les fonctions worksheetfunction.replace et worksheetfunction.substitute.
    Si les deux ont été créées (alors que l'une aurait suffi si la chaine de départ devait toujours être extraite intégralement), c'est qu'il y a une raison et une logique différentes

    La fonction Replace, telle que conçue, permet par exemple dans certains cas de figure, conjuguée à split, d'obtenir un array plus "agile" (contenant l'éclatement d'une seule partie de la chaîne de départ).
    Je n'accepte pas de demande d' "amitié" individuelle. Tout développeur est pour moi un ami.
    Je n'ouvre AUCUN classeur tiers (avec ou sans macro ******). Ne m'en proposez donc pas .

    ****** : Non, non ... un classeur .xlsx ne "peut" par exemple et entre autres pas contenir un activex (de surcroît invisible) , "bien sûr" ...

    Il est illusoire de penser que l'on saurait exprimer valablement et précisément en un langage (rigide) de développement ce que l'on peine à exprimer dans le langage naturel, bien plus souple.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Il ne faut pas perdre de vu qu'un microprocesseur n'est rien d'autre qu'un grain de sable doper à l'arsenic (silicium).

    Il n'est capable que de générer des tableaux!

    Ainsi la substitution dans un tableau ne peut ce faire que par réécrire d'une partie du tableau par un valeur de tableau de taille identique.

    Un mid par définition est une extraction d'une partie du tableau.

    Si via mon mid je veux remplacer 1 caractères par 2 c'est impossible.

    Il n'existe pas de méthode pour replace un valeur par une autre dans un même variable

    Le replace n'est rien d'autre que la concaténation d'un split dans un autre tableau de taille différente!

  8. #8
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    Bonjour à tous,

    Il va donc falloir que je revoie ma définition du verbe remplacer :-)
    En relisant l'aide une autre info aurait pu m'alerter aussi :
    Si start > Len(expression) La fonction Replace renvoie Une chaîne de longueur nulle.

    Question bête : pourquoi ne fais-tu pas un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tmp = Replace(tmp, ": ", ":|")
    En fait l'opération suivante est une boucle pour mettre un "|" entre chaque nombre décimal (3 car. après une ","). Pour remplacer cet espace et pas ceux des séparateurs de millier.

    Mid(tmp, 8, 1) = "|" me plait bien, reviens à ce que j'imaginais pour Replace avec tous ses paramètres.

    Merci à tous pour votre avis et éclairage.
    eric

  9. #9
    Invité
    Invité(e)
    Par défaut
    et pourquoi pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tmp =spilt( "CUMUL : 135 022,05 4 000,00 123 456,78",":")(0) & ":|" & trim(spilt( "CUMUL : 135 022,05 4 000,00 123 456,78",":")(1))
    bien que le mid me plait mieux!

  10. #10
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 267
    Points : 3 663
    Points
    3 663
    Par défaut
    et pourquoi pas...
    Comme je disais dans mon post précédent : En fait l'opération suivante est une boucle pour mettre un "|" entre chaque nombre décimal (3 car. après une ",")

    Pour tout dire je pars de :
    "CUMUL : 135 022,05 4 000,00 123 456,78"
    pour obtenir :
    "CUMUL :|135 022.05|4 000.00|123 456.78"
    fonction personnalisée qui retournera un tableau splitté sur "|"
    Seulement j'ai 2 cas de figure :
    - début avec des chaines fixes qui peuvent avoir plusieurs espaces,début que je pourrai très bien éliminer avant d'appeler ma fonction
    - ou bien début avec une chaine représentant un entier "1234" de longueur variable dont j'ai besoin et qui doit être présent dans tableau(0)
    Je passe donc en paramètre la position du 1er "|" et découpe le reste selon les positions des ",".
    eric

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

Discussions similaires

  1. [ODBC] Fonction Replace en ODBC
    Par Alexandre T dans le forum Access
    Réponses: 4
    Dernier message: 10/01/2007, 11h02
  2. problème avec "replace"
    Par lilipuce83 dans le forum ASP
    Réponses: 3
    Dernier message: 26/05/2004, 16h42
  3. [C#] Methode Replace
    Par pc152 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 22/05/2004, 17h17
  4. Prob d'execution de REPLACE *** INTO
    Par Mystman dans le forum Langage SQL
    Réponses: 6
    Dernier message: 26/04/2004, 16h41
  5. Cherche Fonction du style replace...
    Par sdchamplas dans le forum Langage SQL
    Réponses: 4
    Dernier message: 31/03/2003, 13h54

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