Récupérer les valeurs d'un csv et changer le format au vol

Récupérer les valeurs d'un csv et changer le format au vol - VB/VBA/VBS - Programmation

Marsh Posté le 25-01-2021 à 08:39:02    

Bonjour,
 
Je cherche à faire une moulinette pour envoyer des valeurs d'un logiciel à un autre via la manipulation de fichiers csv et xls.
 
dans le fichier d'origine (csv), je récupère "entre autre" les valeurs suivantes :
 
D7V:HR00000.01
D7V:HR00000.00
D7V:HR00104.13
D7V:HR00104.14
D7V:HR00000.02
D7V:HR00001.05
 
 
que je j'éclate pour avoir les valeurs numériques dans une cellule à part.
 
seulement, dans le fichier de destination (xls), les cellules doivent être au format texte afin d'être correctement récupérés par le logiciel final.
 
donc une fois que j'ai collé mes valeurs dans les cellules de destination "format texte", elle apparaissent comme ci-dessous :
 
00000.01
00000.00
00104.13
00104.14
00000.02
00001.05
 
J'aurai besoin de supprimer tous les zéros en têtes afin d'avoir un format par défaut en x.xx surtout pour les valeurs comme 0.00 ou 1.00.
 
j'ai essayer de manipuler les formats mais n'arrive pas à l'écriture voulu à la fin "x.xx au format texte"
 
voici mon bout de code ;-).
 
Merci pour votre aide.
 
Valery
 

Code :
  1. Sub Récupération_Colonnes()
  2. Dim sH As Worksheet
  3. Dim Derligne As Long, i As Long
  4. Dim tmp
  5.     Application.ScreenUpdating = False
  6.     Set sH = Worksheets("csv" )
  7.    
  8.     Columns("F:F" ).Select
  9.     Selection.NumberFormat = "0.00"
  10.    
  11.     With sH
  12.         Derligne = .Range("A" & Rows.Count).End(xlUp).Row
  13.         For i = 3 To Derligne
  14.             tmp = Split(.Cells(i, 1), ":" )
  15.            
  16.             Worksheets("Feuil1" ).Cells(3 + i, 5) = Left(tmp(1), 2)
  17.             Worksheets("Feuil1" ).Cells(3 + i, 6) = Right(tmp(1), Len(tmp(1)) - 2)
  18.             Worksheets("Feuil1" ).Cells(3 + i, 11) = .Cells(i, 17)
  19.         Next
  20.     End With
  21.     Set sH = Nothing
  22.    
  23.     Columns("F:F" ).Select
  24.     Selection.NumberFormat = "@"
  25. End Sub


---------------
Il y a deux choses d'infini au monde : l'univers et la bêtise humaine... mais pour l'univers j'en suis pas très sûr
Reply

Marsh Posté le 25-01-2021 à 08:39:02   

Reply

Marsh Posté le 25-01-2021 à 10:40:18    

Bonjour,
 
Ce code n'agit pas sur le contenu de la colonne F.
Il éclate les valeurs de la colonne A et place le résultat sur la feuille Feuil1
 
Que contient la colonne F ???
Où voudrais-tu le résultat x.xx au format texte ?
 
Notes que le fait de changer le format d'une cellule ne modifie pas son contenu :  
- si c'est du texte quand on applique le format numérique "0.00", ça reste du texte !  
- si c'est un nombre quand on applique le format texte "@", ça reste un nombre !
Pour modifier le contenu d'une cellule, il faut agir sur sa valeur.
 
Pour un code plus rapide, j'utiliserais des tableaux :

Code :
  1. Sub Récupération_Colonnes()
  2. Dim i As Long
  3. Dim t, e, f, k
  4.   ' Remplir les tableaux de données
  5.   With Worksheets("csv" )
  6.     e = .Range("A3", .Cells(.Rows.Count, "A" ).End(xlUp)).Value
  7.     ReDim f(1 To UBound(e), 1 To 1)
  8.     k = .Range("A3", .Cells(.Rows.Count, "A" ).End(xlUp)).Offset(0, 16).Value
  9.   End With
  10.   ' Traiter les données
  11.   For i = 1 To UBound(e)
  12.     t = Split(e(i, 1), ":" )
  13.     f(i, 1) = Right(t(1), Len(t(1)) - 2)
  14.     e(i, 1) = Left(t(1), 2)
  15.   Next
  16.   ' Mettre en place les données
  17.   With Worksheets("Feuil1" )
  18.     .Range("E6" ).Resize(UBound(e)).Value = e
  19.     .Range("F6" ).Resize(UBound(f)).Value = f
  20.     .Range("K6" ).Resize(UBound(k)).Value = k
  21.   End With
  22. End Sub

Message cité 1 fois
Message édité par patrice33740 le 25-01-2021 à 11:16:26

---------------
Cordialement, Patrice
Reply

Marsh Posté le 25-01-2021 à 13:18:04    

Bonjour Patrice
 
 

patrice33740 a écrit :


Ce code n'agit pas sur le contenu de la colonne F.


mauvaise interprétation de ma part, je pensais que de cette façon, je forçais excel à interpréter les valeurs différemment....
 

patrice33740 a écrit :


Que contient la colonne F ???
Où voudrais-tu le résultat x.xx au format texte ?


à la fin de l’exécution de la macro, la colonne F (de la feuille 1) doit contenir les valeurs de la colonne A (de la feuille csv) après manipulation, soit :
 
D7V:HR00000.01
D7V:HR00000.00
D7V:HR00104.13
D7V:HR00104.14
D7V:HR00000.02
D7V:HR00001.05
 
donc au format x.xx
 

patrice33740 a écrit :


Pour un code plus rapide, j'utiliserais des tableaux :

Code :
  1. Sub Récupération_Colonnes()
  2. Dim i As Long
  3. Dim t, e, f, k
  4.   ........



Merci pour ton code, je l'ai copié dans mon projet.
ne maitrisant pas très bien les tableaux je ne le comprend pas aussi bien que ce que j'avais fais, mais je tacherais de me pencher dessus ;-).
 
 
Je suis désolé, je pensais avoir correctement décrit ma problématique, j’espère avoir été suffisament claire cette fois-ci  :D  
 
Merci à toi!!!  :jap:  


---------------
Il y a deux choses d'infini au monde : l'univers et la bêtise humaine... mais pour l'univers j'en suis pas très sûr
Reply

Marsh Posté le 25-01-2021 à 20:02:09    

Je ne comprend pas ...
Tu veux donc en F de la feuille 1 la même chose qu'en A de la feuille csv ...
A quoi sert le format par défaut en x.xx  ????
Pourquoi faire :

Code :
  1. Worksheets("Feuil1" ).Cells(3 + i, 6) = Right(tmp(1), Len(tmp(1)) - 2)


au lieu de faire simplement :

Code :
  1. Worksheets("Feuil1" ).Cells(3 + i, 6) = .Cells(i, 1)


 
Dans mon code, au lieu de
    f(i, 1) = Right(t(1), Len(t(1)) - 2)
il faudrait alors :
    f(i, 1) = e(1, 1)
 
 
Tout ça n'est vraiment pas clair !!!!


Message édité par patrice33740 le 25-01-2021 à 20:52:47

---------------
Cordialement, Patrice
Reply

Marsh Posté le 26-01-2021 à 07:49:45    

Bonjour patrice,
 
- Je veux avoir en F ce qui est en gars  :pt1cable:  
 
D7V:HR00000.01
D7V:HR00000.00
D7V:HR00104.13
D7V:HR00104.14
D7V:HR00000.02
D7V:HR00001.05
 
- Je ne veux aussi que: 0.00 ne soit pas réduit en 0   :hello:  
 
- Et pour finir, je veux que la colonne soit au format texte (sant que ça ne modifie l'écriture de 0.00 en 0)
   par ce que le logiciel à qui j'envoie le fichier xls final me l'impose..... :whistle:
 
voila :D


Message édité par valerypetit le 26-01-2021 à 07:57:41

---------------
Il y a deux choses d'infini au monde : l'univers et la bêtise humaine... mais pour l'univers j'en suis pas très sûr
Reply

Marsh Posté le 26-01-2021 à 11:38:35    

Je ne comprend pas, c'est exactement ce que fait la modification proposée !
Tu obtiens en F :
D7V:HR00000.01
D7V:HR00000.00
D7V:HR00104.13
D7V:HR00104.14
D7V:HR00000.02
D7V:HR00001.05  
 
Avec ce code :

Code :
  1. Sub Récupération_Colonnes()
  2. Dim i As Long
  3. Dim t, e, f, k
  4.   ' Remplir les tableaux de données
  5.   With Worksheets("csv" )
  6.     e = .Range("A3", .Cells(.Rows.Count, "A" ).End(xlUp)).Value
  7.     ReDim f(1 To UBound(e), 1 To 1)
  8.     k = .Range("A3", .Cells(.Rows.Count, "A" ).End(xlUp)).Offset(0, 16).Value
  9.   End With
  10.   ' Traiter les données
  11.   For i = 1 To UBound(e)
  12.     t = Split(e(i, 1), ":" )
  13.     f(i, 1) = e(i, 1)
  14.     e(i, 1) = Left(t(1), 2)
  15.   Next
  16.   ' Mettre en place les données
  17.   With Worksheets("Feuil1" )
  18.     .Range("E6" ).Resize(UBound(e)).Value = e
  19.     .Range("F6" ).Resize(UBound(f)).Value = f
  20.     .Range("K6" ).Resize(UBound(k)).Value = k
  21.   End With
  22. End Sub


 
En lisant entre les lignes, peut-être qu'en F tu voudrais obtenir, au format texte :
0,01
0,00
104,13
104,14
0,02
1,05
mais tu ne l'as jamais demandé clairement !
Avec ce code :

Code :
  1. Sub Récupération_Colonnes()
  2. Dim i As Long
  3. Dim t, e, f, k
  4.   ' Remplir les tableaux de données
  5.   With Worksheets("csv" )
  6.     e = .Range("A3", .Cells(.Rows.Count, "A" ).End(xlUp)).Value
  7.     ReDim f(1 To UBound(e), 1 To 1)
  8.     k = .Range("A3", .Cells(.Rows.Count, "A" ).End(xlUp)).Offset(0, 16).Value
  9.   End With
  10.   ' Traiter les données
  11.   For i = 1 To UBound(e)
  12.     t = Split(e(i, 1), ":" )
  13.     f(i, 1) = Format(Val(Mid(t(1), 3)), "0.00" )
  14.     e(i, 1) = Left(t(1), 2)
  15.   Next
  16.   ' Mettre en place les données
  17.   With Worksheets("Feuil1" )
  18.     .Range("E6" ).Resize(UBound(e)).Value = e
  19.     .Range("F6" ).Resize(UBound(f)).Value = f
  20.     .Range("K6" ).Resize(UBound(k)).Value = k
  21.   End With
  22. End Sub

Message cité 1 fois
Message édité par patrice33740 le 26-01-2021 à 11:44:26

---------------
Cordialement, Patrice
Reply

Marsh Posté le 26-01-2021 à 12:31:27    

patrice33740 a écrit :

En lisant entre les lignes, peut-être qu'en F tu voudrais obtenir, au format texte :
0,01
0,00
104,13
104,14
0,02
1,05


 
Mais si, c'est ce que je m'entête à demander depuis le début.....  :sweat:  
 
Par contre je voudrais un point à la place de la virgule  :D, mais du coup, ça a peut être un rapport avec les paramètres régionaux?

Message cité 1 fois
Message édité par valerypetit le 26-01-2021 à 13:10:07

---------------
Il y a deux choses d'infini au monde : l'univers et la bêtise humaine... mais pour l'univers j'en suis pas très sûr
Reply

Marsh Posté le 26-01-2021 à 15:12:19    

valerypetit a écrit :

Mais si, c'est ce que je m'entête à demander depuis le début.....


Relis tes demandes, malgré ma demande de précision, tu n'a jamais écris qu'en colonne F tu voulais :
0.01
0.00
104.13
104.14
0.02
1.05  
Tu aurais eu la bonne réponse dès le début !
(Sinon à mauvaise question, mauvaise réponse)
 

valerypetit a écrit :

Par contre je voudrais un point à la place de la virgule


Voici donc le code :

Code :
  1. Sub Récupération_Colonnes()
  2. Dim i As Long
  3. Dim t, e, f, k
  4.   ' Remplir les tableaux de données
  5.   With Worksheets("csv" )
  6.     e = .Range("A3", .Cells(.Rows.Count, "A" ).End(xlUp)).Value
  7.     ReDim f(1 To UBound(e), 1 To 1)
  8.     k = .Range("A3", .Cells(.Rows.Count, "A" ).End(xlUp)).Offset(0, 16).Value
  9.   End With
  10.   ' Traiter les données
  11.   For i = 1 To UBound(e)
  12.     t = Split(e(i, 1), ":" )
  13.     f(i, 1) = Replace(Format(Val(Mid(t(1), 3)), "0.00" ), ",", "." )
  14.     e(i, 1) = Left(t(1), 2)
  15.   Next
  16.   ' Mettre en place les données
  17.   With Worksheets("Feuil1" )
  18.     .Cells.Clear
  19.     .Range("E6" ).Resize(UBound(e)).Value = e
  20.     With .Range("F6" ).Resize(UBound(f))
  21.       .NumberFormat = "@"
  22.       .Value = f
  23.     End With
  24.     .Range("K6" ).Resize(UBound(k)).Value = k
  25.   End With
  26. End Sub


Message édité par patrice33740 le 26-01-2021 à 15:17:16

---------------
Cordialement, Patrice
Reply

Marsh Posté le 26-01-2021 à 15:48:00    

Je ne suis pas tout à fait d'accord avec toi, mais vu que tu m'apporte la solution, je ne t'en tiendrais pas rigueur.  :D  
En plus, j'ai tendance à répéter que l'important n'est pas ce que l'on dis, mais ce que les autres comprennent  :whistle:  
 

Code :
  1. donc une fois que j'ai collé mes valeurs dans les cellules de destination "format texte", elle apparaissent comme ci-dessous :
  2. 00000.01
  3. 00000.00
  4. 00104.13
  5. 00104.14
  6. 00000.02
  7. 00001.05
  8. J'aurai besoin de supprimer tous les zéros en têtes afin d'avoir un format par défaut en x.xx surtout pour les valeurs comme 0.00 ou 1.00.
  9. j'ai essayer de manipuler les formats mais n'arrive pas à l'écriture voulu à la fin "x.xx au format texte"


Dans tous les cas, je te remercie beaucoup pour ton aide  :jap:

Message cité 1 fois
Message édité par valerypetit le 26-01-2021 à 15:52:38

---------------
Il y a deux choses d'infini au monde : l'univers et la bêtise humaine... mais pour l'univers j'en suis pas très sûr
Reply

Marsh Posté le 26-01-2021 à 18:44:43    

valerypetit a écrit :

En plus, j'ai tendance à répéter que l'important n'est pas ce que l'on dis, mais ce que les autres comprennent  :whistle:


Comment veux-tu qu'on comprenne que c'est dans la colonne F de la feuil1 si tu ne le précises pas ?
Ceci n'apparaît nulle part
00000.01
00000.00
00104.13
00104.14
00000.02
00001.05
Ton code modifies le format de la colonne F de la feuille csv
et il écrit autre chose en F de feuil1.
On se demande donc si c'est F de la feuille csv qui contient ça.
Parler de ce format ne fait qu'embrouiller le problème.
 
Comme ce n'était pas clair je demande des précisions
 
Et tu répond :
à la fin de l’exécution de la macro, la colonne F (de la feuille 1) doit contenir les valeurs de la colonne A (de la feuille csv) après manipulation, soit :
D7V:HR00000.01
D7V:HR00000.00
D7V:HR00104.13
D7V:HR00104.14
D7V:HR00000.02
D7V:HR00001.05
donc au format x.xx  
 
Et tu répètes les mêmes valeurs au post suivant !
 
Comme tu dis l'important c'est ce que les autres comprennent.
 
Pour cela il faut être clair, net et précis, et écrire simplement :
- Je veux avoir en F :  
0.01
0.00
104.13
104.14
0.02
1.05  
 
CQFD


Message édité par patrice33740 le 26-01-2021 à 18:54:08

---------------
Cordialement, Patrice
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed