problème format cellule

problème format cellule - VB/VBA/VBS - Programmation

Marsh Posté le 04-02-2013 à 10:23:30    

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 :)
 

Reply

Marsh Posté le 04-02-2013 à 10:23:30   

Reply

Marsh Posté le 04-02-2013 à 12:36:51    

 
              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 …
               

Reply

Marsh Posté le 04-02-2013 à 12:49:24    

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

Reply

Marsh Posté le 04-02-2013 à 12:57:53    

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
Reply

Marsh Posté le 04-02-2013 à 13:09:43    

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
Reply

Marsh Posté le 04-02-2013 à 13:38:12    

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

Reply

Marsh Posté le 04-02-2013 à 14:21:25    

 
              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 ?
 

Reply

Marsh Posté le 04-02-2013 à 14:24:53    

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)

Reply

Marsh Posté le 04-02-2013 à 14:28:40    

 
              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 …
 

Reply

Marsh Posté le 04-02-2013 à 14:29:17    

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

Reply

Marsh Posté le 04-02-2013 à 14:29:17   

Reply

Marsh Posté le 04-02-2013 à 14:31:15    

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

Reply

Marsh Posté le 04-02-2013 à 14:33:13    

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...

Reply

Marsh Posté le 04-02-2013 à 15:01:54    

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
Reply

Marsh Posté le 04-02-2013 à 15:05:02    

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

Reply

Marsh Posté le 04-02-2013 à 15:07:49    

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

Reply

Marsh Posté le 04-02-2013 à 15:18:00    

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

Reply

Marsh Posté le 04-02-2013 à 15:22:38    

oui :)

Reply

Marsh Posté le 04-02-2013 à 15:28:40    

je n'ai rien pour le debug print

Reply

Marsh Posté le 04-02-2013 à 15:45:11    

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
Reply

Marsh Posté le 04-02-2013 à 15:47:02    

sh_kyra a écrit :

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


 
??

Reply

Marsh Posté le 04-02-2013 à 15:51:55    

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
Reply

Marsh Posté le 04-02-2013 à 15:56:25    

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

Reply

Marsh Posté le 04-02-2013 à 15:57:58    

minimoack a écrit :

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


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

Reply

Marsh Posté le 04-02-2013 à 15:58:30    

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

Reply

Marsh Posté le 04-02-2013 à 15:59:31    

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

Reply

Marsh Posté le 04-02-2013 à 16:36:26    

 
           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 …
 

Reply

Marsh Posté le 04-02-2013 à 16:39:09    

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?...

Reply

Marsh Posté le 04-02-2013 à 16:50:32    

 
         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
Reply

Marsh Posté le 04-02-2013 à 16:57:53    

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

Reply

Marsh Posté le 04-02-2013 à 17:04:54    

 
           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)
 

Reply

Marsh Posté le 05-02-2013 à 09:10:31    

excel 2002

Reply

Marsh Posté le 05-02-2013 à 09:31:53    

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

Reply

Marsh Posté le 05-02-2013 à 09:55:07    

 
           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
Reply

Marsh Posté le 05-02-2013 à 10:51:29    

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

Reply

Marsh Posté le 05-02-2013 à 10:57:46    

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

Reply

Marsh Posté le 05-02-2013 à 11:05:07    

 
           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
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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