Extraire que certaines données d'un fichier csv

Extraire que certaines données d'un fichier csv - VB/VBA/VBS - Programmation

Marsh Posté le 24-04-2009 à 10:07:38    

Bonjour je Forum,  
 
J'ai pu grâce au forum trouver comment extraire des infos d'un fichier csv, ça marche nikel mais sa reste pour moi un vrai charabiat du coup je n'arrive pas à adapter le code afin de n'extraire que certaine colonne.  
Mon fichier csv contient en effet une trentaine de colonnes mais j'ai besoin de récupérer que 4 colonnes donc je trouve dommage de perdre du temps a tout récupérer pour ensuite supprimer ou inutiliser les 3/4 des données récupérées surtout que el nombre de ligne peut êtr important.
 
Je vous montre en effet le code que j'utilise pour être mais données si quelqu'un peut me dire ou et comment l'adapter pour choisir mes colonnes à extraire.
 
[quote]
kiki29 Posté le 16-07-2007 à 15:22:40    
 
Option Explicit  
 
Sub Csv()  
Dim Fichier As Variant  
    ChDir ThisWorkbook.Path  
    Fichier = Application.GetOpenFilename("Fichier CSV (*.csv), *.csv" )  
    If Fichier <> False Then  
        LireCSV Fichier  
    End If  
End Sub  
 
Private Sub LireCSV(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  
 
    Separateur = ";"  
    Cells.Clear  
    Application.ScreenUpdating = False  
    NumFichier = FreeFile  
 
    iRow = 0  
 
    Open NomFichier For Input As #NumFichier  
    Do While Not EOF(NumFichier)  
        iCol = 1  
        iRow = iRow + 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 i  
    Loop  
    Close #NumFichier  
    Application.ScreenUpdating = True  
 
End Sub  
 
Merci d'avance ;p
 
 

Reply

Marsh Posté le 24-04-2009 à 10:07:38   

Reply

Marsh Posté le 24-04-2009 à 11:31:41    

Dans le programme, la variable, qui s'appelle iCol, contient le numéro de la colonne en cours de traitement. Pour ne prendre que les quatre premières colonnes, il suffit de tester si cette variable devient supérieure à quatre. Voici la nouvelle version du programme qui ne contient qu'une seule ligne de plus que l'ancienne :

Option Explicit  
   
Sub Csv()  
Dim Fichier As Variant  
    ChDir ThisWorkbook.Path  
    Fichier = Application.GetOpenFilename("Fichier CSV (*.csv), *.csv" )  
    If Fichier <> False Then  
        LireCSV Fichier  
    End If  
End Sub  
   
Private Sub LireCSV(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  
   
    Separateur = ";"  
    Cells.Clear  
    Application.ScreenUpdating = False  
    NumFichier = FreeFile  
   
    iRow = 0  
   
    Open NomFichier For Input As #NumFichier  
    Do While Not EOF(NumFichier)  
        iCol = 1  
        iRow = iRow + 1  
        Line Input #NumFichier, Chaine  
        Ar = Split(Chaine, Separateur)  
        For i = LBound(Ar) To UBound(Ar)
            Cells(iRow, iCol) = Ar(i)  
            iCol = iCol + 1  
            If (iCol > 4) Then Exit For
        Next i  
    Loop  
    Close #NumFichier  
    Application.ScreenUpdating = True  
   
End Sub  

Reply

Marsh Posté le 24-04-2009 à 11:37:33    

Le problème est que je ne veux pas extraire uniquement les 4 premières colonnes mais quelques colonnes du genre A,B,C, AG,AL,AR.
Et je voudrais appliquer ce code à un autre fichier ou les colonnes ne seraient encore pas les mêmes.  
 
Ce que je n'arrive pas à faire est justement de pouvoir piocher chercher certaine colonne.

Reply

Marsh Posté le 24-04-2009 à 12:41:42    

Tout d'abord, il faudrait faire une petite conversion manuelle de la lettre de la colonne en un numéro de colonne.
A = 1, B = 2, C = 3, AG = 26 + 7 = 33, AL = 26 + 12 = 38, AR = 26 + 18 = 44.
Puis, il faut changer la partie centrale du code comme ceci :

       For i = LBound(Ar) To UBound(Ar)  
           If (i = 1 Or i = 2 Or i = 3 _
               Or i = 33 Or i = 38 Or i = 44) Then
             Cells(iRow, iCol) = Ar(i)
              iCol = iCol + 1    
           End If
        Next i  

(Le trait de soulignement après "= 3" sert à indiquer que la ligne se prolonge sur la ligne d'en dessous)

Reply

Marsh Posté le 24-04-2009 à 14:44:16    

Super grand merci ça marche presque, j'ai plus qu'à comprendre pourquoi il me récupère pas exactement les colonnes que je lui demande mais je doit plus être très loin :p
 
Voila, solution trouvée il fallait commencer à compter de 0, un peu de bidouillage et j'ai trouvé ma solution.  
J'aurais bien avancé aujourd'hui merci de l'aide j'ai plus qu'à l'appliquer sur un autre fichier.
 
Du coup faut que j'adapte le code pour qu'en fonction du nom du fichier choisi ou de l'intitulé de la première colonne il n'extrait pas les mêmes cellules, sa devrait pas être de tout repos mais on va fouiner ça.


Message édité par Fouinette85 le 24-04-2009 à 14:57:10
Reply

Marsh Posté le 05-05-2009 à 11:16:34    

Bonjour,  
 
le code à un peu changé depuis le temps mais je n'arrive pas à "coller" les données receuillies à partir du fichier csv sur ma feuille "reception_donnees" située dans un autre fichier (nommé gestion de stock) et pourtant ma fonction s'exécute sans problème.  
Si quelqu'un peut me dire comment puis-je récupérer les données que je parcours sa serais bien sympas.  
 

Code :
  1. Public Sub LireCSV(ByVal Chemin As String, col1 As Integer, col2 As Integer, col3 As Integer, col4 As Integer, col5 As Integer)
  2. Dim Chaine As String
  3. Dim Ar() As String
  4. Dim i As Long
  5. Dim iRow As Long, iCol As Long
  6. Dim NumFichier As Integer
  7. Dim Separateur As String * 1
  8.     Sheets("reception_donnees" ).Activate
  9.     Separateur = ";"
  10.     Cells.Clear
  11.     Application.ScreenUpdating = False
  12.     NumFichier = FreeFile
  13.  
  14.     iRow = 0
  15.     Open Chemin For Input As #NumFichier
  16.     Do While Not EOF(NumFichier)
  17.         iCol = 1
  18.         iRow = iRow + 1
  19.         Line Input #NumFichier, Chaine
  20.         Ar = Split(Chaine, Separateur)
  21.      
  22.        For i = LBound(Ar) To UBound(Ar)
  23.            If (i = col1 Or i = col2 Or i = col3 Or i = col4 Or i = col5) Then
  24.              Cells(iRow, iCol) = Ar(i)
  25.               iCol = iCol + 1
  26.            End If
  27.         Next i
  28.        
  29.     Loop
  30.     Close #NumFichier
  31.     Application.ScreenUpdating = True
  32.     MsgBox "Le fichier à bien été importé !", vbInformation, "Importation de données"
  33.  
  34. End Sub

Reply

Marsh Posté le 07-05-2009 à 23:04:18    

Salut,
le code donné ,à priori , ne lira jamais la 1ere colonne
il faut remplacer i par i+1
sinon si le classeur s'appelle Stocks.xls et est ouvert


    Windows("Stocks.xls" ).Activate
    Sheets("reception_donnees" ).Cells.Clear
 .....
 
        For i = LBound(Ar) To UBound(Ar)
            If (i + 1 = col1 Or i + 1 = col2 Or i + 1 = col3 Or i + 1 = col4 Or i + 1 = col5) Then
                Sheets("reception_donnees" ).Cells(iRow, iCol) = Ar(i)
  .....

Reply

Marsh Posté le 08-05-2009 à 07:16:06    

Bonjour,
n'y aurait-il pas un lien avec:
http://forum.hardware.fr/forum2.ph [...] w=0&nojs=0
??
j'y précise que "line input" ne peut lire ton csv parce qu'à la génération du fichier, il n'y a que des chr(10) comme délimiteurs au lieu de chr(13)+chr(10) attendu. Par contre la séquence que j'ai placée fonctionne. Si tu veux des précisions pour l'intégrer, n'hésite pas à demander.
Cordialement

Reply

Marsh Posté le 11-05-2009 à 09:17:56    

J'ai réussi à résoudre mon problème à l'aide des 2 forums merci bien :p

Reply

Sujets relatifs:

Leave a Replay

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