Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1525 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  problème format cellule

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

problème format cellule

n°2173965
minimoack
Posté le 04-02-2013 à 10:23:30  profilanswer
 

Bonjour,
 
C'est un peu compliqué, donc désolée si c'est mal expliqué et n'hésitez pas à poser des questions, je vais essayer de faire au mieux.
 
J'ai :  
 - un fichier excel : Classeur1.xls
 - un fichier csv : Top50.csv
 
dans mon Classeur1, j'ai une macro qui me permet d'ouvrir (après sélection du fichier) Top50.csv.
 
Lorqu'on ouvre Top50.csv normalement, les données sont séparées dans des colonnes distinctes.
Lorsque je l'ouvre à l'aide de Classeur1.xls, les données sont séparées par des ";", et non triées dans des colonnes.
 
Mais là n'est pas le problème. J'ai enregistré une macro pour remettre ces données dans des colonnes, et elle fonctionne habituellement (elle marche avec d'autres fichiers csv).
 
Mais dans Top50.csv, il y a une valeur qui est sous format numérique au lieu de texte :  
c'est 1 930 000 000 000 000, qui apparait sous la forme de 1,93E+15
 
Cette valeur devrait être "1930000000000000" sous format texte, et non sous format numérique... Du coup, lorsque je convertis les données afin de les trier dans des colonnes, il me supprime une grosse partie de la ligne qui contient cette donnée, et remplace 1,93E+15 par 1...
 
Je ne vois pas vraiment ce que je peux faire...  
Voici le code pour mettre les données en colonne :  

Code :
  1. Columns("A:A" ).Select
  2.     Selection.TextToColumns Destination:=Range("A1" ), DataType:=xlDelimited, _
  3.         TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
  4.         Semicolon:=True, Comma:=False, Space:=False, Other:=False, FieldInfo _
  5.         :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
  6.         Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1)), _
  7.         TrailingMinusNumbers:=True


 
 :jap:  merci à ceux qui me répondront :)
 

mood
Publicité
Posté le 04-02-2013 à 10:23:30  profilanswer
 

n°2173982
Marc L
Posté le 04-02-2013 à 12:36:51  profilanswer
 

 
              Bonjour !   Normalement il est possible d'ouvrir directement un .csv sans devoir passer par .TextToColumns,
                              voir l'aide de Workbooks.Open ou via l'enregistreur de macros en ouvrant manuellement le fichier …
 
              Si cela ne résoud pas ton problème, il faudra envisager soit de faire modifier le .csv source,
              soit de mettre la colonne en texte au lieu de numérique, soit de programmer autre chose …
               

n°2173986
minimoack
Posté le 04-02-2013 à 12:49:24  profilanswer
 

Tout d'abord merci de m'avoir répondu :)
 
En fait, Classeur permet à l'utilisateur de sélectionner le fichier csv qu'il veut ouvrir grace à une macro dans le workbook_Open. le but est d'ouvrir un fichier qui automatise l'enregistrement d'un fichier csv en xls. Donc j'ai une fonction qui permet à l'utilisateur de choisir le fichier à ouvrir

n°2173990
minimoack
Posté le 04-02-2013 à 12:57:53  profilanswer
 

pour télécharger les 2 fichiers : http://www.terafiles.net/v-186014.html
 
En fait, ce n'est pas toujours le même fichier qui est ouvert, donc l'utilisateur doit pouvoir choisir celui qu'il veut.


Message édité par minimoack le 04-02-2013 à 13:17:10
n°2173993
minimoack
Posté le 04-02-2013 à 13:09:43  profilanswer
 

Le problème est à la ligne 9 de TOP50TP.csv
Le programme principal est dans le ThisWorkbook (Workbook_Open() )
Les fonctions sont dans le module


Message édité par minimoack le 04-02-2013 à 13:36:28
n°2173996
minimoack
Posté le 04-02-2013 à 13:38:12  profilanswer
 

J'ai essayé ça, mais ça ne marche pas ...  

Code :
  1. ActiveSheet.UsedRange.Select
  2. For Each Cell In Selection
  3.         If Cell.Value <> "" Then
  4.             If Cell.Value Like "*E+*" Then
  5.                 Cell.Select
  6.                 Selection.NumberFormat = "0"
  7.                 Selection.NumberFormat = "@"
  8.                 Exit For
  9.             End If
  10.         Else
  11.             Exit For
  12.         End If
  13. 'On passe à la cellule suivante
  14. Next Cell

n°2174003
Marc L
Posté le 04-02-2013 à 14:21:25  profilanswer
 

 
              Pour transformer manuellement la cellule 1,93E+15 en 1930000000000000,
              il suffit juste d'insérer comme premier caractère ' (l'apostrophe) …
 
              Y-en-a beaucoup des comme cela ?
 

n°2174005
minimoack
Posté le 04-02-2013 à 14:24:53  profilanswer
 

Ben en fait, on m'a donné deux rapport de ce type, et il n'y a qu'une seule erreur de ce type.
Mais le truc, c'est que je dois transformer la cellule avant de trier en colonne... donc comment faire pour retrouver l'occurrence? parce que le code que j'ai marqué ci-dessus ne fonctionne pas, donc il chercher mais ne trouve pas l'occurrence (vu qu'il ne me met pas d'erreur)

n°2174006
Marc L
Posté le 04-02-2013 à 14:28:40  profilanswer
 

 
              Une solution serait de faire une recherche sur "E+", non ?   (voir Find)
 
              Sinon je regarde 2 possibilités pour un "contrôle" dès l'ouverture, à suivre …
 

n°2174007
minimoack
Posté le 04-02-2013 à 14:29:17  profilanswer
 

si je ne modifie pas la cellule avant de modifier la mise en page (mettre en colonne), il me supprime une grosse partie de la ligne, comme vous pouvez le voir grâce à l'url du fichier.zip

mood
Publicité
Posté le 04-02-2013 à 14:29:17  profilanswer
 

n°2174008
minimoack
Posté le 04-02-2013 à 14:31:15  profilanswer
 

j'ai mis en commentaire la modification de la mise en page pour que vous puissiez voir la tête du fichier quand ma macro l'ouvre. Vous pouvez enlevez ces commentaires dans la fonction separerColonne dans le module

n°2174009
minimoack
Posté le 04-02-2013 à 14:33:13  profilanswer
 

Ben la recherche sur le E+, je l'ai faite avec un LIKE
 

Code :
  1. If Cell.Value Like "*E+*" Then


 
mais comme vous pouvez le voir, ma cellule est scindée : le 1 est dans la cellule A9, et le reste dans B9...

n°2174016
sh_kyra
Entre nous c'est Kyra
Posté le 04-02-2013 à 15:01:54  profilanswer
 

Salut, j'ai pas accès à ton fichier (proxytaf) donc je ne pourrai t'aider de manière complète que ce soir.

 

En attendant, si tu n'utilises pas .Find, tu peux utiliser:

 

VBA.InStr(Start [l'index auquel tu commences à chercher la valeur], String1 [la chaîne dans laquelle tu cherches], String 2 [la chaîne que tu cherches dans ton String 1])

 
Code :
  1. If InStr(1, Cell.Value, "E+" ) > 0 Then 'si la valeur est présente dans ta chaîne tu rentreras dans ton If
 

Par contre pour Like, si je ne m'abuse, ça ne prend pas en compte les *.


Message édité par sh_kyra le 04-02-2013 à 15:02:38
n°2174017
minimoack
Posté le 04-02-2013 à 15:05:02  profilanswer
 

non je viens d'essayer, mais il ne me trouve pas ma valeur...

n°2174018
sh_kyra
Entre nous c'est Kyra
Posté le 04-02-2013 à 15:07:49  profilanswer
 

Si tu fais un Debug.Print de Cell.Value avant ton If il t'affiche bien la bonne valeur de la bonne cellule?

n°2174019
Marc L
Posté le 04-02-2013 à 15:18:00  profilanswer
 

 
              J'ai presque fini ...   Cette histoire de format ne peut se trouver que dans la 3ème colonne ou pas ?
 

n°2174020
minimoack
Posté le 04-02-2013 à 15:22:38  profilanswer
 

oui :)

n°2174021
minimoack
Posté le 04-02-2013 à 15:28:40  profilanswer
 

je n'ai rien pour le debug print

n°2174022
sh_kyra
Entre nous c'est Kyra
Posté le 04-02-2013 à 15:45:11  profilanswer
 

Tu as la fenêtre Immediate? (en VO)

 

Sinon CTRL+G pour l'afficher depuis l'éditeur, ça te permet de tester des lignes de codes et d'afficher le résultat des debug.print

Message cité 1 fois
Message édité par sh_kyra le 04-02-2013 à 15:46:10
n°2174023
minimoack
Posté le 04-02-2013 à 15:47:02  profilanswer
 

sh_kyra a écrit :

Tu as la fenêtre Immediate? (en VO)


 
??

n°2174024
sh_kyra
Entre nous c'est Kyra
Posté le 04-02-2013 à 15:51:55  profilanswer
 

Fais CTRL+G depuis l'éditeur VBA, si tu l'as pas d'ouverte ça va l'ouvrir, si elle est ouverte ça t’amèneras dedans.

 

Mets dedans

 

Toto = "lalala"
Debug.Print Toto

 

C'est très pratique pour tester des trucs!


Message édité par sh_kyra le 04-02-2013 à 15:52:35
n°2174026
minimoack
Posté le 04-02-2013 à 15:56:25  profilanswer
 

ça marche mieux mais c'est pas encore ça :)

n°2174027
sh_kyra
Entre nous c'est Kyra
Posté le 04-02-2013 à 15:57:58  profilanswer
 

minimoack a écrit :

ça marche mieux mais c'est pas encore ça :)


 
Qu'est ce qui pose encore problème là?

n°2174028
minimoack
Posté le 04-02-2013 à 15:58:30  profilanswer
 

il me met ça dans le ctrl+G :  
I;QRH;1;"93E+15;0.01;0.00701"
 
alors que ça devrait être :  
I;QRH;1,93E+15;0.01;0.00701

n°2174029
minimoack
Posté le 04-02-2013 à 15:59:31  profilanswer
 

du coup, il me sépare le 1 du 93E+15, alors que c'est une seule valeur. Valeur qui soit dit en passant, devra être sous format texte : 1930000000000000

n°2174034
Marc L
Posté le 04-02-2013 à 16:36:26  profilanswer
 

 
           Voici l'une des 2 solutions :
 

Code :
  1. Sub ConvertCSV()
  2.     N = FreeFile
  3.     Open "D:\Tests\TOP50TP.CSV" For Input As #N
  4.     F = Split(Input(LOF(N), #N), vbCrLf)
  5.     Close #N
  6.     NL = UBound(F)
  7.     ReDim T(NL, 0)
  8.     For L = 0 To NL
  9.         C = Split(F(L), ";" )
  10.        NC = UBound(C)
  11.         If NC > -1 Then
  12.             If UBound(T, 2) < NC Then ReDim Preserve T(NL, NC)
  13.             For N = 0 To NC
  14.                 T(L, N) = C(N)
  15.             Next N
  16.         End If
  17.     Next L
  18.     Range([A1], Cells(NL + 1, UBound(T, 2) + 1)) = T
  19.     For L = 1 To NL + 1
  20.         With Cells(L, 3)
  21.             N = InStr(.Value, "E+" )
  22.             If N Then N = Val(Mid(.Value, N + 2))
  23.             If N Then
  24.                      .Formula = Str(.Formula)
  25.                      .Formula = "'" & .Formula
  26.                 .NumberFormat = "General"
  27.             End If
  28.         End With
  29.     Next L
  30. End Sub


           Il y a juste à adapter la ligne n°3 pour l'ouverture du fichier …
 

n°2174037
minimoack
Posté le 04-02-2013 à 16:39:09  profilanswer
 

Je suis désolée, mais je ne comprends rien à ton code ... :D
Pourrais-tu me le détailler un peu? qu'est-ce que le split? #N? à quoi correspondent tes variables?...

n°2174039
Marc L
Posté le 04-02-2013 à 16:50:32  profilanswer
 

 
         Ce code fonctionne bien chez moi avec le fichier test ‼     En dehors de Split, je n'ai utilisé que le B-A-BA du BASIC …

 

         Là je suis occupé, commencer par regarder l'aide VBA de Split, Open for, etc …  débroussaillerait les interrogations.

 

         Ensuite s'il reste des zones d'ombres, je répondrai volontiers - plus tard - aux points particuliers …


Message édité par Marc L le 04-02-2013 à 16:55:45
n°2174040
minimoack
Posté le 04-02-2013 à 16:57:53  profilanswer
 

le 1 et le 93E+15 sont toujours, séparés... mais j'ai toutes les données

n°2174042
Marc L
Posté le 04-02-2013 à 17:04:54  profilanswer
 

 
           Pas chez moi ‼   Dans mon test, je suis parti d'une feuille vierge, donc chaque cellule est en format standard …
 
           Quelle version d'Excel ?   (Moi c'est la 2003, parfois j'ai accès à une version 2007)
 

n°2174114
minimoack
Posté le 05-02-2013 à 09:10:31  profilanswer
 

excel 2002

n°2174117
sh_kyra
Entre nous c'est Kyra
Posté le 05-02-2013 à 09:31:53  profilanswer
 

C'est pas un souci de séparateur décimal?

n°2174122
Marc L
Posté le 05-02-2013 à 09:55:07  profilanswer
 

 
           De toute manière, s'il n'y a pas de message d'erreur à la compilation …
           Edit :   mon séparateur décimal dans Excel est la virgule.

 

           Ne voyant rien de spécifique à la version 2003 mais ne me rappelant plus des soucis de la version 2002,
           voici la deuxième solution :

Code :
  1. Sub ConvertSCI()
  2.     N = FreeFile
  3.     Open "D:\Tests\TOP50TP.CSV" For Input As #N
  4.     F = Split(Input(LOF(N), #N), vbCrLf)
  5.     Close #N
  6.     NL = UBound(F)
  7.     ReDim T(NL, 0)
  8.     For L = 0 To NL
  9.         C = Split(F(L), ";" )
  10.        NC = UBound(C)
  11.         If NC > -1 Then
  12.             If UBound(T, 2) < NC Then ReDim Preserve T(NL, NC)
  13.             If NC > 1 Then
  14.                 N = InStr(C(2), "E+" )
  15.                 If N > 1 Then
  16.                     V = Mid(C(2), 1, N - 1)
  17.                     N = Val(Mid(C(2), N + 2))
  18.                     If N Then
  19.                         For Each S In Split(", ." )
  20.                             D = InStr(V, S)
  21.                             If D Then
  22.                                 D = Len(V) - D
  23.                                 V = Replace(V, S, "" )
  24.                                 Exit For
  25.                             End If
  26.                         Next S
  27.                         C(2) = "'" & V & String(N - D, "0" )
  28.                     End If
  29.                 End If
  30.             End If
  31.             For N = 0 To NC
  32.                 T(L, N) = C(N)
  33.             Next N
  34.         End If
  35.     Next L
  36.     Range([A1], Cells(NL + 1, UBound(T, 2) + 1)) = T
  37. End Sub


           Comme dans la première version, il y a juste à adapter la ligne n°3 pour l'ouverture du fichier …

 

           Edit :   modification de la ligne n°19 pour blinder au cas où …


Message édité par Marc L le 05-02-2013 à 11:12:19
n°2174128
minimoack
Posté le 05-02-2013 à 10:51:29  profilanswer
 

oki merci celui là à l'air de fonctionner :) je vous tiens au courant! :D

n°2174130
minimoack
Posté le 05-02-2013 à 10:57:46  profilanswer
 

alors il marche parfaitement sur le fichier que j'ai mis en lien, je n'ai plus qu'à l'adapter pour mon vrai fichier

n°2174134
Marc L
Posté le 05-02-2013 à 11:05:07  profilanswer
 

 
           En dehors d'un souci de séparateur décimal, dans la première version la ligne n°30 force Excel
           à réinterpréter la cellule, ce qu'il fait au passage en modifiant son affichage en format scientifique.
           Peut-être que la 2002 n'est pas dotée de cette IA, vérification facile en mettant un point d'arrêt sur la ligne n°31 …
 
           Bien que le code de la deuxième version soit plus long, ce dernier est plus performant dans le cas de gros fichiers car
           c'est plus rapide de traiter en amont un tableau en mémoire que de scanner des cellules d'une feuille de calcul d'Excel !
 
           Lorsqu'il n'y a pas le choix, l'alternative plus rapide est d'utiliser la méthode Find juste sur la plage de cellules à vérifier …


Message édité par Marc L le 05-02-2013 à 11:16:51
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  problème format cellule

 

Sujets relatifs
Problème d'algorithme pour mon moteur 3DProbleme : Tableau de pointeurs sur structure
[RESOLU] Problème de version de PHP (ou ZEND) ?Export Feuille Excel en valeur avec cellule fusionnées
Problème bandeau joomlaProbleme ERREUR PDO
format de fichierProblème génération labyrinthe
Problème entre Doctype et un script[VBS] Script Language problème aide svp
Plus de sujets relatifs à : problème format cellule


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR