Conversion depuis .csv en prenant compte des textes

Conversion depuis .csv en prenant compte des textes - VB/VBA/VBS - Programmation

Marsh Posté le 05-10-2010 à 15:44:52    

Bonjour à tous,

 

J'ai un petit soucis de VBA avec lequel je me prend la tête depuis tout à l'heure, alors que la solution pourrait être évidente .. (comme d'hab :))

 

le voilà le problème :

 

Dans un fichier excel existant, je dois récupérer des données depuis un fichier .csv placé ailleurs dont le séparateur utilisé est le ;
sauf qu'il existe des données textes qui contiennent également un ;

 

une ligne complète pourrait par exemple être :
toto1;toto2;"toto;3";toto4

 

il faudrait que le résultat donne :
toto1            toto2             toto;3          toto4

 

Sauf que je ne trouve aucun moyen de faire comprendre au VBA que le ; de "toto;3" fait parti d'un String.

 

ce que j'obtiens c'est :
toto1            toto2             "toto             3"             toto4

 

On peut sans doute utiliser les guillements comme identificateur de texte, mais je ne vois pas où l'ajouter, voici mon code de lecture du fichier (l'ouverture se passe sans pb):

 

Sub test(ByVal NomFichier As String)
Dim Chaine As String
Dim Ar() As String
Dim i As Long
Dim iRow As Long, iCol As Long
Dim NumFichier As Integer
Dim Separateur  As String * 1
 
    '  Séparateur Point Virgule
    Separateur = ";"
     
    Cells.Clear
    Application.ScreenUpdating = False
    NumFichier = FreeFile
    iRow = 1
     
    Open NomFichier For Input As #NumFichier
        Do While Not EOF(NumFichier)
            iCol = 1
            Line Input #NumFichier, Chaine
           
            Ar = Split(Chaine, Separateur)
                 
            For i = LBound(Ar) To UBound(Ar)
                     
                Cells(iRow, iCol) = Ar(i)
                iCol = iCol + 1
            Next
             
           iRow = iRow + 1
        Loop
    Close #NumFichier
     
    Application.ScreenUpdating = True
End Sub

 

Merci d'avance :hello:


Message édité par tingslayer le 07-10-2010 à 11:59:18
Reply

Marsh Posté le 05-10-2010 à 15:44:52   

Reply

Marsh Posté le 05-10-2010 à 17:42:59    

Salut, passe par l'enregistreur de macro et  
Fichier Ouvrir etc .....
ce qui te donnera qqch comme


    Workbooks.OpenText Filename:="C:\Transfert\CSV.txt", Origin:=xlMSDOS, _
        StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
        ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=True, Comma:=False _
        , Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1), _
        Array(3, 1), Array(4, 1)), TrailingMinusNumbers:=True


 
La macro que tu utilises est utile quand on veut par exemple modifier des données à la volée lors d'un import
 
Voire même tout bêtement


Workbooks.Open Filename:="C:\Transfert\CSV.csv", Local:=True


Message édité par kiki29 le 05-10-2010 à 22:31:30
Reply

Marsh Posté le 05-10-2010 à 17:48:12    

Merci, je test demain :)

Reply

Marsh Posté le 06-10-2010 à 11:31:56    

Pourquoi toujours vouloir faire du code quand Excel le permet en meme pas 1mn...?
 
Sous excel 2007 il y a la fonction "Convertir" de l'onglet Données (Sous 2003 Menu Données, Convertir)
 
Tu sélectionnes ta cellule où tu as :
toto1;toto2;"toto;3";toto4  
 
Onglet ou menu Données ; Convertir ; Délimité-Suivant ; Séparateur : point virgule - identificateur de texte : " - Suivant ; Destination : tu selectionnes ou tu veux le resultat - Terminer
 
On se retrouve bien avec :
toto1            toto2             toto;3          toto4
 
Et si vraiment tu veux coder :  

Code :
  1. Selection.TextToColumns Destination:=Range("A2" ), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Semicolon:=True


Message édité par SuppotDeSaTante le 06-10-2010 à 11:37:29

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 06-10-2010 à 11:48:43    

@ Kiki29: J'ai du louper un truc, mais quand on ouvre de cette manière, ça ouvre un nouveau fichier excel non ?

 

Le but de la manoeuvre est de lire le fichier csv, sans le modifier d'aucune manière :)

 

@dje69r : Je dois intégrer la sub de lecture du fichier dans une macro auto_open :)

 

crois-moi, si je pouvais, j'utiliserai l'enregistreur de macro tout le temps :D


Message édité par tingslayer le 06-10-2010 à 11:50:58
Reply

Marsh Posté le 07-10-2010 à 10:14:04    

Non mais c'est pareil. Tu ouvres ton fichier, ok, et tu n'as qu'une ligne de code pour transposer tes chaines.
 
J'avais pas vu la réponse de Kiki29 en fait, mais c'est exactement la meme chose.
 
En fait ca ouvre ton fichier CSV et ca te le traite pour avoir le résultat que tu demandes.
Ensuite soit tu l'enregistres, et a ce moment tu perds l'original, soit tu l'enregistres sous un autre nom et tu as un nouveau fichier Excel formaté selon ta demande.


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 07-10-2010 à 11:29:48    

Justement, j'ai besoin de faire l'opération de lecture et de traitement sur un fichier qui existe déjà, donc il n'est pas question d'en rouvrir un autre puis de le sauvegarder quelque part ... :)

 

Je me suis sans doute pas exprimé correctement dans le premier post, je corrige !


Message édité par tingslayer le 07-10-2010 à 11:58:33
Reply

Marsh Posté le 19-10-2010 à 20:06:29    

tingslayer
il me semble que j'ai du traiter un fichier csv aussi (j'ai pas le script ici).
Ma démarche en VBA était :
- ouvrir un fichier toto.csv dans excel en lecture seul => chaque cellule de la feuille A du classeur toto.csv contient donc les bonnes élémentq (toto1/toto2/toto;3/toto4 )
- récuperer les info cellules qui m'intéressent de la feuille A
- fermer le classeur toto.csv => le contenu toto.csv ne sera jamais changé


Message édité par mortelrdv le 19-10-2010 à 20:09:11
Reply

Sujets relatifs:

Leave a Replay

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