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 :

Problème de remplacement . par , [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2014
    Messages : 15
    Points : 15
    Points
    15
    Par défaut Problème de remplacement . par ,
    Bonsoir à tous,

    Je suis en train de travailler sur une petite macro qui récupère des cours de bourse.
    Cependant, les formats avec lesquels je travaille ne conviennent pas : 4.07 au lieu de 4,07€
    J'ai donc entrepris de faire un "rechercher remplacer" au sein de ma macro (avec l'enregistreur), cependant cette opération ne fonctionne par pour les chiffres de format 4.569 (trois chiffres après la virgule), j'obtiens 4 569€ au lieu de 4,569€

    Voici le code :

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    Sub Récup_Cours_Duree()
    'Récupérer les données boursières à partir d'une date précise
     
    'Déclaration des variables
    Dim ligne As Integer
    Dim derniere As Integer
    Dim valeur As Integer
    Dim i As Integer
     
     
        With ActiveSheet.QueryTables.Add(Connection:= _
            "TEXT;C:\Users\Guigui\Downloads\Cotations20140709.txt", Destination:=Range( _
            "$A$1"))
            .Name = "Cotations20140709"
            .FieldNames = True
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = False
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod = 0
            .TextFilePromptOnRefresh = False
            .TextFilePlatform = 850
            .TextFileStartRow = 1
            .TextFileParseType = xlDelimited
            .TextFileTextQualifier = xlTextQualifierDoubleQuote
            .TextFileConsecutiveDelimiter = False
            .TextFileTabDelimiter = False
            .TextFileSemicolonDelimiter = True
            .TextFileCommaDelimiter = False
            .TextFileSpaceDelimiter = False
            .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1)
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
        End With
     
    '-----------------------------Trier par noms de valeurs------------------------------
     
    'Insérer une colonne
    Columns(1).EntireColumn.Insert
    'Déterminer le numéro de la dernière ligne
    derniere = Range("B1").End(xlDown).Row
     
    'Remplacer les références ISIN par les noms des valeurs
    ligne = 1
        While ligne <= derniere
     
            With Sheets("TEMP")
            .Cells(ligne, 1) = WorksheetFunction.VLookup(.Cells(ligne, 2).Value, Sheets("Libellés").Range("A1:C41"), 2, False)
            End With
     
            ligne = ligne + 1
     
        Wend
     
    'Supprimer la colonne des références ISIN
    Columns(2).Delete
     
    'Trier le tableau obtenu par ordre alphabétique et le mettre propre
        Sheets("TEMP").Range("A1").Select
        Selection.CurrentRegion.Select
        ActiveSheet.QueryTables("Cotations20140709").Delete
        ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$G$240"), , xlNo).Name = _
            "Tableau4"
        Range("Tableau4[#All]").Select
        ActiveWorkbook.Worksheets("TEMP").ListObjects("Tableau4").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("TEMP").ListObjects("Tableau4").Sort.SortFields.Add _
            Key:=Range("Tableau4[[#All],[Colonne1]]"), SortOn:=xlSortOnValues, Order _
            :=xlAscending, DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("TEMP").ListObjects("Tableau4").Sort
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
     
    Columns("G:G").Select
    Selection.Cut
    Columns("C:C").Select
    Selection.Insert Shift:=xlToRight
    Columns("D:G").Select
    Selection.Replace What:=".", Replacement:=",", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Si quelqu'un a une idée, je suis preneur

    Bonne soirée,

    Guillaume

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("D:G").Replace ".", ".", xlPart
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  3. #3
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    L'inconvénient d'utiliser le format de cellule pour tronquer une décimale, c'est que la décimale est toujours là et qu'on peut avoir l'impression (j'insiste sur ce terme) que les opérations qui utilisent ce nombre sont fausses.

    Par exemple, si tu as dans une cellule 2,006.
    Affiché avec deux chiffres après la virgule, elle apparaitra comme 2,01.

    Si tu la multiplies par 2, ça donne 4,012 (même si la cellule d'origine ne laisse apparaitre que 2,01), ce qui est juste.
    Si tu mets cette nouvelle cellule affiché avec deux chiffres après la virgule, ça donne 4,01.
    Autrement dit, à l'affichage, tu auras visuellement 2,01 * 2 = 4,01.
    Fait le test avec 2,003 et tu obtient l'effet inverse : 2,00 * 2 = 4,01.
    Même si le calcul qui est derrière est juste, visuellement, ce n'est pas très glamour et ça donne une impression d'erreur, surtout vu avec un regard extérieur.

    Je me suis déjà pris le chou par le passé avec des personnes qui ne parvenaient pas à comprendre ce phénomène et me soutenaient que les calculs étaient faux. Depuis, j'ai compris qu'il valait mieux un calcul faux mais visuellement juste que l'inverse.
    Donc, bien souvent, plutôt que de se contenter d'une format de cellule, je conseille de faire un véritable arrondi, que ce soit par macro ou par formule, pour que les données de base soient au bon format.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2014
    Messages : 15
    Points : 15
    Points
    15
    Par défaut
    Salut tout le monde !

    Merci à vous, j'ai réussi à résoudre mon problème, notamment grâce Mercatog.
    D'ailleurs, j'ai un peu du mal à comprendre comment ce problème est résolu, simplement en remplaçant un point par un autre. Surement le fait que VBA se code en anglais ?
    Je prends note de la remarque de Menhir, cela me sera sûrement utile pour la suite

    Merci et bonne continuation sur le forum !

  5. #5
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    comment ce problème est résolu, simplement en remplaçant un point par un autre
    en remplaçant un point par le séparateur décimal

    Je m'explique, le séparateur décimal de vba est toujours le point. Le séparateur d'Excel dépend de la configuration (dans ton cas la virgule)
    Une donnée est donc interprétée en passant de vba vers Excel et de ce fait intérprète le point vba comme le séparateur décimal d'Excel.
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  6. #6
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Pour compléter l'explication de mercatog :
    [Edit]
    Si une entrée est faite manuellement dans une cellule, Excel utilise sa propre routine de conversion où la virgule est considérée comme le séparateur décimal ( tel que défini dans le Panneau de configuration ), le séparateur de milliers étant un espace.
    Donc 1.200 sera interprété par Excel comme un simple texte ( le point n'est pas un séparateur numérique )
    et 1,200 sera interprété par Excel comme valant 1,2 ( la virgule est le séparateur décimal )


    VBA a sa propre routine automatisée de conversion des valeurs STRING, routine dans laquelle le point est le séparateur décimal et la virgule le séparateur de milliers.
    Donc "1.200" sera interprété par VBA comme valant 1,2 ( le point est le séparateur décimal )
    et "1,200" sera interprété par VBA comme valant mille deux cents ( la virgule est le séparateur de milliers ).

    Tu pourrais remplacer le Replace de mercatog

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("D:G").Replace ".", ".", xlPart
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For Each c In Range("D:G")
     
     'Si  c.Value contient contient la valeur STRING "1.200"
     'VBA convertit automatiquement cette valeur STRING en nombre et remplace dans la cellule "1.200" par la valeur numérique 1,2
     
     c.Value = c.Value 
     
    Next
    [/Edit]
    Cordialement

    Docmarti.

  7. #7
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    @Docmarti

    +1

    Je ne sais pas qui t'as mis un -1 mais, ton explication est pédagogique et claire.
    Sinon, on attends un justificatif pour le -1 de celui qui l'a mis
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  8. #8
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 677
    Points
    18 677
    Par défaut





    Oui, surtout que c'est le B-A-BA du fonctionnement interne d'Excel version française et du VBA …


    C'est parce que la vitesse de la lumière est plus rapide que celle du son que tant de gens paressent brillants avant d'avoir l'air con ! (Thomas Boishardy)

  9. #9
    Membre émérite
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Points : 2 684
    Points
    2 684
    Par défaut
    Citation Envoyé par mercatog Voir le message
    @Docmarti

    +1

    Je ne sais pas qui t'as mis un -1 mais, ton explication est pédagogique et claire.
    @mercatog
    Je te remercie pour ton appréciation. Je suis content que mon explication ait été assez claire pour être comprise.
    Cordialement

    Docmarti.

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

Discussions similaires

  1. Problème configuration : remplacement IP par localhost
    Par diegoooaaal dans le forum Apache
    Réponses: 9
    Dernier message: 28/09/2012, 07h29
  2. [PHP 4] Problème d'apostrophe remplacé par un antislash
    Par bloodstar dans le forum Langage
    Réponses: 6
    Dernier message: 04/10/2009, 16h41
  3. [E-03] - Problème enregistrement csv : ";" remplacé par ","
    Par flobuzz dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 26/02/2009, 13h35
  4. Problème pour remplacer le bouton submit par une image
    Par Leena666 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 14
    Dernier message: 24/06/2007, 16h30
  5. Probléme d'insertion par défault
    Par xavier62 dans le forum SQL
    Réponses: 7
    Dernier message: 28/11/2003, 13h03

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