Virgule disparaissant lors de l'alimentation d'une cellule via macro

Bonjour tout le monde,

Ce n'est pas dans mes habitudes mais je suis à court d'idées pour résoudre mon problème...

J'ai une macro qui, après avoir récupérer des données DB2 via une requête http, alimente une feuille excel case par case avec les résultats (jusque là tout va bien).

Tout est géré en "string" pour éviter les problèmes de format lors de l'alimentation avec CStr :

'Sépare le retour DB2 en headers|résultats
    resultat = Split(db2Result, "|")

'Sépare les résultats en colonnes
    For i = LBound(resultat) To UBound(resultat)
        colonne = Split(resultat(i), ";")

        For j = LBound(colonne) To UBound(colonne)
            Worksheets(Feuille).Cells(i + POStab, j + 1) = CStr(colonne(j))
        Next j

    Next i

Excel gère apparemment seul le format des cellules alimentées (les dates sont bien converties en dates, etc...).

results

Le soucis est que lors du remplissage de la colonne de droite, il formate les cellules en "Nombre" (pourquoi pas) mais enlève la virgule alors que la cellule est alimentée correctement (exemple pour la première ligne) :

enreg

Si cela peut servir de piste j'obtiens le résultat désiré en forçant le formatage des cellules en texte avec .NumberFormat="@" mais tous mes tableaux se retrouvent impactés alors qu'il n'y a à la base pas de problème dans les autres cellules, notamment sur les dates

Bonjour Ziip et

Comme ça on ne peut pas beaucoup t'aider

Pas moyen d'avoir un petit but de fichier ?

A+

Bonjour Ziip,

J'crois qu'j'ai peut-être trouvé la solution à ton problème !


1) Code VBA à utiliser si "SELL_PRIC_1_AMT" est la dernière colonne à droite

'Sépare le retour DB2 en headers|résultats
    resultat = Split(db2Result, "|")

'Sépare les résultats en colonnes
    Dim chn$, k As Byte: k = UBound(resultat)
    For i = LBound(resultat) To k
        colonne = Split(resultat(i), ";")

        For j = LBound(colonne) To UBound(colonne)
            If j < k Then chn = CStr(colonne(j)) Else chn = Replace$(colonne(j), ",", ".")
            Worksheets(Feuille).Cells(i + POStab, j + 1) = chn
        Next j

    Next i

si ton tableau a plus de 255 colonnes, tu dois remplacer k As Byte par k%


2) Code VBA à utiliser si "SELL_PRIC_1_AMT" est avant la dernière colonne, par exemple la 3ème

'Sépare le retour DB2 en headers|résultats
    resultat = Split(db2Result, "|")

'Sépare les résultats en colonnes
    Dim chn$
    For i = LBound(resultat) To UBound(resultat)
        colonne = Split(resultat(i), ";")

        For j = LBound(colonne) To UBound(colonne)
            If j <> 3 Then chn = CStr(colonne(j)) Else chn = Replace$(colonne(j), ",", ".")
            Worksheets(Feuille).Cells(i + POStab, j + 1) = chn
        Next j

    Next i

D'autre part, l'indice bas d'un tableau utilisé par Split() est 0 ; donc tu dois pouvoir mettre :

For i = 0 To k et For j = 0 To UBound(colonne)

dhany

Merci @BrunoM45 pour ton intérêt, mais je ne peux malheureusement pas partager le classeur pour des questions de confidentialités...

Je viens de tester ta proposition @dhany... tu es un génie !! ^^ Comme tu peux le voir dans le tableau complet ci-dessous, il y a d'autres colonnes à droite qui sont dans la même situation.

screenshot 1

Les tableaux étant variables en taille / disposition / contenu et compte tenu du nombre de feuille de calculs que j'ai, j'essaye de rester le plus général possible pour éviter d'avoir à gérer trop de cas particuliers.

En résumé, dans mon workflow actuel :

  • les données sont récupérées du serveur sous la forme 1591,29 (virgule)
  • elles sont écrites telles quelles dans le classeur mais excel supprime la virgule et convertit le tout en nombre
  • tu proposes de forcer le remplacement de la virgule par un point...et ça marche

Sachant que mon classeur est bien paramétré avec un séparateur décimal en virgule, je me demande bien pourquoi il est capricieux comme ça et m'a donné autant de fil à retordre ! Si quelqu'un peut apporter ses lumières

Bonjour Ziip,

Voici un code plus général, pour toutes les colonnes :

Option Explicit

Sub Essai()

  Dim Feuille As Worksheet, db2Result$, POStab$
  Dim resultat, colonne, chn$, i%, j%

  'Sépare le retour DB2 en headers|résultats
  resultat = Split(db2Result, "|")

  'Sépare les résultats en colonnes
  For i = 0 To UBound(resultat)
    colonne = Split(resultat(i), ";")
    For j = 0 To UBound(colonne)
      If Right$(Cells(1, 1 + j), 4) = "_AMT" Then
        chn = Replace$(colonne(j), ",", ".")
      Else
        chn = CStr(colonne(j))
      End If
      Worksheets(Feuille).Cells(i + POStab, j + 1) = chn
    Next j
  Next i

End Sub

J'ai supposé que suite à la récupération du serveur, la ligne des entêtes du tableau est la ligne n° 1 et la 1ère colonne du tableau est la colonne A ; j'ai supposé aussi que toutes les colonnes à « corriger » ont un nom d'entête finissant par "_AMT" :

SELL_PRIC_1_AMT ; PURCH_PRIC_1_AMT ; SELL_PRIC_2_AMT ; PURCH_PRIC_2_AMT ...

d'où le test suivant : If Right$(Cells(1, 1 + j), 4) = "_AMT" Then

à toi d'adapter ce qui est en rouge clair selon ton cas réel ; par exemple, si la ligne d'entêtes est la ligne n° 3 et si la 1ère colonne est E, le test doit être : If Right$(Cells(3, 5 + j), 4) = "_AMT" Then

si besoin, n'hésite pas à demander une autre adaptation.

dhany

Salut dahny,

Je vois l'idée, c'est pas mal pour restreindre l'impact de la modification de se baser sur les entêtes !

J'essaierai d'implémenter ça quand j'aurai un peu de temps et une vision plus globale des cas potentiellement problématiques (autres que les _AMT). En attendant j'ai le résultat attendu et ça marche bien !

Tu as une idée de pourquoi ça se passait comme ça lors de la copie ?

Merci à toi,

Ziip

Bonsoir Ziip,

Tu a écrit :

Tu as une idée de pourquoi ça se passait comme ça lors de la copie ?

Je crois que tu veux parler (et je te cite), de ton workflow actuel : «

* les données sont récupérées du serveur sous la forme 1591,29 (virgule)

* elles sont écrites telles quelles dans le classeur mais excel supprime la virgule et convertit le tout en nombre

»

J'm'y connais pas en serveurs et réseaux, mais ça vient p't'être d'un paramétrage DDE (Dynamic Data Exchange)

ou d'un paramétrage OLE (Object Linking and Embedding) ; et je pencherais plutôt pour DDE que pour OLE.


Tu peux aussi essayer de voir ce que donne ce paramétrage Excel :

screen

Tu as aussi ce code VBA pour vérifier les 2 séparateurs d'Excel :

Sub Essai()
  With Application
    MsgBox .DecimalSeparator & " (" & .ThousandsSeparator & ")"
  End With
End Sub

Sur mon PC, ça affiche une virgule, et entre les 2 parenthèses, un seul espace (ce sont mes séparateurs système Windows).

Si ça affiche la même chose sur ton PC, la vérité est ailleurs : ton problème est peut-être dans X-Files ? demande au spécialiste

des affaires non classées : il s'appelle Fox Mulder.

dhany

Bonjour Ziip,

Lis d'abord mon précédent message du 9 mai à 21:56 : https://forum.excel-pratique.com/viewtopic.php?p=648801#p648801

Ensuite, en complément, lis cet autre lien : https://forum.excel-pratique.com/viewtopic.php?p=649093#p649093

dhany

Super ! Merci beaucoup pour ton temps et toutes ces infos très claires

Je vais regarder du côté DDE voir ce que ça peut donner, mais je reste un peu sceptique du fait que la variable que je demande d'écrire dans le tableau (voir la MsgBox de mon premier post) est bien alimentée avec une virgule à chaque fois.

Merci encore pour ton aide dhany ! Je passe le sujet en résolu

Je viens de lire ton message ; merci pour ton retour, et pour avoir passé le sujet en résolu !

Je te souhaite bonne chance pour la suite de ton projet !

dhany

Bonjour Ziip,

Je te retourne ton fichier modifié :

8exemple.zip (25.37 Ko)

À propos du format des 2 cellules B11 et B18 :

a) au départ, c'était : mm:ss,056:09,7

b) avec un format Standard, on voit le même nombre dans les 2 cellules : 43224,789, mais si on regarde dans la barre de formule, on voit le nombre entier, avec toutes les décimales, et c'est différent : respectivement 43224,7890014352 et 43224,7890016204

b) j'ai mis ce format : aaaa-mm-jj-hh.mm.ss,0002018-05-04-18.56.09,724 et 2018-05-04-18.56.09,740

J'ai seulement changé le format des 2 cellules B11 et B18, rien de plus !


D'autre part, note que les 2 cellules A8 et A14 ont un format Standard et pas aaaa-mm-jj-hh.mm.ss,000

➯ ça explique les différences entre les valeurs rouges des colonnes A et B.

Le format Standard de A8 et A14 y était déjà : je l'ai pas mis à la place d'un autre ➯ c'est pareil sur ton fichier original.


J'ai fait une recherche de NumberFormat dans tout ton projet VBA ; y'en a pas : "Texte introuvable"

➯ on peut être sûr que c'est pas ton code VBA qui modifie le format


J'espère que toutes ces infos t'aideront à résoudre ton problème.

dhany

Petit update pour ceux qu'une potentielle solution pour des problèmes de formats lors de l'alimentation de cellules en macro intéresse :

  • J'ai forcé le format des cellules cibles en texte juste avant la copie avec :
  • Alimentation des cellules cibles :
  • Puis j'ai trouvé que le fait de "convertir" (via le menu Excel Données --> Convertir) sans spécifier de séparateur conserve le contenu de la cellule mais adapte son format en fonction de la donnée : attention on ne peut normalement effectuer cette opération que sur une colonne à la fois !

Mes tableaux de résultats sont donc alimentés et immédiatement convertis case par case et le format s'adapte tout seul que le contenu de la cellule soit une date ou un montant

En espérant que ça puisse aider du monde !

Ziip

Rechercher des sujets similaires à "virgule disparaissant lors alimentation via macro"