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 iExcel gère apparemment seul le format des cellules alimentées (les dates sont bien converties en dates, etc...).
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) :
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 iD'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.
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 :
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 SubSur 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é :
À propos du format des 2 cellules B11 et B18 :
a) au départ, c'était : mm:ss,0 ➯ 56: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,000 ➯ 2018-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