Extraire données d'un CSV par vba excel [Résolu]

Tradman

XLDnaute Nouveau
Bonjour à tous,

Je voudrais simplement extraire des données d'un fichier .csv sans ouvrir ce dernier en excel car il contient plus de 1,5 millions de ligne.

J'ai déjà trouvé une partie de code que j'ai tenté d'adapter mais comme je ne suis pas super habile avec les recordset, j'ai du mal à comprende ce qui bug dans mon extraction.

Comme info de base, je souligne que mes champs sont délimité par des virgules dans mon .csv et qu'il est possible et même fort probable d'avoir des champs vide.

Voici le bout de code que j'ai un peu adapté

Private Sub cbExecuter_Click()

'Définir les variables
Dim Cn As ADODB.Connection
Dim strFichier, strFeuille, strSQL, strDossier As String
Dim intTest As Integer
Dim rsDonnees As ADODB.Recordset
Dim wbFichier As Workbook
Dim wsDonnees As Worksheet
Dim rgDonnees As Range

Set wbFichier = ActiveWorkbook
Set wsDonnees = wbFichier.Sheets("Données")
Set rgDonnees = wsDonnees.Range("A1")

wbFichier.Activate
wsDonnees.Cells.Clear

strDossier = "D:\Test\"
strFichier = "Test.csv"

Set Cn = New ADODB.Connection
Cn = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=" & strDossier & ";Extended properties=""text;HDR=Yes;FMT=Delimited(,)"";Persist Security Info=False"
Cn.ConnectionTimeout = 40
Cn.Open

strSQL = "Select * from " & strFichier

Set rsDonnees = New ADODB.Recordset
rsDonnees.ActiveConnection = Cn
rsDonnees.Source = strSQL
rsDonnees.Open

i = 2
If rsDonnees.EOF <> True Then
While rsDonnees.EOF = False
strSupport = rsDonnees.Fields(3).Value
i = i + 1
rsDonnees.MoveNext
Wend
End If
rsDonnees.Close
Set rsDonnees = Nothing
Cn.Close
Set Cn = Nothing

End Sub

Présentement, quand j'exécute ce fichier, il me renvoit l'erreur #3265 Impossible de trouver l'objet dans la collection correspondant au nom ou à la référence ordinale demandé pour la ligne strSupport = rsDonnees.Fields(3).Value

MErci beaucoup de votre aide afin de me rendre meilleur pour jouer avec les recordsets dans vba !!!!!

Tradman
 
Dernière édition:
G

Guest

Guest
Re : Extraire données d'un CSV par vba excel

Bonjour,

1- remplacer FMT=Delimited(,) par FMT=Delimited( ; ) si le séparateur de champ est le ;
2- vérifier que le fichier existe bien

Sinon joindre un classeur avec la macro et un bout du csv.

A+
 
Dernière modification par un modérateur:

Tradman

XLDnaute Nouveau
Re : Extraire données d'un CSV par vba excel

Comme mentionner, dans mon message, le séparateur de champs est bien la virgule et mon fichier existe !

Voici mon classeur

Merci de ton aide
 

Pièces jointes

  • Test.xlsm
    26.5 KB · Affichages: 116
  • Test.xlsm
    26.5 KB · Affichages: 117
  • Test.xlsm
    26.5 KB · Affichages: 122

Tradman

XLDnaute Nouveau
Re : Extraire données d'un CSV par vba excel

Malheureusement, je n'arrive pas à transféré un fichier épuré et les règles de confidentialité m'interdise de transmettre même une partie du fichier sans enlever certaine données ;(

Avec le type d'erreur qu'il me donnait je penchais pour une erreur de Library qui n'était pas la bonne. Est-ce possible ?

Pourtant lors de la saisie du code, il place la majuscule automatiquement comme quand VBA reconnait la commande.

Je tente de toujours trouver un moyen pour le .csv

Merci de ton aide
 
G

Guest

Guest
Re : Extraire données d'un CSV par vba excel

Re,

Je viens de tenter avec un fichier csv délimté par la virgule et ta macro: problème..... même en créant un schema.ini de description du fichier.
Le séparateur (virgule) est identique au séparateur décimal.
Sauf à modifier ce dernier dans le systeme, cela ne fonctionnera pas. Alors tu as tout interêt à ouvrir ton fichier avec une méthode traditionnelle de lecture des fichiers textes, de splitter chaque ligne etc...

Ce sera même peut-être plus rapide qu'avec ADO
Code:
Sub lireFichier()
Dim fso, fichier
Dim tblLigne
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set fichier = fso.OpenTextFile("C:..\...\test.csv", 1)
  While Not fichier.AtEndOfStream
     
     tblLigne = Split(fichier.readLine, ",")
     'Analyse éventuelle de la ligne
     If tblLigne(5) <> "FRANCE" Then
     Cells(Rows.Count, 1).End(xlUp)(2).Resize(, UBound(tblLigne)).Value = tblLigne
     End If
  Wend
  fichier.Close
End Sub

A+
 
Dernière modification par un modérateur:

Tradman

XLDnaute Nouveau
Re : Extraire données d'un CSV par vba excel

Bonjour Hasco,

Est-ce que je peux abuser encore de ta bonté ?
(Je n'ai pas encore testé ta méthode mais j'ai entièrement confiance pour que ca fontionne)

Je ne suis pas du genre à simplement copier du code sans le comprendre, donc j'aimerais être sur de comprendre les étapes de ton code de façons à pouvoir le réutiliser ultérieurement !

Donc
Set fso = CreateObjet ("Scripting.FileSystemObject") Création d'un objet pour acceuillir le fichier Text ?
set fichier = fso_OpentextFile("C:...", 1) Pour lui dire que l'on ouvre un seul fichier text et lui donner le nom du fichier.

La condition de la boucle c'est bien pour lui dire tant que tu n'Est pas à la fin du fichier Text ?

tblLigne = split(fichier.readline, ",") C'est pour diviser la ligne en champs à toute les virgules

Puis ton if c'est simplement une suggestion, je peux faire ce que je veux avec la variable tblLigne
Mais je dois avouer que je ne suis pas très bine la commande dans ton if

Merci encore beaucoup !!!

Tradman
 
G

Guest

Guest
Re : Extraire données d'un CSV par vba excel

Re,

Oui tu as tout bon;)
tu peux faire tout ce que tu veux avec tblLigne dont le premier index est 0 (zéro)
Dans l'exemple j'avais ouvert un fichier de Pays le sixième Champ était le nom du pays
IF tblLigne(5) <>"FRANCE" Then 'Si le nom du pays n'est pas FRANCE
'je traite les informations de tblLigne
End If
Mais ce n'était qu'un exemple pour la forme.:D
A+
 

Tradman

XLDnaute Nouveau
Re : Extraire données d'un CSV par vba excel

Dernière chose,

J'imagine que ça me prend une library spécifique, car présentement je n'ai rien qui est reconnu comme mot clé par vba.

Donc j'ai surement pas la bonne library d'activé.

Merci encore
 

Tradman

XLDnaute Nouveau
Re : Extraire données d'un CSV par vba excel

Oups, Mon erreur !!!

Comme anticipé le tout fonctionne à merveille !!!!!

Merci beaucoup, maintenant que je sais comment récupérer toutes mes données, il ne me reste qu'à les traiter !!!
J'espère pas avoir besoin de ton aide !!!

Bonne journée

Tradman
 

Tradman

XLDnaute Nouveau
Re : Extraire données d'un CSV par vba excel [Résolu]

Rebonjour Hasco,

Je viens de faire rouler mon programme jusqu'au bout et mon VBA ne reconnait pas l'action .AtEndOfStream.
Ce qui a pour effet de faire continuer mon programme et de le faire planter.

Dans le même ordre d'idée, quand je tente de définir les variables de façons plus précise j'ai un problème.
dim fso as FileSystemObject et dim fichier as teststream ne sont pas reconnu comme type non plus.


Est-ce que tu as une idée du pourquoi ? Je n'ai pas modifier la mécanique de lecture, j'ai pris tel quel ton code, sauf le if évidement.

Merci encore beaucoup !!!

Je cherche les raisons également de mon bord

Tradman
 
Dernière édition:
G

Guest

Guest
Re : Extraire données d'un CSV par vba excel

Bonjour,

Je ne vois pas pourquoi?! Faut-il chercher du côté de ta configuration système?
Dans ton avant dernier post tu disais que tout fonctionnait. Que c'est-il passé depuis?

[Edition] il ne faut pas déclarer tes variables autrement qu'en object ou variant (sans type précis)
Dim fso as object
ou
Dim fso
Dim Fichier as object
ou
dim Fichier

Et créer l'objet fso avec createObject() 'en liaison tardive
Set fso = CreateObject("Scripting.FileSystemObject")
Set fichier = fso_OpenTextFile("C:..\...\test.csv", 1)

Ce qui t'affranchit de cocher la bonne référence( qui peut évoluer avec les systèmes et ou versions).
createObject créera l'objet avec la bonne bibliothèque

Sinon coche la référence à Microsoft scripting runtime


A+
 
Dernière modification par un modérateur:

Tradman

XLDnaute Nouveau
Re : Extraire données d'un CSV par vba excel

Bonjour Hasco,

Pour ce qui c'est passé, c'est que je plaçais une condition de sortie après un certain nombre d'enregistrement car c'était trop long à rouler pour tester. Or quand j'ai tester avec un fichier complet (Je dois boucler pour en lire 5) l'erreur est apparue.

En cochant la référence à Microsoft scripting runtime les mots clé sont effectivement reconnu !

Par contre, j'obtient tout de même une erreur d'exécution '9' me disant que l'objet n'appartient pas à ma sélection.
En fait, c'est comme si la fin de mon fichier ne serait pas à la fin de ma dernière ligne et que j'avais des lignes vides à la fin.
Car avec un fichier tronqué, je lis l'ensemble des données mais c'est comme s'il ne reconnaissait pas la fin du fichier avec la dernière ligne. Donc il cause une erreur car j'ai des variables qui ne font plus partie de ma ligne

Voici l'extrait de mon code et ou pointe l'erreur

Dim fso As Object
Dim fichier As Object
Dim tblLigne
Dim intTest As Integer

Application.ScreenUpdating = False

Set fso = CreateObject("Scripting.FileSystemObject")
Set fichier = fso_OpenTextFile("D:\...\Test.csv", 1)
intTest = 0

While Not fichier.AtEndOfStream

tblLigne = Split(fichier.readLine, ",")

If intTest = 0 Then
intTest = 1
Else
strSupport = tblLigne(3)
If tblLigne(17) = Empty Then
intLigne1 = 0
Else
intLigne1 = CInt(tblLigne(17))
End If
Wend

fichier.Close

J'ai une erreur à la ligne strSupport = tblLigne(3) qui me dit que l'indice n'appartient pas à la sélection.

Est-ce que tu as une idée pour régler ce problème ?

Merci encore énormément pour ton aide

Tradman
 
G

Guest

Guest
Re : Extraire données d'un CSV par vba excel

Re,

Oui tu dois avoir des lignes vides.

Solution: tester tblLigne:
les index du tableau commencent à 0
s'il n'y a rien dans le tableau, ubound renvoie -1
s'il y a quelquechose ubound renvoie le nombre d'éléments -1

Code:
tblligne = Split(fichier.readLine, ",")
        If UBound(tblligne) > -1 And UBound(tbligne) = 16 Then
            If intTest = 0 Then
                intTest = 1
            Else
                strSupport = tblligne(3)
                If tblligne(17) = Empty Then
                    intLigne1 = 0
                Else
                    intLigne1 = CInt(tblligne(17))
                End If
            End If
        End If
    End If

P.S.: si tu as référencé Scripting runtime, pas l'a peine d'utiliser CreateObject, c'est soit l'un soit l'autre, c'est le mélange des deux qui te perd.

Avec Scripting runtime:
Code:
Dim fso As New FileSystemObject
    Dim fichier As TextStream
    set fichier=fso.OpenTextfile('......')

P.S. 2 il est toujours préférable de nettoyer ses variables objet en fin de procédure
set Fichier = nothing
set fso = nothing

P.S. 3 utilise l'éditeur avancé des posts du forum pour publier tes codes avec les boutons idoine de la barre d'outils.

A+
 
Dernière modification par un modérateur:

Discussions similaires

Statistiques des forums

Discussions
312 104
Messages
2 085 345
Membres
102 868
dernier inscrit
JJV