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 :

Sur un poste client le séparateur décimal de Visual Basic Editor est une virgule au lieu d'un point


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé Avatar de francis60
    Homme Profil pro
    Modélisation coût/process
    Inscrit en
    Août 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Modélisation coût/process
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 179
    Par défaut Sur un poste client le séparateur décimal de Visual Basic Editor est une virgule au lieu d'un point
    Bonjour à tous,

    J'ai toujours pensé que tous les postes utilisaient le séparateur décimal point (.) pour les valeurs numériques dans l'affichage VBE quels que soient les paramètres locaux de l'affichage Excel ou du système, or sur ce poste c'est la virgule qui est utilisée et cela affecte les traitements VBA.

    Sur un poste client le séparateur décimal de Visual Basic Editor à l'affichage est une virgule(,) au lieu d'un point(.)

    Dans la fenêtre Immediate Window (CTRL+G)
    Alors que j'obtiens 1.5 habituellement.

    De même la copie d'une plage de cellules contenant des chiffres décimaux dans un tableau VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim MonRange As Range
    Dim MaTable
     
    Set MonRange = Range("A1:D20")
    MaTable = MonRange
    Ressort les valeurs sous forme de texte sur ce PC particulier à cause de la virgule alors que sur tous les autres postes les données sont bien copiées sous forme de chiffres dans le tableau MaTable.


    Comment accède-t-on à cette variable locale qui pourrait s'appeler VBE.DecimalSeparator en lecture et en écriture ?



    Remarque: le poste qui présente le problème est plus récent que celui qui a servi a créer le code et faire les tests.
    Merci de relire la question de A à Z avant de répondre.

  2. #2
    Expert confirmé
    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
    Par défaut
    Bonjour
    Ne pas confondre affichage d'un nombre avec nombre en mémoire.
    Si une cellule (ou une plage de cellule) est formatée en numérique, c'est (ce sont) un/des numérique() en mémoire qui sont utilisés, et non leur v"représentation" en affichage.
    J'en déduis que ton exposé est incomplet et que tes données ne sont pas de Excel à Excel, mais via un fichier texte ou csv. Ou que les cellules concernées ne sont pas formatées en numérique.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    ce sont les paramètre régionaux de Windows qui font ça.

    ceci explique certain conflits entre Excel et VBA!
    normalement ça ne devrait pas poser de problème dans Excel ainsi que pour les formules. le séparateur décimal Français est la virgule la belle "affaire"!

    ça fonctionne normalement et ça redevient des point sur un Pc Anglais.

    dans le cas d'un import CSV ça devient problématique, car les point reste des points au format texte et pour l'export CSV les virgules reste de virgules ce qui pour toute le langues est du texte.

    si je saisi 1,1 dans Excel ça reste 1,1 mais en texte alors que 1.1 devient 1,1 au format numérique ,!§??

    le mieux est de géré c'est projet VBA comme si il s'agissait toujours d'un fichier Français!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Range("A1").Value=1.1
    double =val(replace(Range("A1").Value,",","."))
    ainsi plus de problème de conversion implicite car pour le coups c'est une conversion explicite!

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    ceci dans la fenêtre d'exécution :
    me donne bien 1,5 (un virgule cinq) et non 1.5 (un point cinq) ! Mon séparateur décimal système est la virgule.
    Pour voir quel est le séparateur décimal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sub Test()
     
        MsgBox "Le séparateur décimal est " & IIf(Asc(Format(0, ".")) = 44, "la virgule !", "le point !")
     
    End Sub

  5. #5
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 678
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Migrer les applications VBA Access et VBA Excel vers la Power Platform
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Coffrets disponibles de mes ouvrages : https://www.editions-eni.fr/jean-philippe-andre
    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  6. #6
    Expert éminent
    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
    Par défaut
    Bonjour, bonjour !

    Effectivement c'est une grossière confusion : ne pas confondre le séparateur décimal du VBA (le point)
    avec le séparateur décimal d'Excel (souvent la virgule par défaut avec Windows en version française) ‼

    La preuve :



    Voilà, voilà !

    _________________________________________________________________________________________________________
    Je suis Paris, Nice, Bruxelles, Charlie, …

  7. #7
    Membre confirmé Avatar de francis60
    Homme Profil pro
    Modélisation coût/process
    Inscrit en
    Août 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Modélisation coût/process
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 179
    Par défaut
    Merci à tous,


    J'avais déjà rencontré le problème exposé par unparia entre le séparateur décimal du VBA : [ le point ] et le séparateur décimal d'Excel utilisé dans l'affichage utilisateur : [ Application.International(xlDecimalSeparator) ]

    Les cellules de ma feuille de calcul contiennent bien des valeurs décimales comme précisé à l'origine et comme Application.International(xlDecimalSeparator) = "," les chiffres s'affichent ainsi : 3,14

    Je réalise qu'au moment où VBA lit la valeur d'un Range, c'est le séparateur décimal système ( dans mon cas ".") qui entre en compte (quelle que soit la valeur de Application.UseSystemSeparators ) et le code considère que ce contenu est une chaîne de caractères dès qu'il contient un ","

    Si le séparateur décimal système = "," le problème ne survient pas.

    Avant de lire vos réponses, j'avais mis en place le contournement proposé par rdurupt.

    Je vais faire faire d'autres essais pour valider ma conclusion concernant le rôle du séparateur décimal système

  8. #8
    Membre confirmé Avatar de francis60
    Homme Profil pro
    Modélisation coût/process
    Inscrit en
    Août 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Modélisation coût/process
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 179
    Par défaut
    Merci Theze pour cette astuce
    Citation Envoyé par Theze Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        MsgBox "Le séparateur décimal est " & IIf(Asc(Format(0, ".")) = 44, "la virgule !", "le point !")
    Existe-t-il d'autres manières de connaitre le séparateur décimal système ?

    Peut-on le modifier depuis le code ?

  9. #9
    Invité
    Invité(e)
    Par défaut
    Indépendamment de ta dernière demande!

    http://www.developpez.net/forums/d15...u/#post8394195

    Édite:

    Personnellement je ne trouve pas qu'il y ait un intérêt à modifier le paramètre régionaux de Windows.

    Le chemin de l'enfer est pavé de bonnes intentions.

    La virgule est sans conséquence dans Excel. Juste en vba. Les incompatibilités de format, de syntaxe ou autre sont multiples.

    Il faut donc soigner le code vba. Pour convertir d'Excel vers vba dz la langue natif vers l'international. Sachant qu'Excel acceptera le format international même si dernière il fera une conversation implicite vers le paramètre régionaux de Widwos!

    Si dans une cellule tu bien un numérique avec un point comme séparateur décimal dans Windows français, c'est que ta cellule même à été formaté en anglais. Quand tu fais un copier coller le point devient une virgule. Dans ce cas tu fait un copier coller de ta cellule puis un copier coller par format.

    Ou un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    range("B1").numberformat =range("A1").numberformat 
    Range("B1").value=Range("A1").value
    Note cependant que tu as un service médical d'urgence de pas trop mauvaise facture à ton chevets et en la matière je ne parle pas de moi bien que je n'ai pas habitude de faire preuve de fausses modestie
    Dernière modification par Invité ; 31/08/2016 à 21h39.

  10. #10
    Inactif  

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

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Pour ma part, je te dirais de jeter un œil par là et de procéder aux ajustements qui s'imposent dans ton code.

  11. #11
    Expert éminent
    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
    Par défaut
    Citation Envoyé par francis60 Voir le message
    Existe-t-il d'autres manières de connaitre le séparateur décimal système ?
    Oui comme précisé dans l'aide VBA interne et aussi dans le tutoriel pourtant indiqué dans le post #5
    sans compter dans les discussions des forums comme par exemple les lignes 15 à 17 du code de ce post !
    (y lire aussi les posts #5 & 6 …)

    Et faut-il encore que les cellules ne soient pas au format texte …

  12. #12
    Membre confirmé Avatar de francis60
    Homme Profil pro
    Modélisation coût/process
    Inscrit en
    Août 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Modélisation coût/process
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 179
    Par défaut
    Marc-L, j'ai bien lu le tuto de A à Z et j'ai bien noté le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IIf(.UseSystemSeparators, .International(xlDecimalSeparator), .DecimalSeparator)
    J'ai fait quelques tests, la seule façon d'atteindre le séparateur décimal système quelque soit la valeur de 'Application.UseSystemSeparators' c'est avec l'astuce de Clément.Si Application.UseSystemSeparators = False Alors Application.International(xlDecimalSeparator) = Application.DecimalSeparator

    Si l'on force Application.UseSystemSeparators = True alors seulement on peut accéder au séparateur décimal système via Application.International(xlDecimalSeparator) puis ensuite il faut remettre le Application.UseSystemSeparators au statut d'origine choisi par l'utilisateur.

    Personnellement je ne trouve pas qu'il y ait un intérêt à modifier le paramètre régionaux de Windows.
    Finalement, je vais suivre le conseil de rdurupt et continuer avec la conversion explicite pour fixer le Pb.
    Je continue les tests en // car je n'ai pas encore une compréhension complète du bug.

  13. #13
    Expert éminent
    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
    Par défaut
    Citation Envoyé par francis60 Voir le message
    Si Application.UseSystemSeparators = False Alors Application.International(xlDecimalSeparator) = Application.DecimalSeparator
    Assertion fausse : tu n'as pas bien lu ou pas bien compris alors !
    L'astuce de Theze et Clément est évidemment valable pour connaître le séparateur décimal en cours côté Excel.
    Mais ce n'est pas la seule : il suffit juste de bien comprendre ma ligne de code …

    Par défaut à l'installation d'Excel, Application.DecimalSeparator est bien égale à Application.International(xlDecimalSeparator)
    mais il ne faut surtout pas l'entendre comme une constante, ce serait une erreur bien trop grossière ‼

    Sinon une seule propriété suffirait, pourquoi alors y-en-a-t-il deux ?!
    Et pourquoi le VBA dispose-t-il aussi de la propriété UseSystemSeparators ?

    Tout simplement par exemple dans le cas d'un "import" de données (plutôt un "Coller") avec un séparateur décimal
    différent de celui du système, en désactivant cette propriété comme dans l'exemple de l'aide VBA
    le séparateur décimal peut être modifié via Application.DecimalSeparator.
    (Juste avant cette modification, les deux propriétés peuvent être égales, ton assertion est donc fausse !)
    Une fois les données numériques bien importées il suffit de réactiver UseSystemSeparators et là
    Application.DecimalSeparator
    reste différent de Application.International(xlDecimalSeparator),
    le séparateur décimal en cours n'étant donc plus celui de cette propriété Application.DecimalSeparator !
    D'où ma ligne de code ! Tout ceci étant dans l'aide VBA interne …

    Inutile de modifier Windows ! Juste en suivant l'exemple de l'aide VBA de la propriété UseSystemSeparators …

    Séparateur décimal et dates, même combat : il suffit de chauffer à peine une paire de neurones !

  14. #14
    Membre confirmé Avatar de francis60
    Homme Profil pro
    Modélisation coût/process
    Inscrit en
    Août 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Modélisation coût/process
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 179
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    c'est une grossière confusion [...]
    Assertion fausse : tu n'as pas bien lu ou pas bien compris [...]
    il suffit juste de bien comprendre, ce serait une erreur bien trop grossière ‼ [...]
    il suffit de chauffer à peine une paire de neurones !
    Application. Use System Separators séparateur décimal système Application. DecimalSeparator Application. International (xlDecimalSeparator)
    FALSE , , ,
    FALSE , . .
    FALSE . , ,
    FALSE . . .
    TRUE , , ,
    TRUE , . ,
    TRUE . , .
    TRUE . . .

  15. #15
    Expert éminent
    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
    Par défaut

    Si pour toi séparateur décimal système correspond au séparateur décimal d'Excel,
    j'aimerais bien que tu nous expliques comment tu arrives au résultat des lignes n°2 et 3 de ton tableau ‼

    Car encore une fois :

    UseSystemSeparators Séparateur décimal utilisé dans Excel
    True Application.International(xlDecimalSeparator)
    False Application.DecimalSeparator
    Cf aide VBA …

  16. #16
    Membre confirmé Avatar de francis60
    Homme Profil pro
    Modélisation coût/process
    Inscrit en
    Août 2011
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Modélisation coût/process
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2011
    Messages : 179
    Par défaut
    Citation Envoyé par Marc-L Voir le message
    séparateur décimal système
    Correspond au séparateur décimal du système*.
    Le système dont je parle est le système d'exploitation de l’ordinateur, par exemple Windows 7.

    * : Control Panel> Region and Language> Format tab> Additional Settings> Decimal symbol

  17. #17
    Expert éminent
    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
    Par défaut




    Comme pourtant indiqué dans l'aide VBA
    , Application.International(xlDecimalSeparator) est ce séparateur décimal "système" ‼
    Sans compter le tutoriel ni les exemples dans les forums ! Ton tableau n'a donc aucun sens …

    Francis a raison !

  18. #18
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Citation Envoyé par rdurupt Voir le message

    si je saisi 1,1 dans Excel ça reste 1,1 mais en texte alors que 1.1 devient 1,1 au format numérique ,!§??
    Si tu saisis 1,1 à partir de VBA ou en tapant directement sur la feuille ?

  19. #19
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Citation Envoyé par francis60 Voir le message
    Sur un poste client le séparateur décimal de Visual Basic Editor à l'affichage est une virgule(,) au lieu d'un point(.)

    Dans la fenêtre Immediate Window (CTRL+G)
    Alors que j'obtiens 1.5 habituellement.
    Si tu obtiens 1.5, la langue dans tes paramètres régionaux n'est pas Français(France).

    Tu ne serais pas Suisse par hasard?

  20. #20
    Expert confirmé
    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
    Par défaut
    Bonjour,
    en "tapant" directement sur une cellule la feuille (et sur mon PC) :
    - l'utilisation de la touche point du pavé numérique (code 190) transforme ce point en virgule
    - l'utilisation de la touche point (shift + (code 110) laisse sous forme de point
    Ce distinguo entre les deux touches existe sur tous les PC, en matière de saisie dans une cellule Excel.
    Je n'ai pas de clavier de portable sous la main.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Chercher un fichier spécifique sur le poste client
    Par Orb Dorb dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 14/10/2005, 18h45
  2. Réponses: 6
    Dernier message: 06/10/2005, 20h54
  3. Appeler un programme sur le poste client avec <object>
    Par ouioui2000 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 22/08/2005, 14h40
  4. [Forms5]ouvrir un executable sur un poste client
    Par anthony8 dans le forum Forms
    Réponses: 2
    Dernier message: 30/06/2005, 14h26
  5. [CR10][ASP.NET]Impression sur le poste Client
    Par David.V dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 30/04/2004, 13h41

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